Тема: WSH: преобразуем макрос VBA в скрипт VBScript
При автоматизации Microsoft Office средствами Windows Script Host довольно часто бывает проще записать макрос непосредственно в самом приложении Microsoft Office, а затем перенести текст полученного макроса Visual Basic for Apllication в скрипт Windows Script Host. Как правильно осуществить этот перенос?
Далее упоминания об использовании обычного скрипта *.vbs обозначены как VBS, об использовании формата скрипта *.wsf (WSH: пишем сценарии в формате WSF) — как WSF.
1. Константы
При переносе констант Microsoft Office в скрипт Windows Script Host нужно помнить следующее:
VBS: нужно вручную описать все используемые константы посредством ключевого слова Const.
WSF: достаточно добавить тэг reference, либо же использовать методику, изложенную в предыдущем пункте.
2. Оператор «:=», именованные и необязательные аргументы
Оператор «:=» присваивания значения некоторому параметру метода (используемый в макросах VBA для сокращения записи, когда задаются значения не всех параметров, либо параметры перечисляются в порядке, отличающемся от заданного прототипом) в Windows Script Host не поддерживается, поскольку Windows Script Host не поддерживает именованные аргументы, а только позиционные. Посему требуется убрать наименования аргументов (вместе с оператором «:=») и расставить аргументы в правильную позицию, так, как это описано в объектной модели того или иного метода или события. В большинстве случаев при работе с приложениями Microsoft Office необязательные аргументы допускается просто пропускать.
3. Глобальные объекты, раннее и позднее связывание
В глобальном контексте приложения Microsoft Office обычно наличествуют один или более глобальных объектов, таких, как объект Apllication целевого приложения, объекты CommandBars, FileDialog, Scripts (и т.д.) объектной модели самого Microsoft Office, объект UserForms объектной модели Visual Basic for Apllication. Ссылки на библиотеки, реализующие поддержку этих объектов изначально присутствуют в свойствах проекта VBA (\Tools\References…). В отличие от VBA, поддерживающего как раннее, так и позднее связывание, Windows Script Host поддерживает только позднее связывание при создании объектов. Исходя из вышеизложенного, надо помнить, что любой глобальный объект Microsoft Office требует явного предварительного создания перед использованием, как правило, завершения работы приложения методом «.Quit()» и очистки объектной переменной путём присвоения ей значения Nothing.
VBS:
Set <Var> = WScript.CreateObject("<ProgID>")
…
<Var>.Quit
Set <Var> = Nothing
WSF: объект может быть создан при помощи тэга object, либо может быть использована та же методика, что и для VBS.
Замечание: последний способ не рекомендуется использовать для Microsoft Word, ибо может возникать ситуация (при вызове скрипта *.wsf с параметром «/?», чтобы посмотреть справку скрипта), когда приложение останется в памяти после завершения работы скрипта. Особенности поведения приложений Microsoft Office при использовании технологии Automation изложены в KB288902: GetObject and CreateObject behavior of Office automation servers, в частности:
Note For Word, the UserControl property is read-only. It cannot be set to True or False. Word always remains running when the last reference is released.
Поэтому для Microsoft Word рекомендуется использовать методику, описанную в предыдущем пункте — непосредственное создание объекта в коде и завершение его методом «.Quit()».
4. Обработка событий
Поддержка обработки событий в Windows Script Host для объектов Microsoft Office осуществляется стандартными способами.
VBS:
Set <Var> = WScript.CreateObject("<ProgID>", "<Prefix>")
…
Sub <Prefix><Event>(<Argument List>)
…
End Sub
либо же:
Set <Var> = WScript.CreateObject("<ProgID>")
WScript.ConnectObject <Var>, "<Prefix>"
…
WScript.DisconnectObject <Var>
WSF: можно добавить атрибут events со значением «true» в тэг «object». Кроме того, поддерживается использование методики, описанной в предыдущем пункте.
Замечание: к сожалению, большую часть событий приложений Microsoft Office обрабатывать не удаётся.