<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; WSH: преобразуем макрос VBA в скрипт VBScript]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=5805</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5805&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «WSH: преобразуем макрос VBA в скрипт VBScript».]]></description>
		<lastBuildDate>Mon, 16 May 2011 03:48:21 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[WSH: преобразуем макрос VBA в скрипт VBScript]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=48402#p48402</link>
			<description><![CDATA[<p>При автоматизации Microsoft Office средствами Windows Script Host довольно часто бывает проще записать макрос непосредственно в самом приложении Microsoft Office, а затем перенести текст полученного макроса Visual Basic for Apllication в скрипт Windows Script Host. Как правильно осуществить этот перенос?</p><p><em>Далее упоминания об использовании обычного скрипта *.vbs обозначены как <strong>VBS</strong>, об использовании формата скрипта *.wsf (<a href="http://forum.script-coding.com/viewtopic.php?id=1149">WSH: пишем сценарии в формате WSF</a>) — как <strong>WSF</strong>.</em></p><br /><p><strong>1. Константы</strong></p><p>При переносе констант Microsoft Office в скрипт Windows Script Host нужно помнить следующее:</p><p><strong>VBS</strong>: нужно вручную описать все используемые константы посредством ключевого слова <strong>Const</strong>.<br /><strong>WSF</strong>: достаточно добавить тэг <strong><a href="http://forum.script-coding.com/viewtopic.php?id=1149">reference</a></strong>, либо же использовать методику, изложенную в предыдущем пункте.</p><p><strong>2. Оператор «:=», именованные и необязательные аргументы</strong></p><p>Оператор «:=» присваивания значения некоторому параметру метода (используемый в макросах VBA для сокращения записи, когда задаются значения не всех параметров, либо параметры перечисляются в порядке, отличающемся от заданного прототипом) в <strong>Windows Script Host</strong> не поддерживается, поскольку <strong>Windows Script Host</strong> не поддерживает именованные аргументы, а только позиционные. Посему требуется убрать наименования аргументов (вместе с оператором «:=») и расставить аргументы в правильную позицию, так, как это описано в объектной модели того или иного метода или события. В большинстве случаев при работе с приложениями Microsoft Office необязательные аргументы допускается просто пропускать.</p><p><strong>3. Глобальные объекты, раннее и позднее связывание</strong></p><p>В глобальном контексте приложения <strong>Microsoft Office</strong> обычно наличествуют один или более глобальных объектов, таких, как объект Apllication целевого приложения, объекты CommandBars, FileDialog, Scripts (и т.д.) объектной модели самого <strong>Microsoft Office</strong>, объект UserForms объектной модели Visual Basic for Apllication. Ссылки на библиотеки, реализующие поддержку этих объектов изначально присутствуют в свойствах проекта VBA (<strong>\Tools\References…</strong>). В отличие от VBA, поддерживающего как раннее, так и позднее связывание, Windows Script Host поддерживает только позднее связывание при создании объектов. Исходя из вышеизложенного, надо помнить, что любой глобальный объект <strong>Microsoft Office</strong> требует явного предварительного создания перед использованием, как правило, завершения работы приложения методом «.Quit()» и очистки объектной переменной путём присвоения ей значения <strong>Nothing</strong>.</p><p><strong>VBS</strong>:<br /></p><div class="codebox"><pre><code>Set &lt;Var&gt; = WScript.CreateObject(&quot;&lt;ProgID&gt;&quot;)
…
&lt;Var&gt;.Quit
Set &lt;Var&gt; = Nothing</code></pre></div><p><strong>WSF</strong>: объект может быть создан при помощи тэга <strong><a href="http://forum.script-coding.com/viewtopic.php?pid=8844#p8844">object</a></strong>, либо может быть использована та же методика, что и для <strong>VBS</strong>.</p><p><em><strong>Замечание:</strong> последний способ не рекомендуется использовать для <strong>Microsoft Word</strong>, ибо может возникать ситуация (при вызове скрипта *.wsf с параметром «/?», чтобы посмотреть справку скрипта), когда приложение останется в памяти после завершения работы скрипта. Особенности поведения приложений <strong>Microsoft Office</strong> при использовании технологии Automation изложены в <strong>KB288902</strong>: <a href="http://support.microsoft.com/kb/288902">GetObject and CreateObject behavior of Office automation servers</a>, в частности:<br /></p><div class="quotebox"><blockquote><p><strong>Note</strong> 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.</p></blockquote></div><p>Поэтому для <strong>Microsoft Word</strong> рекомендуется использовать методику, описанную в предыдущем пункте — непосредственное создание объекта в коде и завершение его методом «.Quit()».</em></p><p><strong>4. Обработка событий</strong></p><p>Поддержка обработки событий в <strong>Windows Script Host</strong> для объектов <strong>Microsoft Office</strong> осуществляется стандартными способами.</p><p><strong>VBS</strong>:<br /></p><div class="codebox"><pre><code>Set &lt;Var&gt; = WScript.CreateObject(&quot;&lt;ProgID&gt;&quot;, &quot;&lt;Prefix&gt;&quot;)
…
Sub &lt;Prefix&gt;&lt;Event&gt;(&lt;Argument List&gt;)
    …
End Sub</code></pre></div><p>либо же:<br /></p><div class="codebox"><pre><code>Set &lt;Var&gt; = WScript.CreateObject(&quot;&lt;ProgID&gt;&quot;)

WScript.ConnectObject &lt;Var&gt;, &quot;&lt;Prefix&gt;&quot;
…
WScript.DisconnectObject &lt;Var&gt;</code></pre></div><p><strong>WSF</strong>: можно добавить атрибут <strong><a href="http://forum.script-coding.com/viewtopic.php?pid=9591#p9591">events</a></strong> со значением «true» в тэг «object». Кроме того, поддерживается использование методики, описанной в предыдущем пункте.</p><p><em><strong>Замечание:</strong> к сожалению, большую часть событий приложений Microsoft Office обрабатывать не удаётся.</em></p><p>Автор <strong>alexii</strong></p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Mon, 16 May 2011 03:48:21 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=48402#p48402</guid>
		</item>
	</channel>
</rss>
