Модули

Весь код должен располагаться внутри модулей. В языке VBA существует несколько типов модулей:

Отобразить содержимое существующего модуля можно из окна Project Explorer. Для этого нужно сделать двойной щелчок на ярлыке модуля или щелкнуть правой кнопкой мыши на ярлыке модуля и из контекстного меню выбрать пункт View Code. Содержимое модуля будет отображено в отдельном окне;

Содержимое модулей делится на два раздела:

При отображении содержимого модуля в верхней части окна можно заметить два раскрывающихся списка. В левом списке (называется Object) содержатся доступные объекты, например, в модулях листов доступен объект Worksheet. Пользовательские модули вообще не содержат объектов. В правом списке (называется Procedure) содержатся названия подпрограмм, а, если выбрать объект из левого списка, то список с возможными процедурами обработки событий.

Изменить название модуля можно в окне Properties Window (если окно не отображается, то из меню View следует выбрать пункт Properties Window или нажать клавишу <F4>). Находим в таблице свойство Name и делаем двойной щелчок на ячейке справа от свойства. Ячейка станет доступной для редактирования.

Содержимое модуля можно сохранить в отдельном файле. Для этого в окне Project Explorer щелкаем правой кнопкой мыши на ярлыке модуля и из контекстного меню выбраем пункт Export File. В результате откроется окно в котором можно выбрать название и местоположение сохраняемого файла. Модули сохраняются в файлах с расширением bas. Чтобы загрузить модуль из файла следует в окне Project Explorer щелкнуть правой кнопкой мыши на ярлыке любого модуля и из контекстного меню выбрать пункт Import File. В открывшемся окне выбираем файл и нажимаем кнопку Открыть. В результате модуль будет загружен и его ярлык отобразится в окне Project Explorer.

Чтобы удалить модуль в окне Project Explorer щелкаем правой кнопкой мыши на ярлыке модуля и из контекстного меню выбраем пункт Remove <Название модуля>. В результате этого действия отобразится диалоговое окно в котором предлагается сохранить модуль в файл (кнопка Да), удалить без сохранения (кнопка Нет) или отказаться от удаления (кнопка Отмена).

Управление доступом к идентификаторам внутри модуля

Давайте создадим новый пользовательский модуль Module2, добавим в него объявление глобальной переменной и две подпрограммы, а затем попробуем получить доступ к идентификаторам из модуля Module1. Надеюсь вы не забыли способы создания пользовательских модулей. Если все-таки забыли, то обратитесь к предыдущему разделу. Код модуля Module2 приведен в листинге 9.23.

Листинг 9.23. Код модуля Module2

Dim x As Integer

Sub SetX(n As Integer)
   x = n
End Sub

Function GetX() As Integer
   GetX = x
End Function

Теперь попробуем получить доступ к этим идентификаторам из модуля Module1. Исходный код модуля Module1 приведен в листинге 9.24.

Листинг 9.24. Код модуля Module1

Sub Тест()       ' Запускаем эту процедуру
   SetX 10
   Debug.Print GetX()         ' 10
   Module2.SetX 55
   Debug.Print Module2.GetX() ' 55
End Sub

Итак, процедура SetX() и функция GetX() доступны внутри модуля Module1 как если бы они были определены внутри модуля Module1. Однако, если внутри модуля Module1 окажется подпрограмма с именем SetX() или GetX(), то будет вызвана подпрограмма из модуля Module1, а не подпрограмма из модуля Module2. Чтобы сделать вызов подпрограммы более предсказуемым, следует перед именем подпрограммы указать название модуля и оператор . (точка). Если попробовать получить доступ к глобальной переменной x, то возникнет ошибка и программа будет остановлена.

Управлять доступом к идентификаторам внутри модуля позволяют следующие спецификаторы:

Option Private Module

то, область видимости открытого идентификатора ограничивается текущим проектом;

Если спецификатор не указан, то:

При объявлении переменных спецификаторы Public и Private указываются вместо ключевого слова Dim:

Private x As Integer

При объявлении подпрограммы спецификаторы Public и Private указываются перед ключевыми словами Sub и Function:

Public Function GetX() As Integer
   GetX = x
End Function

Таким образом, если переписать код из листинга 9.23 и указать спецификаторы, то он будет эквивалентен следующему коду (листинг 9.25).

Листинг 9.25. Код модуля Module2

Private x As Integer

Public Sub SetX(n As Integer)
   x = n
End Sub

Public Function GetX() As Integer
   GetX = x
End Function
Предыдущая статья Все статьи Следующая статья