Основные положения VBA

Основные положения VBA

Начнем эту главу с краткого обзора основных положений VBA.

Базовые термины

Вначале рассмотрим наиболее важные термины VBA (см. табл. 12.1).

Таблица 12.1

Объектно-ориентированный язык VBA базируется на трех основных компонентах: объектах, событиях и методах.

Объекты, как уже неоднократно говорилось, представляют собой элементы, входящие в состав приложений: таблицы, формы и их элементы управления, отчеты, запросы и т. д. События подробно рассматривались в предыдущей главе.

Последним компонентом являются методы. Для каждого объекта определен набор методов, которые могут быть к нему применены. Метод представляет собой действие, например Перейти на запись, Применить фильтр, Открыть форму. Такие действия указываются в установках свойств события объекта. Если пользователь не определил свойство события для объекта (не связал его с каким-либо действием), то объект отвечает на событие действием, заданным для его типа по умолчанию. Например, если текстовое окно получает фокус и не определено свойство события Получение фокуса, то встроенный метод может изменить цвет этого окна. Если вы установили свойство события объекта для макроса или процедуры обработки события, то Access сначала обрабатывает встроенный режим, а затем выполняет заданный вами макрос или процедуру. Например, вы щелкаете по командной кнопке, которая активизирует вторую страницу формы. Отображается щелчок по кнопке – кнопка на экране на мгновение «утапливается» (поведение по умолчанию), затем выполняется переход к следующей странице формы.

Окно модуля

Программа VBA создается, редактируется и отображается в окне модуля. Такое окно для класса, связанного с формой или отчетом, можно открыть либо из окна базы данных, когда объект закрыт, либо из окна объекта в режиме конструктора. Чтобы открыть окно модуля, надо выполнить одно из перечисленных действий:

1. В окне базы данных выберите имя формы или отчета на соответствующих вкладках Формы или Отчеты.

2. Выберите позицию Программа в меню Вид или щелкните по кнопке

(Программа) на панели инструментов.

На экране появится окно модуля VBA (рис. 12.1), разделенное на две области.

Рис. 12.1

Левая область – окно свойств. В верхнем поле этой области показано, свойства какого элемента программы здесь представлены. Если вы выходили в окно модуля непосредственно из окна базы данных, то будут представлены свойства формы или отчета в целом. Если вы попали в окно модуля из конструктора форм или отчетов, будут представлены свойства того элемента управления, который был активизирован перед переходом в окно модуля. Щелкнув по стрелке прокрутки справа от этого поля, вы легко можете перейти в любой элемент управления, и в левой области появятся его свойства. Свойства могут быть отсортированы в алфавитном порядке – вкладка Алфавитный – или разбиты по разделам – вкладка Категории: Данные, Событие, Другие. С таким способом отображения информации вы уже встречались при работе с конструкторами (см., например, рис. 10.2). Разделы, содержащие свойства, могут сворачиваться или раскрываться с помощью значков плюса (+) и минуса (-), расположенных слева от названия раздела.

Кроме того, в левой области вы можете соотнести какое-либо свойство с макросом или процедурой обработки событий. Но поскольку здесь отсутствует полоса прокрутки и нельзя использовать списки, имена макросов и процедур надо вносить с клавиатуры, что неудобно.

В окне правой области отображается полный текст программы, связанной как с активным элементом управления, так и выбранным свойством. Конкретное значение этой пары задается в верхних полях области – в левом верхнем поле вы можете указать элемент управления, в правом – свойство. Тогда в нижнем окне правой области появится текст процедуры, определенной данным сочетанием. Если такая программа отсутствует, то отображаются две строки – открывающая процедуру Private Sub с аргументами и закрывающая End Sub.

Для перемещения между процедурами модуля используются также сочетания клавиш Ctrl+PgUp (для перехода к следующей процедуре), Ctrl+PgDn (для перехода к предыдущей процедуре).

В окне модуля предусмотрена удобная возможность быстрого перехода к другому модулю класса, то есть к процедурам, относящимся к другой форме или отчету. Щелкните по кнопке Project Explorer

на панели инструментов. Окно модуля изменится (см. рис. 12.2) – в левой области появится новое окно Project и три кнопки. Правая, нажатая по умолчанию, выводит перечень объектов базы данных: форм, отчетов, модулей класса.

Рис. 12.2

Выберите здесь, например, форму Страны. Если теперь щелкнуть по средней кнопке, то в основном окне правой области появится эта форма в режиме конструктора (на рисунке не показано). Щелчок по левой кнопке выведет на экран модуль класса, относящийся к форме Страны, что показано на рис. 12.2. Эта возможность очень полезна при написании и отладке программ, когда бывает необходимо просмотреть текст похожей процедуры, созданной для другого объекта базы данных.

Модули могут содержать описания, процедуры обработки событий, процедуры Sub (субпроцедуры) и функции.

При организации новой формы Access 2002 создает модуль класса и помещает его в конструктор. При добавлении процедуры обработки события в форму или отчет она автоматически помещается в модуль класса. Если вы копируете форму или отчет в другую базу данных, модуль класса копируется вместе с ней. Удаление формы или отчета приводит также к удалению соответствующего модуля.

Основные элементы

