Способ передачи параметров процедуре или функции определяется при описании ее аргументов. Описатель ByVal задает передачу по значению, а ByRef – по ссылке. Если явное указание способа передачи параметра отсутствует, то по умолчанию подразумевается передача по ссылке.
Поясним сказанное на примере. Допустим, имеются следующие описания двух процедур:
Sub Main()
a = 10
b = 20
c = 30
Call Example1(a, b, c)
Call MsgBox(a)
Call MsgBox(b)
Call MsgBox(c)
End Sub
Sub Example1(x, ByVal y, ByRef z)
x = x + 1
y = y + 1
z = z + 1
Call MsgBox(x)
Call MsgBox(y)
Call MsgBox(z)
End Sub
Вспомогательная процедура Example1 использует в качестве формальных аргументов три переменные, описанные по-разному. Далее в теле этой процедуры каждый из формальных аргументов увеличивается на единицу, а затем их значения выводятся на экран с помощью функции MsgBox. Основная процедура Main устанавливает значения переменных a, b и c, после чего передает их в качестве фактических параметров процедуре Example1. При этом первый аргумент передается по ссылке (действует умолчание), второй – по значению, а третий – снова по ссылке. После возврата из процедуры Example1 основная процедура также выводит на экран значения трех переменных, передававшихся в качестве аргументов. Всего на экране отображается шесть значений: сначала 11, 21 и 31 (все полученные значения увеличены на 1 и выводятся процедурой Example1); затем 11, 20 и 31 (эти значения выводятся процедурой Main: переменные, переданные по ссылке, увеличились, а переменная, переданная по значению, – нет). Типы процедур и их элементы
Существует два типа процедур VBA – процедуры Sub и функции. Процедуры Sub выполняют операции, но не возвращают значения и поэтому не могут быть использованы в выражениях. Функции же возвращают значения и не имеют ограничений по применению.
Процедуры содержат описания, инструкции и выражения. Описания явно устанавливают тип переменных и констант в процедуре или модуле. Раздел описаний должен находиться в начале процедуры. Инструкция (оператор) выполняет определенную конкретную операцию, описание или определение. Инструкции обычно помещаются по одной на строке. Если же в строке размещается несколько инструкций, они разделяются двоеточием (:). Например:
cod = 1: answer = 4
Если инструкция на одной строке не помещается, она может быть продолжена на следующей. В таком случае в начале второй строки ставятся символы пробела и подчеркивания.
Выражения приравнивают значения объекта слева от знака равенства значению, полученному из элементов справа.
При указании имен процедур, констант, переменных и аргументов VBA рекомендуется использовать стандартные правила Access:
• первый символ должен быть буквой;
• имя может содержать буквы, цифры и символ подчеркивания, но знаки препинания не допускаются;
• имя может содержать не более 255 знаков;
• не следует использовать одинаковые имена для функций VBA, методов или инструкций;
• не следует использовать одно имя дважды в одной процедуре.
Процедуры SubПроцедура Sub содержит одну или более определенных операций. Можно использовать процедуру Sub для автоматизации повторно выполняемых задач: например, назначить одну из процедур элементу меню, чтобы запускать ее именно оттуда.
Процедуры Sub полезны для операций, выполняемых при щелчке по кнопке, имеющейся в форме, или получении фокуса определенным элементом управления.
Инструкция Sub определяет имя процедуры, аргументы и операторы программы и имеет следующий синтаксис:
[Private|Public] [Static]Sub name [ (arglist) ]
[инструкции]
[Exit Sub]
[инструкции]
End Sub
Это синтаксическое определение является стандартным. Жирным шрифтом выделены слова, которые должны вводиться в точном соответствии с примером. Слова, набранные курсивом, – это имена, определяемые пользователем. Слова, стоящие в квадратных скобках, являются необязательными. Ключевые слова, разделенные вертикальной чертой (|), представляют собой взаимоисключающие параметры, поэтому можно использовать лишь одно из двух – либо Private, либо Public. Если в процедуру Sub включается список аргументов (arglist), то он должен быть заключен в скобки, а аргументы – разделены запятыми.
Если в определении указано два или более ключевых слов, разделенных вертикальными чертами и при этом заключенных в фигурные скобки, то одно из них должно быть введено обязательно, иначе будет выбран параметр по умолчанию.
Ключевое слово Sub описывает процедуру по имени. Все инструкции, которые находятся между строками Sub и End Sub, выполняются при запуске процедуры.
Функции Процедура Function генерирует значение и возвращает его в приложение. Возвращаемое значение имеет то же имя, что и функция, и может быть использовано в любом месте выражения. Синтаксис инструкции Function выглядит следующим образом:
[Private | Public][Static]Function имя [(arglist)] [As тип]
[инструкции]
[имя = выражение]
[Exit Function]
[инструкции]
[имя = выражение]
End Function
Значение, которое возвращает функция, присваивается ее имени. Если функция не присваивает значения, то она возвращает значение по умолчанию: 0 в случае числовой функции, строку нулевой длины в случае строковой функции или Empty в случае функции Variant.
Чтобы использовать значение, возвращаемое функцией, надо поместить ее имя справа от знака равенства в другой процедуре.
Элементы процедур
Оба типа процедур совместно используют одни и те же элементы синтаксиса, которые поясняются в табл. 12.2.
Список аргументов должен иметь определенную структуру и синтаксис, которые также применимы к обоим типам процедур:
[Optional] [ByVal] [ByRef] [ParamArray] varname[ () ] [As type] [=defaultvalue]
Таблица 12.2
Элементы списка поясняются в табл. 12.3. Таблица 12.3
Просмотр объектов
Как вы уже знаете, число объектов, с которыми имеет дело проектировщик баз данных Access 2002 и приложений, достаточно велико – здесь не только собственно таблицы, формы и отчеты. К объектам надо отнести еще константы, процедуры, функции и т. п. К тому же, кроме собственной библиотеки Access 2002, есть еще библиотека VBA, библиотека DAO (Data Access Objects – объекты доступа к данным) и др. Поэтому без какой-то систематизации этого множества объектов обойтись довольно трудно.
Access 2002 предоставляет пользователю инструмент такой систематизации – Просмотр объектов. Окно просмотра объектов вызывается щелчком по кнопке
расположенной на панели инструментов. Но эта кнопка доступна лишь из окна программы (см. рис. 12.1 или 12.2).
Окно просмотра объектов, показанное на рис. 12.3, встраивается в правую область окна модуля. Его допускается переместить, чтобы оно не мешало обзору программы. В левом верхнем поле этого окна стрелкой прокрутки вы можете выбрать нужную вам библиотеку объектов – библиотеку VBA, DAO, Access 2002, собственную библиотеку базы данных, в которой вы работаете, или вообще все библиотеки. (На рис. 12.3 показано, что установлено отображение объектов из библиотеки VBA.) Далее на вкладке Классы вам надо выбрать интересующий вас класс объектов (на рисунке это Дата и время). Тогда в правом поле откроется список Члены класса Дата и время, где вы можете выбрать нужную функцию, свойство, константу и др. Для выбранного объекта (например, на рисунке справа выбрана функция DateSerial) в нижней части окна показан соответствующий ему синтаксис и повторены (другим цветом) название библиотеки и имя класса. Если вы щелкнете по выделенному цветом имени библиотеки, то оно сменится ее адресом (путем). Выбранный объект можно перенести непосредственно в текст программы: скопировать его имя в буфер и оттуда вставить в нужное место текста. Однако помните, что при этой операции переносится только имя объекта без аргументов – их придется вводить вручную.
Рис. 12.3
Управление выполнением программы
Наряду с рассмотренными выше элементами важным компонентом VBA являются элементы управления выполнением программы. Кроме операторов, которые вызывают подпрограммы или функции, таких основных элементов четыре:
• выход из программы или временная остановка ее выполнения;
• переход к другой части программы;
• организация циклов;
• выбор действий, которые должны производиться дальше.
В табл. 12.4 указаны ключевые операторы, которые позволяют управлять выполнением программы. Все они имеют определенный стандартный синтаксис. Вот несколько примеров.
1. Синтаксис инструкции On… GoSub:
On expression GoSub
Здесь expression – целое или округленное до целого число в диапазоне от 0 до 255, а destinationlist – список номеров строк или меток. Каждая из них соответствует значению, принимаемому выражением. 2. Синтаксис инструкции Do… Loop:
Do [(While|Until) condition]
[инструкции1]
[Exit Do]
[инструкции2]
Loop
Здесь condition – условие цикла; инструкции1 – операторы, которые многократно выполняются до тех пор, пока истинно условие цикла; инструкций – операторы, выполняющиеся, если условие цикла ложно. 3. Синтаксис инструкции If.Then.Else: