Вопрос или проблема
На высоком уровне я создаю команду форматирования на VBA, например,
“ActiveDocument.Words(intWordPointerL).Font.Italic = True”
Затем я хочу выполнить эту команду.
Сначала казалось, что “Eval” или “Application.Run” могут быть решением, но у меня не получилось заставить их работать.
Похоже, что они ищут существующие ссылки на функции/подпрограммы, а не произвольные строки.
Мне нужно что-то похожее на команду PowerShell Invoke-Expression.
Чтобы упростить, я работаю с основной командой, предварительно сформированной,
“ActiveDocument.Words(intWordPointerL).Font.”
Затем добавляю один из различных квалификаторов, например, “Italic = True”.
Пробовал использовать “Eval”.
Пробовал использовать Application.Run.
Обе требуют ссылки на существующий макрос.
Если я не могу вызвать команду напрямую, могу ли я создать макрос на лету и затем вызвать его?
Я нашел этот ответ на аналогичный вопрос относительно Excel,
https://stackoverflow.com/questions/36595499/vba-execute-string-as-command-in-excel
(Извините, пытался опубликовать код здесь, но постоянно получал ошибку о правильном формате)
Если это работает в Excel, это, вероятно, можно адаптировать для работы в Word.
Я не силен в VBA.
Не понимаю, как адаптировать этот код, ориентированный на Excel, для использования в MS-Word.
Ответ или решение
В VBA для Microsoft Word нет прямого аналога PowerShell Invoke-Expression
, который позволил бы выполнить строку как команду. Тем не менее, можно использовать обходные пути для достижения подобного эффекта. Рассмотрим, как можно реализовать вашу задачу.
Способ 1: Использование свойства и метода
Если вы заранее знаете, какое свойство или метод вы хотите установить, вы можете использовать стандартные конструкции VBA. Например, для установки шрифта курсивом на определенное слово можно сделать так:
Dim intWordPointerL As Integer
intWordPointerL = 1 ' Укажите индекс слова, который вы хотите изменить
With ActiveDocument.Words(intWordPointerL).Font
.Italic = True
End With
Способ 2: Создание макроса в рантайме
Если вы хотите выполнять динамические команды, то лучший способ — это создавать макросы в коде. Вот как это можно сделать:
- Создайте макрос в строке и сохраните его в модуле.
- Затем выполните созданный макрос.
Вот пример кода:
Sub ExecuteDynamicCommand(command As String)
Dim macroName As String
macroName = "TempMacro" ' Имя временного макроса
' Создание временного макроса
Dim moduleCode As String
moduleCode = "Sub " & macroName & "()" & vbCrLf & _
command & vbCrLf & _
"End Sub"
' Добавление кода в модуль
ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.AddFromString moduleCode
' Выполнение временного макроса
Application.Run macroName
' Удаление временного макроса если необходимо
ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.DeleteLines _
ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.CountOfLines - 2, 3
End Sub
Вызов функции можно произвести так:
Dim intWordPointerL As Integer
intWordPointerL = 1 ' Укажите индекс слова, которое хотите изменить
ExecuteDynamicCommand "ActiveDocument.Words(" & intWordPointerL & ").Font.Italic = True"
Обратите внимание:
- Для доступа к
VBProject.VBComponents
может потребоваться включить настройку "Доступ к объектной модели проекта VBA" в параметрах безопасности. - Убедитесь, что у вас включены макросы, иначе ваш код не будет выполняться.
Заключение
Создание макросов на лету и выполнение их в VBA Word — это хороший способ управлять динамическими командами. Хотя это может показаться более сложным по сравнению с языками, такими как PowerShell, но такой подход открывает довольно много возможностей для автоматизации в Word.