vba-MS Word, Как выполнить строку в качестве команды?

Вопрос или проблема

На высоком уровне я создаю команду форматирования на 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: Создание макроса в рантайме

Если вы хотите выполнять динамические команды, то лучший способ — это создавать макросы в коде. Вот как это можно сделать:

  1. Создайте макрос в строке и сохраните его в модуле.
  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"

Обратите внимание:

  1. Для доступа к VBProject.VBComponents может потребоваться включить настройку "Доступ к объектной модели проекта VBA" в параметрах безопасности.
  2. Убедитесь, что у вас включены макросы, иначе ваш код не будет выполняться.

Заключение

Создание макросов на лету и выполнение их в VBA Word — это хороший способ управлять динамическими командами. Хотя это может показаться более сложным по сравнению с языками, такими как PowerShell, но такой подход открывает довольно много возможностей для автоматизации в Word.

Оцените материал
Добавить комментарий

Капча загружается...