Прежде чем обсуждать реальные примеры программирования на основе VBA рассмотрим вкратце его основные элементы:

• переменные;

• константы;

• аргументы;

• процедуры VBA и их элементы;

• инструменты, управляющие выполнением программы.

Переменные

Переменные – это именованные области памяти, которые используются для временного хранения результатов. Переменные сходны с полями, но свойственны только VBA Наборы записей, например таблицы, их не содержат. Перед включением в процедуру переменные должны быть описаны или объявлены. Описание переменной состоит в присвоении ей имени и, возможно, типа – символьная, логическая и др. Область действия переменной может быть ограничена одной процедурой, в которой она была описана, определенным модулем с несколькими процедурами или приложением в целом. Значение переменная получает при описании. Если это значение не указано явно, то устанавливается заданное по умолчанию.

Возможны два способа описания переменной: неявный и явный. Для неявного определения переменной достаточно использовать имя переменной в процедуре, не задавая его специально. Явное описание переменной означает присвоение ее имени и определение ее типа до первого оператора в программе. Чаще всего переменные описываются с помощью инструкции Dim.

Константы

Константами называются именованные значения, которые не изменяются в ходе выполнения модуля или процедуры, где они определены. Установка и изменение значений констант производится только однажды – при их описании. Константа может представлять численное или символьное значение или указывать на другую константу. Выражение, содержащее комбинацию арифметических или логических операторов, также рассматривается как константа. После определения константы ее разрешено использовать в любом месте в границах области определения.

Access поддерживает два типа констант: символьные и внутренние. Символьные константы (или константы, определяемые пользователем) определяются в модуле или процедуре с помощью оператора Const и сохраняют свое значение в ходе их выполнения. Внутренние константы (или константы, создаваемые системой) могут быть использованы в любом месте во всех модулях.

Область действия символьной константы определена местом ее описания. Если константа объявлена в процедуре, она будет доступна внутри этой процедуры; если в модуле, то, соответственно, доступ к ней разрешен во всем модуле. Константы, описанные в модуле, считаются личными (Private). Исключением из данного правила являются константы, специально объявленные как общие (Public). В этом случае они доступны для любого модуля во всем приложении. Как правило, рекомендуется для всех определяемых пользователем констант указывать тип Private, чтобы не возникало возможных недоразумений, если в другом модуле встретится константа с таким же именем. Кроме того, следует явно описывать тип Private в модуле. Рекомендуется также имя символьной константы начинать с con, например conKoeff, чтобы указать, что речь идет о константе, причем символьной.

Внутренние константы всегда доступны пользователю. Они поставляются вместе с Access 2002. Но кроме них можно использовать и другие, например из библиотеки VBA. Все константы (и не только константы) доступны в диалоговом окне Просмотр объектов, которое будет рассмотрено ниже. Имена внутренних констант имеют приставку из двух букв, указывающую на их принадлежность к той или иной библиотеке. Так, константы Access 2002 начинаются с букв ac (например, acColorIndexBlue – константа, устанавливающая голубой цвет), константы из библиотеки VBA – с букв vb (например, vbNullString, устанавливающая нулевую строку).

Аргументы Аргументы – это биты информации, которые используются процедурой или методом в ходе выполнения. Они могут быть обязательными или необязательными. Чтобы передать аргументы процедуре, надо указать их в определении процедуры сразу после ее имени. Например, процедура Haзвaниe_фиpмы_KeyUp требует указания двух аргументов KeyCode и Shift, которые описываются как одно целое:

Private Sub Название_фирмы_KeyUp(KeyCode As Integer, Shift As Integer)

Для того чтобы выполнить созданную процедуру, надо ее вызвать. При этом аргументы можно задавать как по позиции, так и по имени. В первом случае значения аргументов располагаются в том же порядке, что и в определении процедуры, и разделяются запятыми. Это будет выглядеть следующим образом:

Название_фирмы_KeyUp 15,10

или

Call Название_фирмы_KeyUp (15,10)

При задании аргументов по имени их порядок можно не соблюдать, так как определяется каждый аргумент. После имени аргумента следует двоеточие (:) и знак равенства (=). Аргументы при этом разделены запятыми. Приведем пример такого задания:

Название_фирмы_KeyUp: Arg2:=10, Arg1:=15

С помощью описателей ByVal и ByRef (см. табл. 12.3) можно осуществить передачу переменных в процедуру или функцию в качестве параметров либо по ссылке, либо по значению. Если переменная передается по ссылке, то процедуре или функции будет передан адрес этой переменной в памяти. Тем самым вызываемая процедура может изменить значение фактического параметра, если она произведет какие-либо действия над параметром. Если же фактический параметр передается по значению, то процедура или функция получают в качестве аргумента только фиксированное значение этого параметра, но не саму переменную, используемую для его изменения.

Способ передачи параметров процедуре или функции определяется при описании ее аргументов. Описатель 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:

If [условия]

Then [условные операторы]

[Else операторы else]

End If

Для выполнения этой инструкции необходимо наличие хотя бы одного условия. Если условия истинны, выполняются условные операторы; в противном случае – операторы else. Инструкция должна заканчиваться строкой End If. Таблица 12.4

Данный текст является ознакомительным фрагментом.