Программные модули VBA состоят из процедур (одной или более).
Процедура- минимальный модуль в прикладной программы на языке VBA.
Синтаксис объявления процедуры:
Sub <имя_процедуры> (аргументы)
тело процедуры (операторы)
End Sub
Оператор Sub – зарезервированное слово - объявление процедуры, задает имя, указывает состав аргументов, передаваемых процедуре при вызове из программы. Каждому оператору Sub должен соответствовать End Sub.
Тело процедуры - набор операторов на языке VBA. В программе макроса Excel можно вызывать процедуры данного программного модуля, а также и процедуры других модулей текущей рабочей книги и процедуры других рабочих книг. Для этого нужно задать ссылки. Для этого при нахождении на рабочем листе модуля нужно выполнить команду СЕРВИС\Ссылки. Затем в диалоговом окне "Ссылки", содержащем список доступных ссылок на библиотеки или другие рабочие книги, выбрать нужную. Для установления новых ссылок используется кнопка Пролистать и затем из диалогового окна выбрать диск, каталог и файла, содержащий процедуры, на которые нужно ссылаться из данного программного модуля. Доступна процедура или нет из программного модуля или библиотеки, определяется с помощью переключателя.
Различают 4 типа процедур:
· процедуры общего назначения (стандартные);
· командные процедуры - расширяют возможности прикладных программ, выполняя новые виды обработки данных;
· процедуры обработки событий - вызываются при наступлении определенного вида событий: открытие\закрытие электронной таблицы Excel, нажатие кнопки, перемещение объекта и т.д.;
· функции пользователя - возвращают вычисленное значение, которое можно использовать по аналогии с вызовом встроенных функций VBA.
Перед вызовом процедуры необходимо установить все необходимые ссылки.
Варианты вызова процедур:
1. Из другой процедуры того же модуля - вызов осуществляется по имени процедуры, например:
Sub Рrос_А () ' вызывающая процедура Рrос_А ()
…
Рrос_В ' вызов процедуры Рrос_В()
…
End Sub ' Завершение работы процедуры Рrос_А ()
Sub Proc_B () ' вызываемая процедура
…
End Sub ' Завершение работы процедуры Proc_B ()
2. Из другой процедуры другого (подключенного) модуля того же приложения - вызов осуществляется указанием квалифицируемого имени, состоящего из имени модуля и имени процедуры, например:
3. Из другого приложения, т.е. из другой рабочей книги Excel - вызов осуществляется указанием имени модуля, имени процедуры и имени рабочей книги, например:
Sub Р_А () 'вызывающая процедура Р_А ()
…
[Otchet.XLS].[Модуль#].P_B 'вызов Р_В() модуля 'Модуль# рабочей книги Otchet.XLS
…
End Sub ' Завершение работы процедуры Рrос_А ()
Замечание.Если в нескольких рабочих книгах имеется несколько процедур с одинаковым именем, то при вызове нужно указать имя файла рабочей книги и имя модуля в этой книге.
Чтобы закрыть процедуру от внешнего программного кода других модулей (т.е. запретить доступ к ней), процедуру делают частной. Для этого в операторе объявления процедуры нужно указать:
Private Sub Proc_B ()
End Sub
Для запрета доступа к модулю рабочей книги из процедур другой рабочей книги в начале модуля указывают: Option Private Module
Если при вызове процедуре нужно передать какие-то исходные данные, то определяют список аргументов, который содержит данные для обмена с вызывающей процедурой. В теле процедуры могут быть объявлены внутренние (локальные) переменные для служебных целей. Такие переменные не видны за пределами процедуры.
Синтаксис объявления аргументов в заголовке процедуры:
Sub P_B (V1 As Single; V2 As Date;...)
Здесь видно, что через разделитель (в зависимости от настройки - запятая или точка с запятой) перечисляются аргументы с указанием имени и типа значения. Если аргумент необязательный, т.е. может не задаваться при вызове процедуры, указывается ключевое слово Optional, например процедура вычисления площади прямоугольника по двум сторонам:
Текст программы
Комментарий
Sub Square (L As Single; H As Single;
S As Single; Optional F)
- объявление процедуры Square c 4-мя аргументами
If IsMissing( F) Then F=100
- стандартная функция VBA - IsMissing проверяет есть ли аргумент; если нет, то по умолчанию F присваивается значение 100 (F имеет тип Variant)
S=L*H
- вычисление площади
End Sub
- конец процедуры
Вызов такой процедуры можно выполнить разными способами:
· 1-й вариант - непосредственное задание значений аргументов при вызове процедуры
Текст программы
Комментарий
Sub P_A() Dim Sq as Single
- вызывающая процедура
Square 12; 23; Sq
- вызов процедуры с передачей значений длин сторон прямоугольника в явном виде, результат вычисления будет присвоен переменной Sq
End Sub
- конец процедуры
· 2-й вариант - через имена переменных, которым присвоены значения:
Текст программы
Комментарий
Sub Proc_A ( )
- вызывающая процедура
Dim Sq as Single
- площадь
Dim L as Single
- длина
Dim H as Single
- высота
L=12 H=23
- присвоение значений переменным
Square L H Sq
- Вызов процедуры с передачей значений длин сторон прямоугольника в явном виде, результат вычисления присваивается переменной Sq
End Sub
- конец процедуры
· 3-й вариант - использование явного указания при вызове процедуры соответствия списка поименованных аргументов и передаваемых переменных
Текст программы
Комментарий
Sub P_A ( )
- вызывающая процедура
Dim Sq as Single
- площадь
Dim L as Single
- длина
Dim H as Single
- высота
L1=12 H1=23
- присвоение значений переменным
Square L:=L1; H:=H1; Sq
- вызов процедуры с явным указанием соответствия имен аргументов и имен передаваемых переменных
End Sub
- конец процедуры
При завершении работы вызываемой процедуры и возврате в вызывающую процедуру переменные, объявленные в вызываемой процедуре, уничтожаются. Если нужно сохранить некоторые переменные, то используется оператор:
Static <var> As <type>
При вызове процедуры передача параметров может происходить по адресу или по значению. В случае передачи адреса процедура может изменить значение аргумента, в случае передачи по значению - нет. Для блокировки изменения значения аргумента следует передача величин значением. Если необходимо запретить изменения значения переменной-параметра, нужно либо модифицировать заголовок процедуры, либо передавать аргумент в виде формулы.
Модификации заголовка процедуры выполняется указание ключевого слова By Val перед именами аргументов, которые нужно передать по значению, например:
Sub Square(By Val L As Single; By Val H As Single; S As Single)
S=L*H
L=10
H=20
End Sub
При передаче аргументов в виде формул при вызове процедуры имена переменных заключаются в круглые скобки, например:
Текст программы
Комментарий
Sub Proc_A ( )
Dim Sq as Single
Dim LL as Single
Dim HH as Single
LL=12
HH=23
SquarPr L:=(LL);H:= (HH);S:= Sq
End Sub
- вызывающая процедура
- объявление переменных
- площадь
- длина
- высота
- присвоение значений переменным
- преобразование аргумента в формулу
- конец процедуры