| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Глава 11. Работа с макросами.
Глава 11. Работа с макросами Основной набор
средств Microsoft Access, который мы рассматривали в предыдущих главах книги,
ориентирован на пользователей, не владеющих языками программирования. Для
программистов же к этим средствам добавлены макросы (небольшие программы
на языке макрокоманд системы Access) и модули (процедуры на языке Visual
Basic for Application, VBA). С их помощью можно существенно расширить
функциональные возможности создаваемого вами приложения и настроить его на нужды
конкретных пользователей. В этой главе мы познакомимся с одним из этих средств —
макросами и одним из языков программирования Access — языком макрокоманд. С
модулями и языком VBA мы вас познакомим в гл. 13, Итак, мы будем
обсуждать следующие вопросы:
Использование макросов в базе данных Microsoft
Access С помощью макросов можно выполнить практически все действия над объектами Access из тех, которые были описаны в предыдущих главах. Макрос в Access
представляет собой структуру, состоящую из одной или нескольких макрокоманд,
которые выполняются либо последовательно, либо в порядке, заданном определенными
условиями. Набор макрокоманд в Access очень широк, с помощью макросов можно
реализовать многое из того, что позволяют сделать процедуры на VBA. Каждая
макрокоманда имеет определенное имя и, возможно, один или несколько аргументов,
которые задаются пользователем. Например, при использовании макрокоманды
ОткрытьФорму (OpenForm) в качестве аргументов необходимо задать, по крайней
мере, имя открываемой формы и режим вывода ее на экран. В табл. 11.1
содержится список макрокоманд Microsoft Access 2002, сгруппированных по
категориям: работа с данными в формах и отчетах; выполнение команд, макросов,
процедур и запросов; работа с объектами; импорт/экспорт данных и объектов и
прочие. В категорию "Прочие" собраны все макрокоманды, которые позволяют влиять
на интерфейс приложения. Таблица
11.1. Макрокоманды Microsoft Access 2002
Как видно из
этой таблицы, действия, которые могут быть выполнены с помощью макросов, очень
разнообразны. Даже если вы не будете использовать макросы в своих приложениях,
имеет смысл изучить эти макрокоманды, поскольку их можно использовать и в
процедурах VBA, как будет показано далее (см. гл. 13). По сравнению с
предыдущей версией Access, в Microsoft Access 2002 появились три новые
макрокоманды: ПереносБазыДанныхSQL (TransferSQLDatabase) — переносит базу данных
Microsoft SQL Server 7.0 и выше на другой сервер; КопироватьФайлБазыДанных(CopyDatabaseFile) — выполняет копирование
текущей базы данных Microsoft SQL Server 7.0 и выше, присоединенной к проекту
Access; ОткрытьФункцию
(OpenFunction) — выполняет функцию, определенную пользователем, в проекте
Access. Эта функция- представляет собой запрос, который, используя входные
параметры, возвращает результаты так же, как и хранимая
процедура. Использование
макросов оправдано тем, что их легко создавать, и для этого не нужно изучать
синтаксис языка программирования. Как будет показано в следующем разделе, для
создания макроса требуется знать лишь основные приемы работы в Microsoft Access
и Windows, такие как перетаскивание объектов из окна База данных
(Database) в специальное окно — Конструктор макросов (Macro Design),
выбор действия из списка и ввод выражений в качестве аргументов макрокоманды.
Поэтому, если очень не хочется изучать синтаксис языка VBA или это
представляется слишком трудным, смело применяйте макросы, и вы получите
достаточно функциональное приложение. Как уже
говорилось выше, основное назначение макросов — это создание удобного интерфейса
приложения: чтобы формы и отчеты открывались при нажатии кнопок в форме или на
панели инструментов или же привычным выбором команды меню; чтобы при открытии
приложения пользователь видел на экране не окно База данных (Database),
наполненное множеством таблиц, запросов, форм и отчетов, а некую понятную форму,
с помощью которой можно было бы сразу производить желаемые действия и т.
д. С помощью
макросов можно создать удобные меню и панели инструментов для приложения, и чуть
позже мы опишем, как это сделать. Однако
использование макросов имеет и некоторые недостатки, о которых здесь уместно
сказать.
Тем не менее,
как уже отмечалось, во многих случаях использование макросов вполне оправдано,
т. к. это существенно упрощает и ускоряет разработку приложения. С помощью
макросов можно создавать небольшие однопользовательские приложения, хотя при
создании многопользовательских или клиент-серверных приложений, где скорость
работы приложения критична, лучше применять VBA. В Microsoft
Access существует специальное средство для создания макросов — Конструктор
макросов (Macro Design). Рассмотрим процесс создания макроса с помощью
Конструктора. Открыть окно
Конструктор макросов (Macro Design) для создания нового макроса можно
двумя способами:
Окно
Конструктора макросов построено аналогично окну Конструктора таблиц, т. е.
разделено по горизонтали на две части: панель описаний и панель
аргументов. Верхняя часть
окна Конструктора — панель описаний — состоит из нескольких столбцов. По
умолчанию на этой панели выводится два столбца: "Макрокоманда" (Action) и "Примечание" (Comments).
Панель описаний позволяет определить последовательность макрокоманд, из которых
состоит макрос. Строка в столбце
"Макрокоманда" (Action) представляет собой поле со списком, в котором можно
выбрать нужную макрокоманду. Строка в столбце
"Примечание" (Comments) — это обычное текстовое поле, в которое можно ввести
комментарий, описывающий выполняемое действие. Когда поле
"Макрокоманда" (Action) заполнено, в нижней части окна Конструктора макросов
появляется панель аргументов, предназначенная для ввода значений аргументов
соответствующей макрокоманды. Список полей на этой панели зависит от выбранной
макрокоманды и может отсутствовать, если макрокоманда не имеет аргументов. Таким
образом, при создании макросов не нужно запоминать список аргументов для каждой
макрокоманды. На рис. 11.1
проиллюстрирован выбор макрокоманды Применить Фильтр (ApplyFilter). На панели
аргументов имеются два поля, которые позволяют задать имя фильтра и условие
отбора записей. Для того чтобы задать условие отбора записей, можно
воспользоваться Построителем выражений (см. разд. "Создание выражений с
помощью Построителя выражений" гл. 4).
Рис. 11.1.
Конструктор макросов и панель аргументов Такой макрос
можно использовать в форме или отчете для того, чтобы ограничить число
отображаемых записей. Замечание
Существует еще
один очень простой способ ввода макрокоманды. Допустим, нужно создать макрос,
который должен открывать форму "Клиенты" (Customers) в приложении "Борей"
(Northwind). Для этого в окне База данных (Database) необходимо щелкнуть
по ярлыку Формы (Forms), затем, используя панель инструментов (способ 2),
открыть окно Конструктор макросов (Macro Design) и перетащить с помощью
мыши форму "Клиенты" (Customers) в поле "Макрокоманда" (Action) окна
Конструктора макросов. Совет
Тогда в поле
"Макрокоманда" (Action) автоматически появится макрокоманда ОткрытьФорму
(OpenForm) (рис. 11.2), а на панели аргументов автоматически заполнятся поля: в
поле "Имя формы" (Form Name) появится имя формы "Клиенты" (Customers), в поле
"Режим" (View) — значение по умолчанию Форма (Form), в поле "Режим окна" (Window
Mode) — значение Обычное (Normal). Остальные поля останутся пустыми. Мы
можем в этой же макрокоманде задать фильтр для отбора записей. Для этого введем
в поле "Имя фильтра" (Filter Name) имя какого-нибудь фильтра, например
"Менеджеры по продажам", который мы строили при изучении запросов (см. разд.
"Создание запроса из фильтра" гл. 4). Кроме того,
можно сделать записи в этой форме недоступными для изменений, для чего в поле
Режим данных (Data Mode) необходимо ввести значение Только чтение
(Read Only).
Рис. 11.2.
Автоматическое создание макрокоманд путем перетаскивания
объектов Аналогично можно
создавать макрокоманды, перетаскивая из окна База данных (Database)
таблицы, запросы, отчеты и другие макросы. При этом в окне Конструктора макросов
будут появляться соответствующие макрокоманды: ОткрытьТаблицу (ОрепТаblе),
ОткрытьЗапрос (OpenQuery) , ОткрытьОтчет (OpenReport),
ЗапускМакроса(RunMacro). Для ввода
аргументов макрокоманды чаще всего требуется выбирать значения из списков или
вводить выражения. Для ввода выражений можно воспользоваться Построителем
выражений, кнопка которого находится справа от поля аргумента. Еще одна кнопка
Построителя выражений находится на панели инструментов. Как и в других случаях,
перед выражением нужно ставить знак равенства (=). Исключения составляют
аргумент Выражение (Expression) макрокоманды ЗадатьЗначение (Setvalue) и
аргумент Число повторений (Repeat Count) макрокоманды-ЗапускМакроса
(RunMacro). Если ввести знак равенства перед выражением, задающим значение этих
аргументов, то оно будет вычисляться дважды, что может привести к нежелательным
результатам. Если в качестве
аргумента макрокоманды необходимо задать имя объекта базы данных, то его можно
либо ввести с помощью клавиатуры, либо выбрать из раскрывающегося списка, либо
указать название объекта, перетащив его из окна базы данных. Итак, созданная
нами макрокоманда будет открывать форму "Клиенты" (Customers) в режиме Только
чтение (Read Only) и показывать в ней только менеджеров по продажам. Как уже
было сказано ранее, макрос может содержать последовательность из нескольких
макрокоманд. Поэтому в этом же макросе в следующей строке мы выберем
макрокоманду Сообщение (MsgBox), которая после открытия формы будет отображать
диалоговое окно с сообщением о том, какие клиенты представлены в форме. Для
этого введем в поле Сообщение (Message) на панели аргументов текст
сообщения, например Установлен фильтр Менеджеры по продажам, остальные поля
можем оставить без изменения. Аргумент Сигнал (Веер) определяет, будет ли
вывод сообщения сопровождаться звуковым сигналом. Аргумент Тип (Туре)
определяет вид диалогового окна сообщения. Аргумент Заголовок (Title)
позволяет задать текст, который будет выведен в заголовке окна
сообщения. Если база данных
большая, отбор записей в форме может занять некоторое время, поэтому
рекомендуется вывести на экран курсор в форме песочных часов, который будет
показывать, что идет обработка данных. Для того чтобы сделать это, воспользуемся
макрокомандой ПесочныеЧасы (Hourglass). Макрокоманды в макросе выполняются в той
последовательности, в которой они записаны в столбце "Макрокоманда" (Action), т.
е. сверху вниз. Макрокоманду ПесочныеЧасы (Hourglass) следует поставить первой,
т. к. курсор должен измениться перед выводом формы. Таким образом, нам нужно
вставить новую строку на панели описаний. Для этого установим курсор в первую
строку панели и нажмем кнопку Добавить строки (Insert Rows) на панели
инструментов или просто клавишу <Insert>. Появится пустая строка. В этой
строке в поле "Макрокоманда" (Action) выберем макрокоманду ПесочныеЧасы
(Hourglass). В поле "Включить" (Hourglass On) панели аргументов появится
значение Да (Yes), установленное по умолчанию, что нам и нужно. Чтобы вернуть
первоначальный вид указателю мыши, в конце созданного макроса нужно ввести такую
же макрокоманду ПесочныеЧасы (Hourglass), но со значением Нет (No) аргумента
Включить (Hourglass On). Строго говоря,
эту макрокоманду лучше поставить перед макрокомандой вывода сообщения на экран.
Сделать это элементарно, поскольку макрокоманды легко меняются местами с помощью
мыши. Чтобы поменять две последние макрокоманды местами, выделите последнюю
строку, щелкнув левой кнопкой мыши по области выделения строк (слева в окне
Конструктора) и перетащите строку вверх. Горизонтальная линия показывает место
нового положения строки. Отпустите кнопку мыши, когда эта линия окажется над
предпоследней строкой. Теперь остается
только сохранить созданный макрос. Для этого можно выбрать в меню Файл
(File) команду Сохранить как (Save As) или нажать клавишу
<F12>. Появится окно сохранения макроса. Введите в поле ввода имя макроса,
соблюдая правила именования объектов Access, например Менеджеры по
продажам. Замечание
При разработке
приложения с использованием макросов количество макросов может оказаться очень
большим. Поэтому важно хорошо организовать доступ к нужным макросам. Для этого в
одном объекте Макрос (Macro) можно объединить несколько макросов.
Например, рекомендуется все макросы, связанные с событиями в форме или отчете,
объединить в отдельный объект, соответствующий данной форме или отчету. Для того
чтобы можно было это сделать, каждый макрос группы должен иметь свое имя, а имя
объекта Макрос (Macro) будет являться именем группы
макросов. Чтобы создать
группу макросов:
Рис.
11.3. Создание группы макросов На рис. 11.З в
окне Конструктора представлен макрос "Сотрудники" (Employees) базы данных
"Борей" (Northwind). Для указания конца макроса не требуется отдельной
макрокоманды. Access продолжает выполнение макроса, входящего в группу, пока не
обнаружит строку, содержащую имя в столбце "Имя макроса" (Macro Name), либо пока
не дойдет до последней строки окна макросов. При обработке
макроса пустые строки игнорируются, поэтому их удобно использовать для
разделения макросов в группе. Этот прием, а также ввод комментариев для сложных
макросов, состоящих из большого числа макрокоманд, позволяет улучшить читаемость
макросов. Для запуска
одного из макросов группы используется полное имя для ссылки на макрос. Полное
имя макроса формируется таким образом: имяГруппы.имяМакроса. Замечание
В примерах
макросов, которые мы приводили раньше, использовался последовательный порядок
выполнения макрокоманд. Однако, как и в любой программе, порядок выполнения макрокоманд в
макросе может быть изменен. Для этого вводятся условия выполнения или пропуска
макрокоманд. Эти условия задаются в виде выражений в специальном столбце,
который появляется в окне Конструктора макросов, если нажата кнопка Условия
(Conditions) на панели инструментов (рис. 11.4). Замечание
Рис. 11.4.
Применение условий в макросах На рис. 11.4
приведено окно Конструктора для группы макросов "Наклейки для 'клиентов"
(Customer Label Dialog), используемой для печати отчета в виде наклеек на
конверты. Причем можно напечатать наклейки сразу для всех клиентов или для
клиентов одной страны, выбранной из списка. В окне виден столбец "Условие"
(Condition). Если условие, заданное в этом столбце, истинно, выполняется
макрокоманда, находящаяся в этой строке. Если условие ложно, соответствующая
макрокоманда пропускается и выполняется следующая. Если требуется
при истинности условия выполнить сразу несколько макрокоманд, то для всех
макрокоманд, кроме первой, в столбце "Условие" (Condition) ставится многоточие
(...). Условие, которое должно проверяться, пишется в строке первой
макрокоманды. Тогда, если оно истинно, выполняется весь набор макрокоманд от
этого условия и до следующей макрокоманды с заданным условием, до следующего
макроса или до конца макроса. Если условие ложно, пропускаются все команды,
помеченные многоточием,
включая макрокоманду с заданным условием. Далее выполняется макрокоманда,
следующая за пропущенными, в которой содержится новое условие или поле "Условие"
(Condition) не заполнено. Таким образом, в отличие от "большинства языков
программирования, в макросах нет альтернативного ветвления. Для того чтобы
создать макрос с двумя альтернативными ветвями, нужно сначала ввести условие и
определить макрокоманды, исполняемые при выполнении этого условия. Сразу после
них необходимо указать обратное условие и определить макрокоманды, исполняемые в
альтернативной ветви. Затем можно ввести макрокоманды, которые исполняются
безусловно. Такой способ ветвления используется, например, в макросе "Просмотр"
(Preview), который связан с кнопкой Просмотр (Preview) в данной форме.
Если пользователь выбрал вариант для всех стран (АН Countries), что
определяется значением 1 элемента управления ПечатьНаклеек
(PrintLabelFor), то отчет открывается в режиме Предварительного просмотра и
форма закрывается. Если выбран переключатель для конкретной страны
(Specific Country)", а страна не выбрана (значение поля со списком
"ВыборСтраны" (SelectCountry) не задано), то выдается сообщение, фокус
устанавливается в поле со списком для выбора страны и выполнение макроса
прекращается. Если страна задана, то отображается отчет для выбранной страны и
форма закрывается. В этом макросе
используется макрокоманда ОстановитьМакрос (StopMacro). Она позволяет прекратить
выполнение макроса, при этом все макрокоманды, следующие по порядку за
макрокомандой ОстановитьМакрос (StopMacro), не будут выполняться. Замечание
Способов запуска
макросов очень много. Среди них есть прямые способы, когда макрос запускается
непосредственно пользователем. Эти способы используются обычно при тестировании
макросов. Когда макрос отлажен, создают специальную команду меню или кнопку на
панели инструментов или связывают макрос с каким-либо событием в форме или
отчете. В данном разделе мы рассмотрим все возможные способы запуска
макроса. Универсальным
способом запуска макроса является использование команды меню Сервис, Макрос,
Выполнить макрос (Tools, Macro, Run Macro) (рис. 11.5). В появившемся
при выборе этой команды диалоговом окне нужно указать (ввести или выбрать из
списка) полное имя макроса, т. е. имяГруппы.имяМакроса (рис. 11.6). Этот способ
позволяет выполнить макрос из любого активного окна, будь то окно макросов, окно
базы данных или, например, Конструктор форм.
Рис. 11.5.
Запуск макроса с помощью команды меню
Рис. 11.6.
Диалоговое окно Запуск макроса Запуск макроса из окна Конструктора макросов Этот способ
применяется для тестирования только что созданного или исправленного макроса.
Если макрос в окне Конструктора макросов один, то для его запуска нужно просто
нажать кнопку Запуск (Run) на панели инструментов или выбрать команду
Запуск, По шагам (Run, Single Step) (последний способ позволяет отладить
макрос). Однако, если макросов несколько, то с помощью этой кнопки или команды
можно запустить только первый макрос в группе. Чтобы запустить любой другой
макрос из группы, нужно воспользоваться командой меню Сервис, Макрос,
Выполнить макрос (Tools, Macro, Run Macro). Если вы часто
используете этот способ запуска макроса, имеет смысл настроить панель
инструментов, добавив на нее стандартную кнопку Запуск (Run Macro). Она
эквивалентна выполнению команды меню Сервис, Макрос, Выполнить макрос
(Tools, Macro, Run Macro). (0 настройке панелей инструментов см. разд.
"Создание и изменение панелей инструментов" гл. 14.) Запуск макроса из окна базы данных Чтобы запустить
макрос из окна База данных (Database), щелкните по ярлыку Макросы
(Macros) на панели объектов, найдите в списке нужный макрос и дважды
щелкните по нему кнопкой мыши или нажмите кнопку Запуск (Run) на панели
инструментов окна База данных. Последний способ подходит, только если в
выбранном объекте содержится один макрос. В противном случае нужно
воспользоваться универсальным способом выполнения макроса, описанным
выше. Замечание
Запуск макроса с помощью кнопки на панели
инструментов Прямые способы
запуска макросов являются простыми, но не самыми быстрыми. Существуют более
удобные и быстрые способы. Наиболее удобный с нашей точки зрения способ запуска
макроса — это создание специальной кнопки на панели инструментов. Правда,
стандартных панелей инструментов в Access много, и в разных режимах работы на
экране появляются соответствующие панели. Поэтому наиболее разумным является
создание специальной панели инструментов, на которую вы можете поместить все
нужные кнопки. Тем не менее операция добавления специальной кнопки на
стандартную панель инструментов чрезвычайно проста. Чтобы добавить
кнопку на стандартную панель инструментов Access:
Рис. 11.7.
Создание кнопки на панели инструментов для запуска
макроса Замечание
Чтобы удалить с
экрана панель инструментов, на которую вы только что добавили кнопку, щелкните
правой кнопкой мыши в области панелей инструментов и в списке стандартных
панелей команд снимите флажок слева от названия панели (рис. 11.
8).
Рис. 11.8.
Контекстное меню со списком панелей команд Теперь
рассмотрим создание специальной панели инструментов и размещение на ней кнопки
вызова макроса.
На панели
появляется кнопка с уже знакомым значком макроса. Кнопка получает такое же
название, как имя макроса, для которого она создана. Если нужно
создать панель инструментов для вызова нескольких макросов, мы рекомендуем
объединить эти макросы в одну группу (создание группы макросов было описано в
предыдущем разделе). Тогда при выполнении команды меню Сервис, Макрос,
Создать панель инструментов из макроса (Tools, Macro, Create Toolbar from
Macro) будет создана панель инструментов, на которой каждому макросу группы
будет соответствовать своя кнопка. При этом на кнопках отображаются имена
соответствующих макросов. Новая панель инструментов получает такое же имя, как
имя группы макросов. Попробуйте выполнить эту команду для одной из групп
макросов в базе данных "Борей" (Northwind), например "Клиенты" (Customers). При
желании можно заменить текст на кнопках значками. Дополнительная информация о
настройке панелей инструментов приложения, и, в частности, об удалении кнопок с
панелей и удалении самих панелей, изменении вида этих кнопок, представлена в
разд. "Создание и изменение панелей команд" гл. 14. Запуск макроса с помощью команды меню Еще одним
распространенным способом запуска макроса является запуск с помощью специально
созданной для этого команды меню. Способы создания команд меню для запуска
макросов очень похожи на те, что применяются для создания кнопок на панели
инструментов. Например, можно воспользоваться для этого командой меню Сервис,
Макрос, Создать меню из макроса (Tools, Macro, Create Menu from
Macro). Более подробно
создание и настройка пользовательских меню рассматриваются в разд. "Создание
и изменение панелей команд" гл. 14. Поэтому в данном разделе мы не будем
рассматривать создание команды меню из макроса. Запуск макроса с помощью комбинации клавиш Для запуска
макроса можно назначить комбинацию клавиш. Для этого необходимо создать
специальную группу макросов — "AutoKeys". Эта группа макросов должна для каждой
назначенной вами комбинации клавиш содержать макрокоманду запуска
соответствующего макроса. Пример группы макросов "AutoK"eys приведен в базе
данных "Борей". Откройте эту группу макросов в режиме Конструктора. Она содержит
один макрос (рис. 11.9). Имя макроса— это запись комбинации клавиш
<Ctrl>+<P>. Сам макрос состоит из одной макрокоманды ЗапускМакроса
(RunMacro), которая запускает макрос "Телефоны клиентов. Печать" (Customer Phone
List.Print). Макрос "AutoKeys" просматривается каждый раз, когда пользователь
вводит специальные комбинации клавиш, например <Ctrl>+<P>. Если введенная
комбинация клавиш найдена в "AutoKeys", то запускается соответствующий
макрос.
Рис. 11.9.
Пример макроса "AutoKeys" Этот способ
запуска макроса, безусловно, является самым быстрым, однако он имеет
существенный недостаток: свободных комбинаций клавиш очень немного. И хотя
комбинации, определенные в "AutoKeys", имеют более высокий приоритет, чем
стандартные (например, <Ctrl>+<C> — копировать), заменять
стандартное назначение комбинаций клавиш не рекомендуется. Разрешенные
комбинации клавиш приведены в табл. 11.2. Комбинации с клавишей <Alt> в
данном случае не применяются, т. к. используются для запуска команд меню и
нажатия кнопок. Таблица
11.2. Разрешенные комбинации клавиш
Запуск макроса при открытии базы данных При открытии
базы данных Microsoft Access могут выполняться некоторые действия. Чаще всего
это открытие специальной формы, так называемой Главной кнопочной формы, вывод
специальных меню или панелей инструментов, скрытие стандартных меню и т. д. Для
определения этих действий используется диалоговое окно Параметры запуска
(Startup). Однако иногда требуется при запуске приложения выполнить более
сложный набор действий, чем тот, что позволяет задать это диалоговое окно.
Например, может потребоваться заранее открыть несколько форм (не показывая их на
экране), чтобы потом их отображение не занимало много времени, проверить
некоторые условия или запросить ввод некоторых данных. Все это можно сделать с
помощью специального макроса, который называется "AutoExec". При открытии базы
данных Access проверяет наличие этого макроса и, если он существует, выполняет
его. При создании макроса "AutoExec" следует помнить, что Access сначала
выполнит действия, определенные в окне Параметры запуска (Startup), а
затем — макрос "AutoExec", поэтому в них не должно быть противоречивых
действий. Запуск макроса из другого макроса Иногда требуется вызвать макрос из другого макроса. Это можно сделать с помощью макрокоманды ЗапускМакроса (RunMacro). Мы уже встречались с этой макрокомандой при описании макроса "AutoKeys". Здесь нужно отметить, что эта макрокоманда имеет три аргумента: кроме имени макроса, задается число повторов выполнения макрокоманды и условие повтора. Таким образом, эта макрокоманда позволяет организовывать циклы. Аргумент Число повторов (Repeat Count) задает количество вызовов макроса. Аргумент Условие повтора (Repeat Expression) является выражением, которое может принимать значение Истина или Ложь. Перед выполнением макрокоманды ЗапускМакроса (RunMacro) проверяется значение этого выражения. Если оно Истина, то макрос выполняется, если Ложь, то макрос не выполняется и управление передается следующей макрокоманде. Если эти два аргумента не заданы, макрос выполняется только один раз. Если заданы оба эти аргумента, цикл вызова прекращается, когда макрос выполнился заданное число раз либо когда заданное условие окажется невыполненным и получит значение Ложь. Замечание
Наиболее часто
макросы используются в приложении Access для обработки событий. Событие —
это любое действие, распознаваемое объектом, и можно определить реакцию
объекта на событие. События происходят в результате действий пользователя,
выполнения инструкций VBA или генерируются системой. Примером событий
является вывод на экран
формы, отчета, ввод данных в текстовое поле, нажатие кнопки мыши или клавиши.
Каждому из этих событий можно назначить макрос или процедуру VBA, которые будут
автоматически выполняться в ответ на произошедшее событие. Практически все
программирование в Access сводится к написанию макросов или процедур,
обрабатывающих события, т. е. программируется реакция объектов на события.
Существует большое количество различного рода событий, на которые реагируют
объекты, причем часто возникает не одно, а целая последовательность событий.
Поэтому необходимо обладать определенным умением, чтобы решить, какому событию
следует назначить созданный вами макрос или процедуру VBA. Все тонкости этого
выбора будут обсуждаться в разд. "Программирование в формах и отчетах" гл.
13. Здесь мы опишем только способ назначения макроса событию и приведем
примеры обработки событий с помощью макросов. Начнем с самого
простого. Откроем форму "Клиенты" (Customers) в базе данных "Борей". В этой
форме отображается информация о клиенте. Допустим, мы хотели бы видеть не только
эту информацию, но и данные о купленных клиентом продуктах. Было бы хорошо
создать кнопку Заказы клиента, при нажатии которой появлялась бы форма
"Заказы" (Orders) с заказами только того клиента, который в данный момент выбран
в форме "Клиенты" (Customers). Для того чтобы получить желаемое, создадим
макрос, который будет выполняться, когда произойдет событие Нажатие кнопки
(On Click) в форме "Клиенты" (Customers). Чтобы создать
макрос, определяющий описанную реакцию приложения на событие Нажатие кнопки
(OnClick):
Рис.
11.10. Диалоговое окно свойств кнопки
Рис.
11.11. Диалоговое окно Построитель
Таблица
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).
Теперь остается
перейти в режим Формы и проверить, как макрос отрабатывает событие Нажатие
кнопки (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")). Таблица
11.4. Значения аргументов макрокоманды Закрыть
(Close)
Аргумент
Сохранение (Save) позволяет определить, будет ли Access при закрытии
формы отображать диалоговое окно для подтверждения сохранения измененных данных.
Поскольку мы открывали форму "Заказы" (Orders) в режиме только для чтения,
изменение данных запрещено, поэтому данному аргументу необходимо присвоить
значение Нет (No). Готовый макрос показан на рис. 11.13. Закройте окно
макроса, сохранив изменения. Измените имя макроса, назначенного событию
Включение (On Activate). Для этого выберите в списке или введите имя
Клиенты.Закрыть (Customers.Close) и нажмите клавишу <Enter>. Теперь
сохраните форму, перейдите в режим Формы и проверьте, как работают созданные
вами макросы.
Рис.
11.13. Макрос для закрытия формы Вызов макроса из процедуры VBA Как мы уже
говорили, процедуры VBA и макросы в Access являются объектами близкими и часто
взаимозаменяемыми, т. е. вместо макроса можно использовать процедуру VBA и
наоборот. Существуют способы запуска макроса из процедуры VBA, запуска процедуры
VBA из макроса, кроме того, Access позволяет преобразовать макрос в процедуру
VBA. Такое преобразование описано в разд. "Преобразование макросов в
процедуры VBA" данной главы. Для запуска
процедуры VBA из макроса существует специальная макрокоманда
ЗапускПрограммы(КипСоdе). Эта макрокоманда имеет один аргумент — имя вызываемой
процедуры, хотя вызываться может только функция, а не
подпрограмма. Для запуска
макроса из процедуры VBA применяется специальный метод ЗапускМакроса (RunMacro)
объекта DoCmd, например: DoCmd.RunMacro
"Макрос!". Объект DoCmd
используется в процедуре VBA для выполнения макрокоманд Access. При этом
английское имя нужной макрокоманды должно быть указано в качестве Метода объекта
DoCmd, например строка процедуры DoCmd.OpenForm
"Клиенты" позволяет
открыть форму "Клиенты". Здесь "Клиенты"— аргумент макрокоманды. Аргументы
перечисляются в предложении DoCmd через запятую. Таким способом может быть
выполнено большинство макрокоманд. Создание
процедур VBA мы рассмотрим ниже, в гл. 13. Отладка макросов и поиск ошибок Обычно для
отладки макроса его выполняют в пошаговом режиме. Для включения этого режима
необходимо нажать кнопку По шагам (Single Step) на панели инструментов в
окне Конструктора макросов или выбрать команду меню Запуск, По шагам
(Run, Single Step). Тогда перед выполнением каждой макрокоманды будет
появляться диалоговое окно Пошаговое исполнение макроса (Macro Single
Step) (рис. 11.14). В этом окне
отображаются имя макроса, имя исполняемой макрокоманды, условие ее исполнения и
аргументы. При этом в полях Условие (Condition) и Аргументы
(Arguments) видны значения условного выражения и аргументов макрокоманды.
Если в строке макрокоманды условие не указано, в поле Условие (Condition) всегда
будет показываться значение Истина (True). Кнопки справа от полей в этом
окне позволяют выполнить очередную макрокоманду, прервать выполнение макроса
(например, если видно, что аргументы вычислены неправильно) и продолжить
выполнение в обычном режиме, т. е. не по шагам.
Рис.
11.14. Диалоговое окно Пошаговое исполнение
макроса Если в процессе
выполнения макроса возникла ошибка, появляется диалоговое окно Ошибка
выполнения макроса (Action Failed), аналогичное окну Пошаговое исполнение
макроса (Macro Single Step), но без возможности продолжить процесс (кнопки
Шаг (Step) и Продолжить (Continue) недоступны). Можно только
прервать выполнение макроса, нажав кнопку Прервать (Halt). В окне
отображается макрокоманда, содержащая ошибку. Поиск ошибок в
макросах, как правило, не вызывает больших затруднений. Это связано с тем,
что:
Основные ошибки,
которые возникают в макросах, связаны либо с неправильным вводом имен объектов,
и тогда Access не может найти соответствующий объект, либо с тем, что объекты,
на которые ссылается макрокоманда, недоступны, например форма не открыта.
Поэтому при возникновении ошибки в первую очередь нужно проверить, правильно ли
введены имена объектов и открыты ли формы, использованные в условиях или
аргументах макрокоманд. Совет
Стандартным
приемом отладки как процедур, так и макросов, является вывод на экран
специальных сообщений, говорящих о прохождении определенных этапов процесса. В
макросах это осуществляется путем вставки дополнительных макрокоманд
ВыводСообщения (MsgBox) для отображения таких сообщений. Причем в сообщении
можно вывести значения свойств элементов управления, например: "Цена товара = "
& Forms!Товары!Цена Можно легко
отключить вывод на экран отладочных сообщений, для чего введите в столбец
"Условия" (Condition) напротив соответствующих макрокоманд значение
Ложь. Еще один
стандартный прием — установка точек останова. Его применяют для того, чтобы
остановить выполнение макроса в определенной точке до завершения процесса. Для
этого используется макрокоманда ОстановитьМакрос (StopMacro). Макрос будет
выполняться до макрокоманды ОстановитьМакрос (StopMacro), после этого можно
проверить результаты. Таким образом, можно локализовать ошибку с точностью до
макрокоманды. Макросы могут
применяться для решения самых разнообразных задач. В первом разделе данной главы
мы привели таблицу макрокоманд, сгруппированных по категориям. Теперь рассмотрим
применение макрокоманд некоторых категорий. Работа с данными в формах и отчетах В эту категорию
входит набор макрокоманд, обеспечивающих отбор данных, перемещение по данным и
обновление данных в формах. Прежде чем перейти к примерам использования
макросов, покажем, как применять ссылки на формы, отчеты и элементы управления в
аргументах и условиях макрокоманд, поскольку такие ссылки используются очень
часто. Ссылки на формы, отчеты и их свойства Чтобы задать
ссылку на форму или отчет, нужно сначала определить, в какое семейство
(collection) входит объект, на который создается ссылка. (Подробнее о
семействах и составляющих их объектах см. гл. 13.) Все открытые формы входят
в семейство Формы (Forms), а открытые отчеты — в семейство Отчеты (Reports).
Полная ссылка на форму или отчет должна состоять из двух частей:
имяСемейства!имяОбъекта. Причем если имя объекта содержит пробелы или
специальные символы, то его нужно заключить в квадратные скобки. Если пробелы в
имени не используются, скобки можно не ставить. Таким образом, ссылка на форму
будет выглядеть так: Forms![Заказы клиента] ИЛИ Forms!Клиенты Для отчета ссылки
выглядят аналогично: Reports! [Отчет
о продажах] ИЛИ Reports!Прайс-лист Ссылка на свойство формы или отчета состоит
из трех частей: имяСемейства!имяОбъекта.имяСвойства Например: Forms!Клиенты.Visible или Reports![Продажи за период].MenuBar Свойство
Вывод на экран (Visible) определяет, будет ли форма видна на экрану или
спрятана, а свойство Меню (MenuBar) позволяет связать с отчетом или
формой специальное меню. Ссылки на элементы управления форм, отчетов и их
свойства Чтобы создать
ссылку на элемент управления или его свойство, необходимо указать его имя. Если
имя содержит пробелы, оно заключается в квадратные скобки. Ссылка на элемент
управления в форме или отчете состоит из трех частей: имяСемейства!имяОбъекта!имяЭлемента Например, ссылка
на элемент управления Номер заказа в форме "Заказы клиента" выглядит так: Forms![Заказы
клиента]![Номер заказа] Ссылка на
элемент управления Сумма в отчете "Продажи за период" выглядит
так: Reports![Продажи за
период]![Сумма] Ссылка на
свойство элемента управления состоит из четырех частей: имяСемейства!имяОбъекта!имяЭлемента.имяСвойства Например: Forms![Заказы
клиента]![Номер заказа].Enabled Свойство
Доступ (Enabled) позволяет запретить или разрешить доступ к элементу
управления. Объект может
иметь свойство, используемое по умолчанию. Это свойство применяется в том
случае, когда имя свойства в ссылке явно не указано. Например, у элементов управления по умолчанию
используется свойство Значение (Value), поэтому ссылка Forms! Товары!
Цена позволяет получить доступ к значению, отображенному в текстовом поле
"Цена". Ссылки на подчиненные формы и отчеты На подчиненную
форму или отчет можно ссылаться так же, как и на любой другой элемент
управления, т. к. подчиненная форма и подчиненный отчет являются одним из типов
элементов управления. Например: Forms!Заказы!ПодформаТовары Здесь
ПодформаТовары — это имя элемента управления в форме "Заказы", который
представляет собой подчиненную форму. А вот ссылка на
элемент управления в подчиненной форме или отчете имеет особую структуру: после
имени элемента управления, который является подчиненной формой, нужно сначала
указать специальное свойство: Form — для форм или Report — для отчетов, а затем
имя элемента управления, на который выполняется ссылка: Forms!Заказы!ТоварыПодформа.Form![Код Товара] Фильтрация записей в формах, отчетах, таблицах Перейдем к
примерам применения макрокоманд Access. Для отбора записей в формах, отчетах,
таблицах используется макрокоманда Приме нить Фильтр (ApplyFilter). Задать
фильтр можно двумя способами: либо указав имя заранее созданного фильтра в
аргументе Имя фильтра (Filter Name), либо непосредственно задав условие
выборки в аргументе Условие отбора (Where Condition). Если фильтр нужно
применить сразу при открытии формы, тогда с событием Открытие (On Open)
формы необходимо связать макрос, содержащий макрокоманду ПрименитьФильтр
(ApplyFilter). Если нужно менять набор отображаемых записей в открытой форме
динамически, поступают следующим образом:
Пример такого
решения приведен на рис. 11.15. На этом рисунке представлена форма "Товары"
(Products), позволяющая просматривать товары с выборкой по различным
критериям. Эта форма
построена на основе таблицы "Товары" (Products) с помощью Мастера автоматической
генерации ленточных форм. Затем в режиме Конструктора форм к ней добавлены поля
для определения критериев выбора и кнопки для применения и отмены фильтра.
Соответствующие макросы, связанные с событием Нажатие, кнопки (On Click),
приведены на рис. 11.16. Для отмены фильтра используется макрокоманда
ПоказатьВсеЗаписи(ShowAllRecords).
Рис.
11.15. Форма для отбора записей по заданным
критериям
Рис.
11.16. Макросы для установки и отмены фильтра в форме
"Товары" На рис. 11.16
представлено два макроса: УстановитьФильтр и Отменить Фильтр. В диалоговом окне
Область ввода (Zoom) отображено значение аргумента Условие отбора
(Where Condition) макрокоманды ПрименитьФильтр (ApplyFilter). Обратите
внимание, условие получилось довольно сложным, а длина поля Условие отбора
(Where Condition) ограничена 255 символами. Поэтому, если бы мы включили в
условия отбора еще одно поле, например "Поставки прекращены", нам пришлось бы
отдельно создать специальный фильтр и задать его имя в аргументе Имя фильтра
(Filter Name). В макросе
"ОтменитьФильтр", кроме макрокоманды ПоказатьВсеЗаписи(ShowAllRecords),
нужны еще две
макрокоманды, чтобы очистить поля " ВыборПоставщика" и "ВыборТипа", т. е.
присвоить им значение Пусто (Null). Это делается с помощью макрокоманды
ЗадатьЗначение(SetValue). Эта группа
макрокоманд связана с перемещением по записям и элементам управления. В качестве
примера применения макрокоманд этой группы рассмотрим ситуацию, когда
пользователь работает с формой "Клиенты" и хочет найти заказ текущего клиента,
номер которого ему известен. Давайте вернемся к примеру, приведенному в разд.
"Назначение макроса событию". Тогда мы создали.в форме "Клиенты" кнопку
Заказы клиента для отображения заказов выбранного клиента. Попробуем
усовершенствовать эти формы. Если номер заказа известен пользователю, он может
ввести его в текстовое поле Поиск заказа, которое можно добавить в форму
"Клиенты" (Customers). Тогда в открываемой форме "Заказы" (Orders) следует сразу
показать запись, содержащую соответствующий счет. Добавим поле "Поиск заказа" в
заголовок формы и сделаем так, чтобы при открытии формы "Заказы" (Orders)
проверялось значение этого поля и, если оно не пустое, производился бы поиск
счета с указанным номером и выполнялся переход на соответствующую запись. В
противном случае текущей становилась бы первая запись из отфильтрованного набора
записей. На рис. 11.17 показана форма "Клиенты" (Customers) с новым полем и
макрос "Поиск заказа", который связан с событием Загрузка (On Load) формы
"Заказы" (Orders). Поскольку
добавленный макрос обработки события ссылается на элемент управления в форме
"Клиенты" (Customers), он должен выполняться только в том случае, если эта форма
открыта, и, кроме того, поиск должен производиться только тогда, когда поле
"Поиск заказа" не пусто. Исходя из этого формируются условия макроса. Прежде чем
производить поиск записи по образцу в одном из полей, необходимо активизировать
это поле, для чего используется макрокоманда КЭлементуУправления(GoToControl) .
С ее помощью устанавливается фокус на поле "КодЗаказа" (Orderld). Но это поле в
форме "Заказы" (Orders) недоступно, поэтому сначала нужно изменить значение
свойства Доступ (Enabled) этого поля. В противном случае выполнение
макрокоманды КЭлементуУправления (GoToControl) приведет к возникновению
ошибки. Макрокоманда
КЭлементуУправления (GoToControl) используется, как правило", если требуется
изменить стандартный порядок перехода между полями в форме. Обычно переход между
полями выполняется с помощью клавиши <Таb>, однако иногда требуется
пропустить ряд полей и переместить фокус к определенному элементу управления. Это может зависеть
от каких-либо условий, например от значения поля. В этом случае на событие
После обновления (After Update) для данного прля назначается макрос,
который перемещает фокус на нужный элемент управления в форме. В качестве
аргумента для макрокоманды необходимо указать короткое имя элемента управления.
В случае излишне длинного имени переход к элементу управления не произойдет и
отобразится сообщение об ошибке.
Рис.
11.17. Пример макроса для перемещения по данным Обновление данных в формах и элементах управления Последняя группа
макрокоманд в рассматриваемой категории связана с обновлением данных в активных
формах, таблицах и запросах. Если несколько человек в сети одновременно изменяют
данные, то формы и таблицы у конкретного пользователя могут не отражать
актуальных данных. Для того чтобы отображаемые данные соответствовали текущему
состоянию базы данных, их необходимо обновить с помощью команды Записи,
Обновить (Record, Refresh) (см. разд. "Работа с записями"гл.
2). Похожая ситуация возникает даже в однопользовательском режиме, если в |