Назначение макроса событию

Наиболее часто макросы используются в приложении Access для обработки событий. Событие — это любое действие, распознаваемое объектом, и можно определить реакцию объекта на событие. События происходят в результате действий пользователя, выполнения инструкций VBA или генерируются системой. Примером событий является вывод на экран формы, отчета, ввод данных в текстовое поле, нажатие кнопки мыши или клавиши. Каждому из этих событий можно назначить макрос или процедуру VBA, которые будут автоматически выполняться в ответ на произошедшее событие. Практически все программирование в Access сводится к написанию макросов или процедур, обрабатывающих события, т. е. программируется реакция объектов на события. Существует большое количество различного рода событий, на которые реагируют объекты, причем часто возникает не одно, а целая последовательность событий. Поэтому необходимо обладать определенным умением, чтобы решить, какому событию следует назначить созданный вами макрос или процедуру VBA. Все тонкости этого выбора будут обсуждаться в разд. "Программирование в формах и отчетах"гл. 13. Здесь мы опишем только способ назначения макроса событию и приведем примеры обработки событий с помощью макросов.

Начнем с самого простого. Откроем форму "Клиенты" (Customers) в базе данных "Борей". В этой форме отображается информация о клиенте. Допустим, мы хотели бы видеть не только эту информацию, но и данные о купленных клиентом продуктах. Было бы хорошо создать кнопку Заказы клиента, при нажатии которой появлялась бы форма "Заказы" (Orders) с заказами только того клиента, который в данный момент выбран в форме "Клиенты" (Customers). Для того чтобы получить желаемое, создадим макрос, который будет выполняться, когда произойдет событие Нажатие кнопки (On Click) в форме "Клиенты" (Customers).

Чтобы создать макрос, определяющий описанную реакцию приложения на событие Нажатие кнопки (OnClick):

  1. Откройте форму "Клиенты" (Customers) в режиме Конструктора.
  2. Создайте кнопку в области заголовка формы. При этом кнопка мастера на панели элементов должна быть отжата, т. к. в противном случае вам будет предложено создать процедуру обработки событий, а не макрос.
  3. Откройте окно свойств только что созданной кнопки, если оно еще не открыто, и раскройте вкладку События (Event).
  4. Обратите внимание, сколько разных событий связано только с командной кнопкой. Помимо обычного нажатия, которое мы сейчас и будем использовать, в набор событий кнопки входят получение и потеря фокуса, двойной щелчок кнопкой мыши, простое перемещение указателя мыши над кнопкой и пр. Такое многообразие событий дает разработчику большие возможности по созданию удобного интерфейса пользователя. Теперь найдите в списке событие Нажатие кнопки (On Click) и установите курсор в соответствующую ячейку. Это поле со списком, и в данный момент оно пустое. Если открыть этот список, то первым его элементом будет [Процедура обработки событий] ([Event procedure]), а далее идет перечень всех макросов, существующих в приложении (рис. 11.10).
  5. Поскольку нужного нам макроса в списке нет, давайте его создадим. Для этого нажмите кнопку Построителя, находящуюся справа от поля. Появится окно Построитель (Choose Builder), в котором предлагается выбрать один из трех Построителей: Выражения (Expression Builder), Макросы (Macro Builder) и Программы (Code Builder) (рис. 11.11).
  6. Выберите Макросы (Macro Builder) и нажмите кнопку ОК. Откроется"окно макросов и диалоговое окно, в которое нужно ввести имя создаваемого макроса. Введите имя Заказы клиента.

Диалоговое окно свойств кнопки

Рис. 11.10. Диалоговое окно свойств кнопки

Диалоговое окно Последовательность перехода

Рис. 11.11. Диалоговое окно Последовательность перехода

  1. В макрос нужно добавить единственную макрокоманду ОткрытьФорму (OpenForm). Значения аргументов этой макрокоманды приведены в табл. 11.З.
АргументЗначение
Имя формы (Form Name) Заказы (Orders) 
Режим (View) Форма (Form) 
Условие отбора (Condition) [КодКлиента] = [Forms] ! [Клиенты] ! [КодКлиента] 
Режим данных (Data Mode) Только чтение (Read Only) 
Режим окна (Window Mode) Обычное (Normal) 

Таблица 11.3. Значения аргументов макрокоманды ОткрытьФорму (OpenForm)

