Access 2002. Самоучитель
Шрифт:
Access 2002 предусматривает возможность использования дополнительного режима запроса с использованием SQL – режима ANSI SQL-92. Он предназначен для реализации определенных, достаточно специфических функций. При этом данный режим требует осторожного и аккуратного обращения – он несовместим, в частности, с режимом запроса ANSI SQL-89, использовавшимся в прежних версиях (он применим и в Access 2002), а в некоторых случаях приводит к существенно отличающимся результатам.
Глава 12 Программирование с помощью процедур VBA
Как уже говорилось, VBA – это объектно-ориентированный язык программирования. В свое время он был разработан специально для записи макросов в Microsoft Excel 5.0. Затем он начал использоваться и другими приложениями Microsoft Office, в частности Access. Сейчас VBA стал стандартным языком макропрограммирования, что очень полезно, так как облегчает взаимодействие различных приложений. 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. Эта возможность очень полезна при написании и отладке программ, когда бывает необходимо просмотреть текст похожей процедуры, созданной для другого объекта базы данных.
Модули могут содержать описания, процедуры обработки событий, процедуры Sub (субпроцедуры) и функции.
При организации новой формы Access 2002 создает модуль класса и помещает его в конструктор. При добавлении процедуры обработки события в форму или отчет она автоматически помещается в модуль класса. Если вы копируете форму или отчет в другую базу данных, модуль класса копируется вместе с ней. Удаление формы или отчета приводит также к удалению соответствующего модуля.
Основные элементы
Прежде чем обсуждать реальные примеры программирования на основе 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 выполняют операции, но не возвращают значения и поэтому не могут быть использованы в выражениях. Функции же возвращают значения и не имеют ограничений по применению.
Процедуры содержат описания, инструкции и выражения. Описания явно устанавливают тип переменных и констант в процедуре или модуле. Раздел описаний должен находиться в начале процедуры. Инструкция (оператор) выполняет определенную конкретную операцию, описание или определение. Инструкции обычно помещаются по одной на строке. Если же в строке размещается несколько инструкций, они разделяются двоеточием (:). Например: