<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=93290&amp;view=findpost&amp;p=700718</guid>
        <pubDate>Sat, 30 Apr 2005 13:49:12 +0000</pubDate>
        <title>Оптимизация и компиляция модулей VBA</title>
        <link>https://forum.sources.ru/index.php?showtopic=93290&amp;view=findpost&amp;p=700718</link>
        <description><![CDATA[Old Bat: <span class="tag-font" data-value="Arial" style="font-family:Arial"><br>
<strong class='tag-b'>Как VBA загружает программный код</strong><br>
<br>
VBA загружает нужный код во время работы приложения. Сразу загружаются только модули, вызываемые в процессе подготовки приложения к работе. Это значит, что вместе с приложением загружаются только модули, которые нужны начальной форме или макросу Autoexec. Далее, когда приложение вызывает процедуру, хранящуюся в еще не загруженном модуле, VBA загружает этот модуль.<br>
<br>
В Office 95, загружая модуль, VBA загружал также все модули, содержащие используемый им код или переменные. Это «дерево вызовов» сильно замедляло загрузку форм. Конечно, время загрузки приложений с большим количеством кода при загрузке «по требованию» значительно уменьшается.<br>
Когда Office 95 загружал очередной объект, вместе с ним мог загружаться и ненужный код — множество глобальных модулей, код которых вызывался из модуля формы или отчета. Начиная с Office 97 дело обстоит иначе: теперь VBA загружает только тот модуль, который нужен прямо сейчас, и не тянет за ним все его связи.<br>
А вот по частям модули загружаться не могут. Если приложение обращается к переменной или процедуре из модуля, весь модуль загружается целиком. Поэтому, если вы озабочены скоростью выполнения программного кода, подумайте, нельзя ли перепланировать структуру некоторых модулей.<br>
Самый очевидный способ — сократить количество ненужного кода в каждом модуле. Чем меньше кода придется загрузить, тем быстрее откроется форма или отчет. Удаляйте из основных модулей редко используемые процедуры, группируйте их по назначению. Не забывайте, что стоит вам обратиться к одной переменной модуля, как весь модуль оказывается в памяти. Ваша цель — добиться, чтобы в память загружалось как можно меньше кода.<br>
<br>
<strong class='tag-b'>Компиляция кода</strong><br>
<br>
VBA обязательно должен откомпилировать код перед его выполнением. Если вы не дадите соответствующую команду заранее, VBA будет компилировать модули прямо перед их загрузкой. Например, если вы обратитесь к форме или отчету с неоткомпилированным модулем, VBA должен будет откомпилировать его, и только после этого приложение сможет загрузить объект. Очевидно, что загрузка в таком случае пройдет медленнее обычного.<br>
<br>
<strong class='tag-b'>Что сохраняется при компиляции кода</strong><br>
<br>
Откомпилировав ваш код, VBA сохраняет как его исходный текст, так и откомпилированную версию. Строго говоря, исходный текст хранится не совсем в том виде, в каком вы его ввели, а в виде набора лексем. Перед запуском кода VBA загружает только его откомпилированную версию — исходный текст для работы приложения не нужен. Если же код еще не откомпилирован, приложению приходится загружать его исходный текст и компилировать его.<br>
<br>
<strong class='tag-b'>Когда следует выполнять компиляцию</strong><br>
<br>
Команда Debug -&gt; Compile &lt;Имя проекта&gt; открывает и компилирует все модули приложения, включая модули форм и отчетов. При этом выполняется полная синтаксическая проверка всех модулей. Это самый быстрый способ полной компиляции приложения, и ее обязательно нужно выполнить перед передачей приложения пользователю. В отличие от предыдущих версий офиса (Office 97/2000) эта команда меню не только компилирует все модули, но и сохраняет информацию о состоянии каждого из них.<br>
После выполнения команды Debug -&gt; Compile &lt;Имя проекта&gt; у приложения имеется как исходная версия кода в виде набора лексем, так и его откомпилированный вариант. Программа отслеживает, какие модули она компилировала, не пытаясь делать это повторно перед запуском созданного приложения. Если же вы не давали такой команды, после выхода из приложения информация о том, что модули откомпилированы, будет потеряна, и перед следующим запуском VBA откомпилирует их снова. (Если со времени последней компиляции код не менялся, команда Compile &lt;Имя проекта&gt; недоступна.)<br>
</span><br>
<span class='tag-size' data-value='8' style='font-size:8pt;'><span class="tag-color tag-color-named" data-value="gray" style="color: gray">Использованы материалы: &quot;From Access 2002 Desktop Developer&#39;s Handbook&quot;<br>
Litwin, Getz, and Gunderloy. (Sybex, 2001)<br>
</span></span>]]></description>
        <author>Old Bat</author>
        <category>Оптимизация VBA-кода</category>
      </item>
	
      </channel>
      </rss>
	