Аргумент Режим (View) определяет режим, в котором форма должна быть открыта. Он может принимать значения: Форма (Form), Конструктор (Design), Просмотр (Print Preview), Таблица (Datasheet), Сводная таблица (PivotTable) и Сводная диаграмма (Pivot Chart). Аргумент Условие отбора (Condition) определяет условие для отбора записей, отображаемых в форме. Условие представляет собой выражение. В данном случае это выражение содержит ссылку на элемент управления КодКлиента (CustomerlD) в форме "Клиенты" (Customers), что позволяет выбрать все записи из таблицы "Заказы" (Orders), в которых код клиента равняется значению, заданному в поле "КодКлиента" (CustomerID) формы "Клиенты" (Customers). (Подробнее об использовании ссылок в макросах и выражениях будет рассказано в разд. "Применение макросов" данной главы.) Аргумент Режим данных (Data Mode) определяет способ работы с данными и может принимать одно из значений: Добавление (Add), Изменение (Edit) или Только чтение (Read Only). И наконец, аргумент Режим окна (Window Mode) определяет тип окна: Обычное (Normal), Невидимое (Hidden), Значок (Icon) и Окно диалога (Dialog).

  1. Закройте окно макроса, сохранив изменения. В окне свойств кнопки в поле Нажатие кнопки (On Click) появится имя макроса "Заказы клиента".
  2. Раскройте вкладку Макет (Format) и введите в поле Подпись (Caption) название кнопки: Заказы клиента. То же самое имя рекомендуется ввести в поле Имя (Name) на вкладке Другие (Other).

Теперь остается перейти в режим Формы и проверить, как макрос отрабатывает событие Нажатие кнопки (On Click). Если вы нигде не ошиблись, то должны увидеть на экране картинку, похожую на ту, что изображена на рис. 11.12.

Форма "Заказы"

Рис. 11.12. Форма "Заказы"

Однако мы выполнили еще не все необходимые действия. Если перейти к следующей записи в форме "Клиенты" (Customers), данные в форме "Заказы" (Orders) уже не будут правильно отражать ситуацию — они не меняются. Нужно сделать так, чтобы эти данные изменялись синхронно с переходом к другим записям в форме "Клиенты" (Customers) либо чтобы это окно просто закрывалось. Рассмотрим реализацию второго варианта. Форма "Заказы" (Orders) открывается, когда мы нажимаем кнопку Заказы клиента, и становится активной. Требуется сделать так, чтобы она закрывалась, когда активной становится форма "Клиенты" (Customers). Для этого нужно выбрать соответствующее событие и задать процедуру или макрос его обработки. Если вы откроете окно Свойства (Properties) формы "Клиенты" (Customers) и раскроете вкладку События (Event), то среди множества событий увидите событие Включение (On Activate). Это как раз то событие, которое нам нужно. Выберем это событие, но теперь мы не будем создавать новую группу макросов, а добавим новый макрос в группу макросов "Клиенты" (Customers), которая уже содержит макросы для формы "Клиенты" (Customers). Выберите эту группу макросов в раскрывающемся списке и нажмите кнопку Построителя. Откроется окно, в котором отобразятся два макроса. Добавим к ним еще один макрос. Назовем его "Закрытие" и введем макрокоманду Закрыть (Close) с соответствующими параметрами (табл. 11.4). Но перед закрытием формы необходимо проверить, открыта ли она. Для этого воспользуемся функцией isLoaded, которая возвращает значение Истина, если форма открыта, и Ложь — в противном случае. В качестве аргумента в функцию isLoaded нужно передать имя формы. Итак, в столбец Условие (Condition), напротив макрокоманды Закрыть (Close), введите IsLoaded("Заказы") (или IsLoaded ("Orders")).

Аргумент Значение 
Тип объекта (Object Type) Форма (Forms) 
Имя объекта (Object Name) Заказы (Orders) 
Сохранение (Save) Нет (No) 

Таблица 11.4. Значения аргументов макрокоманды Закрыть (Close)

Аргумент Сохранение (Save) позволяет определить, будет ли Access при закрытии формы отображать диалоговое окно для подтверждения сохранения измененных данных. Поскольку мы открывали форму "Заказы" (Orders) в режиме только для чтения, изменение данных запрещено, поэтому данному аргументу необходимо присвоить значение Нет (No). Готовый макрос показан на рис. 11.13.

Закройте окно макроса, сохранив изменения. Измените имя макроса, назначенного событию Включение (On Activate). Для этого выберите в списке или введите имя Клиенты.Закрыть (Customers.Close) и нажмите клавишу <Enter>. Теперь сохраните форму, перейдите в режим Формы и проверьте, как работают созданные вами макросы.

Макрос для закрытия формы

Рис. 11.13. Макрос для закрытия формы