Модули

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

  • модули листов — создаются автоматически при создании листов. Предназначены для размещения кода, который обрабатывает события листа. Чтобы отобразить содержимое модуля листа следует щелкнуть правой кнопкой мыши на вкладке листа и из контекстного меню выбрать пункт Исходный текст. Кроме того, можно открыть модуль из окна Project Explorer (если окно не отображается, то из меню View следует выбрать пункт Project Explorer или нажать комбинацию клавиш <Ctrl>+<R>). Для этого нужно сделать двойной щелчок на ярлыке листа или щелкнуть правой кнопкой мыши на ярлыке и из контекстного меню выбрать пункт View Code. Содержимое модуля будет отображено в отдельном окне. Более подробно модули листов мы рассмотрим при изучении обработки событий;
  • модуль книги — создается автоматически при создании книги. Предназначен для размещения кода, который обрабатывает события книги. Отобразить содержимое модуля можно из окна Project Explorer. Для этого нужно сделать двойной щелчок на ярлыке ЭтаКнига или щелкнуть правой кнопкой мыши на ярлыке ЭтаКнига и из контекстного меню выбрать пункт View Code. Содержимое модуля будет отображено в отдельном окне. Более подробно модуль книги мы рассмотрим при изучении обработки событий;
  • пользовательские модули — предназначены для размещения общего кода программы. Создать пользовательский модуль можно несколькими способами:
  • из меню Insert выбираем пункт Module;
  • в окне Project Explorer щелкаем правой кнопкой мыши на ярлыке любого листа (или на свободном месте) и из контекстного меню выбраем пункт Insert | Module;
  • нажимаем кнопку Insert | Module на панели инструментов Standard.

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

  • модули форм — предназначены для размещения кода, обрабатывающего события пользовательских форм. Более подробно модули форм мы рассмотрим при изучении создания пользовательских форм;
  • модули классов — предназначены для размещения кода пользовательских классов. Более подробно модули классов мы рассмотрим при изучении классов в следующей главе.

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

  • раздел Declarations — расположен в самом начале модуля. В этом разделе объявляются глобальные переменные и константы, а также указываются различные опции, например, с помощью инструкции Option Base задается начальный индекс для массивов;
  • раздел с описанием подпрограмм — содержит описания процедур, функций и свойств.

При отображении содержимого модуля в верхней части окна можно заметить два раскрывающихся списка. В левом списке (называется 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, то возникнет ошибка и программа будет остановлена.

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

  • Public — указывает, что идентификатор является открытым. Открытый идентификатор доступен для всех процедур текущего проекта, а также для процедур других проектов. Если в начале пользовательского модуля указана инструкция
Option Private Module

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

  • Private — указывает, что идентификатор является закрытым. Закрытый идентификатор доступен только внутри модуля, в котором он объявлен.

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

  • глобальные переменные являются закрытыми;
  • подпрограммы являются открытыми.

При объявлении переменных спецификаторы 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

Visual Basic for Applications (VBA)
Статьи по Visual Basic for Applications (VBA)

Помощь сайту

Yandex-деньги: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов