Андроид. Windows. Антивирусы. Гаджеты. Железо. Игры. Интернет. Операционные системы. Программы.

Как пишут макрокоманды (экшены). Изменения в макрокомандах. Создание и запись макрокоманд Контрольные вопросы для самопроверки

Из этой лекции вы узнаете следующее:

  • для чего нужны макросы;
  • как создать и использовать макрос;
  • как экспортировать и импортировать макросы;
  • как обеспечить безопасность при работе с макросами.

9.1. Что такое макросы и зачем они нужны

У каждого опытного пользователя интерфейс Microsoft Word уникальный и изменяется в зависимости от того, какие инструменты ему необходимы в работе. Вы вряд ли увидите одинаковые панели инструментов или пункты главного меню - чтобы сделать работу наиболее удобной, каждый пользователь стремится настроить программу по-своему. Однако иногда изменения только интерфейса (вынесение основных команд на панель инструментов и создание пользовательских меню ) недостаточно.

Если работа однообразная, то пользователю приходится часто повторять те или иные команды в определенной последовательности (например, оформлять текст курсивом, кеглем 10, гарнитурой Arial). Чтобы произвести такое небольшое форматирование , может понадобиться достаточно большое количество времени, особенно если таким образом необходимо выделить несколько десятков слов. Получается, что для каждого участка нужно проделывать несколько операций. Конечно, можно отформатировать только один участок и создать пользовательский стиль, но и это не самый быстрый способ применения оформления.

Если вам часто приходится выполнять одни и те же действия, то эффективность вашей работы можно заметно увеличить при помощи макросов. Макросы - это небольшие программы на языке Visual Basic . Они могут помочь не только в ситуациях, когда требуется много раз выполнить сложное форматирование , но и при вставке объектов, печати выделенного текста и в других случаях.

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

Макросы бывают двух типов: внутренние и внешние. Внутренние внедряются непосредственно в документ или шаблон и могут быть выполнены, только если пользователь работает с данным файлом. Если вы создали макрос для шаблона Normal, то его можно будет выполнять только для документов, созданных на основе этого шаблона. Преимущество таких макросов в том, что они вместе с документом перемещаются по жесткому диску, а также с компьютера на компьютер .

Внешний макрос можно применять в случае, если он полезен при работе с документами, созданными на основе разных шаблонов. Если вы пользуетесь большим количеством шаблонов, то вносить в каждый из них макрос будет неудобно, как придется делать при использовании внутреннего макроса. Внешний же макрос можно применять для работы с любыми документами, а также свободно переносить с компьютера на компьютер . Для создания внешнего макроса его нужно сохранить с расширением BAS .

9.2. Создание макросов

Самый простой способ создания макроса - запись нужных действий в документе. Записав последовательность команд один раз, можно будет вызывать макрос щелчком мышью, когда нужно выполнить такие же действия. Для записи макросов сделайте следующее.

Назначение макроса кнопке

Если вам будет удобно вызывать макрос с панели быстрого запуска, то нажмите кнопку кнопке в области Назначить макрос . В появившемся диалоговом окне Параметры Word сделайте следующее.


Назначение макроса клавишам

Многие пользователи предпочитают использовать для выполнения разных действий сочетания клавиш. Вы можете назначить сочетания клавиш макросам, которые наиболее часто применяете. Для этого сделайте следующее.


Запись макроса

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

Упражнение 9.1. Запись макроса

Создадим макрос, с помощью которого можно щелчком мышью применить к выделенному участку текста гарнитуру Arial, полужирное начертание и размер шрифта 10.

Когда появится панель записи макроса, сделайте следующее.


Теперь можно проверить его действие. Откройте любой документ, выделите требуемый участок и вызовите макрос с помощью кнопки на панели быстрого запуска или сочетания клавиш. Вы увидите, что форматировать текст, используя макрос, гораздо удобнее, чем каким-либо другим способом.

Если вам понравилась макрокоманда Spatter Frame , то у вас неминуемо возникнет желание адаптировать ее в соответствии со своими потребностями. Некоторую часть этой работы можно проделать, не изменяя макрокоманду. Например, можно изменять параметры фильтра для того, чтобы задавать степень неровности краев. По умолчанию данная макрокоманда при выполнении не запрашивает никаких параметров, а пользуется заданными при ее записи. Вы можете указать макрокоманде на необходимость выдачи запросов относительно любой команды, имеющей какие-либо параметры. Продемонстрируем на примере параметров фильтра Spatter .

  1. Выберите первый снимок в палитре History . Это вернет изображение в первоначальное состояние.
  2. Найдите в палитре Actions строку с командой Spatter и щелкните на пустом прямоугольнике слева от имени команды. В нем появится пиктограмма, изображающая диалоговое окно, представленная на рисунке.
  3. Spatter Frameb .
  4. Actions .
  5. При выполнении команды Spatter Photoshop откроет диалоговое окно фильтра, в котором вы сможете выбрать желаемые параметры. Попробуйте, например, уменьшить значение Smoothness до 2.
  6. Нажмите кнопку ОК . Макрокоманда продолжит выполнение.

Заметьте, что каждое новое выполнение макрокоманды создает новый снимок исходного состояния документа. Это очень полезно, но не всегда необходимо. Например, если вы подбираете параметры команд,то с каждой пробой будет появляться новый снимок. С другой стороны, удалять команду создания снимка тоже нежелательно - можно безвозвратно потерять результаты предыдущей работы,еслимакрокоманданеподойдет. Выход в том, чтобы временно отменить выполнение ненужной команды.

  1. Щелкните на галочке, слева от имени команды Make snapshot в палитре Actions .
  2. Выберите имя всей макрокоманды Spatter Frame.
  3. Запустите макрокоманду на выполнение щелчком на соответствующей пиктограмме в палитре Actions .
  4. Откройте палитру History и убедитесь, что новый снимок не был создан. Использование временного отключения той или иной команды очень полезно при создании собственных макрокоманд и при их отладке. Дальнейшие изменения обязательно затронут саму макрокоманду и потребуют записи новых команд и удаления существующих.

Запись макрокоманды.

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

  1. Активизируйте слой Layer 1.
  2. Разместим макрокоманду в новом наборе макрокоманд. В палитре Actions нажмите кнопку создания нового набора макрокомандCreate new set .
  3. В открывшемся диалоговом окне New Set введите имя нового набора, например, "My Actions".
  4. Нажмите кнопку ОК. В палитре появился новый набор.
  5. В палитре Actions выберите пиктограмму создания новой макрокоманды Create new action.
  6. В появившемся диалоговом окне New Action введите имя макрокоманды в поле Name , например, "Center (Layer)". Ниже этого поля расположен список всех наборов макрокоманд, присутствующих в палитре. По умолчанию в нем выбран выделенный набор, My Actions. Остальными элементами этого диалогового окна займемся чуть позже.

Совет. Когда вы создаете свою макрокоманду, указывайте с чем она работает. Если макрокоманда требует для работы изображения на отдельном слое, укажите в скобках "Layer". Если же для ее функционирования необходима выделенная область, укажите "Selection". Такие обозначения приняты при обмене макрокомандами.

  1. Нажмите кнопку Record . С этого момента все ваши действия в программе будут записываться в макрокоманду Center (Layer). После выполнения каждой команды сразу же смотрите в палитру Actions , проверяя результат ее записи. Пиктограмма записи в палитре подсвечена красным цветом.
  2. Выберите команду All меню Select или нажмите клавиши CTRL+A . В палитре Actions появилась первая команда Set Selection с параметромТо , соответствующим выделению всего холста (All ).
  3. Выберите команду Cut меню Edit Actions.
  4. Выберите команду Paste меню Edit . Соответствующая команда появится и в палитре Actions.

Совет. Если при записи макрокоманды вы ошибочно сделали не то действие и сразу же это обнаружили, выберите команду Undo меню Edit . Ошибочная команда из палитры Actions при этом не исчезнет, но изображение вернется в предыдущее состояние. Далее просто введите верную команду. Оставшуюся в палитре неправильную команду несложно удалить после завершения записи. Для этого нужно просто перетащить строку команды к пиктограмме удаления.

  1. Все действия макрокоманды выполнены и пора остановить запись. Щелкните на пиктограмме остановки записи в палитре Actions .

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

  1. Выберите в палитре Actions заголовок созданной макрокоманды.
  2. Выполните команду Insert Stop... из меню палитры Actions . В открывшемся диалоговом окне Record Stop увидите поле Message , в которое можете ввести несколько строк комментария, и флажок Allow Continue , определяющий, разрешить или нет дальнейшее выполнение макрокоманды. Введите текст комментария и установите флажок Allow Continue.
  3. Нажмите кнопку ОК .
  4. Переместите команду Stop в палитре Actions на первое место в нашей макрокоманде тем же способом, которым меняли порядок слоев в палитре слоев -Drag and Drop. Мы добавили комментарий к макросу, который, сможет остановить выполнение макроса, если пользователь нажмет Stop в открывшемся диалоговом окне.

В программировании, даже таком элементарном, требуется, чтобы программа освобождала все занятые ресурсы компьютера. Данная макрокоманда этому требованию не удовлетворяет, поскольку в буфере обмена осталось все содержимое слоя. Если изображение достаточно велико, то занятая память отрицательно скажется на производительности программы; С другой стороны, при переключении на любую другую программу и обратно, будет происходить передача содержимого буфера обмена между ними. Эго приведет к назойливой задержке. В качестве самостоятельной работы дополните макрокоманду командой Purge из меню Edit .

Примечание. Чтобы записать контур в макрокоманду, нужно его предварительно создать, а затем воспользоваться командой Insert Path меню палитры Actions . При проигрывании макрокоманды контур будет воспроизведен на новом изображении. Запись макрокоманд в Photoshop имеет значительные ограничения. Во-первых, не записываются действия инструментов рисования (Brush, Stamp, Eraser и пр.). Во-вторых, нет возможности управления ходом выполнения макрокоманды. Макрокоманда не может вызывать различные команды в зависимости от каких-либо условий, нельзя организовать циклическое выполнение группы команд, получение и использование информации о состоянии документа (размер, разрешение, цветовая модель, количество и типы слоев и каналов и т.п.).

Язык макросов является языком программирования, который позволяет реализовать задачи пользователя, выполняя необходимые действия над объектами Access и их элементами. Макрос — программа, состоящая из последовательности макрокоманд . Макрокоманда — это инструкция, ориентированная на выполнение определенного действия.

Например, макрокомандой можно открыть форму, отчет, напечатать отчет, запустить на выполнение запрос, применить фильтр, присвоить значение, создать свое меню для формы или отчета. Макрокоманда ЗадатьКомандуМеню позволяет выполнить любую заданную команду меню. Имеющийся в Access набор макрокоманд реализует практически любые действия, которые необходимы для решения задачи.

Язык макросов обеспечивает возможность выполнения большинства задач, не прибегая к программированию на Visual Basic. Макросы, являясь надстройкой над Visual Basic, обеспечивают пользователя средствами решения задач, не требующими знания детального программирования. Язык макросов является языком более высокого уровня, чем Visual Basic.

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

Заметим, что наличие аппарата запуска программ через события, вызываемые действиями пользователя, не исключает возможности написания программ на языке макросов, которые без вмешательства пользователя могут решать нужные задачи. В этом случае задача решается рядом взаимосвязанных макросов.

Для организации ветвлений в программе в макросе определяются условия выполнения макрокоманд. Пользователь запускает главную программу на выполнение и далее все управление ее выполнением осуществляется изнутри. Программа сама открывает необходимые объекты, выбирает и обрабатывает данные, вызывает другие макросы, следуя алгоритму, приводящему к решению задачи. При необходимости программа инициирует диалог с пользователем.

Конструирование макроса

Создание макросов осуществляется в диалоговом режиме и сводится к записи в окне макроса последовательности макрокоманд, для которых задаются параметры. Каждому макросу присваивается имя. При выполнении макроса макрокоманды выполняются последовательно в порядке их расположения. При этом используются объекты или данные, указанные в аргументах макрокоманд. Имеется возможность определить условия выполнения макрокоманды.

Выполнение макросов инициируется простой операцией и может сводиться к его открытию, как это делается и для других объектов базы данных. Помимо этого, Access предоставляет возможность автоматически инициировать выполнение макроса при наступлении некоторого события. Для связи макроса с событием достаточно в бланке свойств объекта или его элемента управления внести в строку этого события имя макроса. События, с которыми можно связать макрос, определяются в свойствах форм и отчетов и их элементах управления. Создание макроса начинается в окне базы данных, где надо выбрать закладку Макросы (Macros) и нажать кнопку Создать (New) . После этого открывается окно макроса.

Формирование макрокоманд в окне макроса

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

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

После ввода всех макрокоманд в макрос его надо сохранить, воспользовавшись командой меню Файл/Сохранить или кнопкой панели инструментов макроса.

Для выполнения макроса можно нажать кнопку панели инструментов Запуск . Если макрос уже закрыт, то для его выполнения надо в окне базы данных выбрать макрос и нажать кнопку Запуск в этом окне. Таким образом, по инициативе пользователя задача может решаться многократно.

Для просмотра и редактирования существующего макроса надо выбрать его в окне базы данных и нажать кнопку Конструктор .

Пример разработки макроса

Пусть необходимо рассчитать количество студентов в группах и внести эти данные в поле КОЛ таблицы ГРУППА . Подсчет количества студентов реализован запросом Число студентов в группе . Обновление поля КОЛ на основе полученных в этом запросе данных выполняет запрос Обновление ГРУППА_КОЛ . Последовательное выполнение этих запросов решает поставленную задачу.

  1. Сначала создадим запрос на обновление.
    Оформим окно конструктора запроса как показано на рисунке:

В схему данных запроса добавлены таблица Группа и таблица Число студентов , полученная после выполнения запроса на создание Число студентов в группе .

  1. Преобразуем запрос на выборку в запрос на обновление. Для этого выполним команду меню Запрос/Обновление . В строке Обновление введем имя поля таблицы Число студентов , из которой выбираются значения для обновления.
    Сохраним запрос на обновление под именем Обновление ГРУППА_КОЛ .
  2. Создадим макрос, состоящий из макрокоманд, показанных в окне конструктора:

В столбце Примечания записаны комментарии к макрокомандам. В зависимости от выбранной макрокоманды меняется нижняя часть окна конструктора — Аргументы макрокоманды . На рисунке активна макрокоманда СдвигРазмера , которая устанавливает положение и размеры окна таблицы Группа , демонстрируемого после ее обновления.

Сохраним макрос под именем Расчет количества студентов в группах . После нажатия кнопки Запуск получим результаты выполнения макроса, показанные на рисунке.

Поверх окна Группа выводится сообщение, в соответствии с последней макрокомандой.

Контрольные вопросы

  1. Чем отличаются макросы в Access от макросов в Word и Excel?
  2. Как организовать запуск макроса по некоторому событию?
  3. В чем сходство и различие между макросами и модулями в Access?
  4. Как получить справку о той или иной макрокоманде?
  5. Вывод каких сообщений в рассмотренном примере отключает макрокоманда ВыводНаЭкран?

Основной набор средств Microsoft Access, который мы рассматривали в предыдущих главах книги, ориентирован на пользователей, не владеющих языками программирования. Для программистов же к этим средствам добавлены макросы (небольшие программы на языке макрокоманд системы Access) и модули (процедуры на языке Visual Basic for Application, VBA). С их помощью можно существенно расширить функциональные возможности создаваемого вами приложения и настроить его на нужды конкретных пользователей. В этой главе мы познакомимся с одним из этих средств - макросами и одним из языков программирования Access - языком макрокоманд. С модулями и языком VBA мы вас познакомим в гл. 13,

Итак, мы будем обсуждать следующие вопросы:

  • Понятие макроса
  • Использование макросов в приложениях-
  • Создание макросов и групп макросов
  • Задание условий для управления процессом выполнения макроса
  • Различные способы запуска макросов
  • Советы по отладке макросов
  • Обработка событий в формах и отчетах с помощью макросов

Использование макросов в базе данных Microsoft Access

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

Макрос в Access представляет собой структуру, состоящую из одной или нескольких макрокоманд, которые выполняются либо последовательно, либо в порядке, заданном определенными условиями. Набор макрокоманд в Access очень широк, с помощью макросов можно реализовать многое из того, что позволяют сделать процедуры на VBA. Каждая макрокоманда имеет определенное имя и, возможно, один или несколько аргументов, которые задаются пользователем. Например, при использовании макрокоманды ОткрытьФорму (OpenForm) в качестве аргументов необходимо задать, по крайней мере, имя открываемой формы и режим вывода ее на экран.

В табл. 11.1 содержится список макрокоманд Microsoft Access 2002, сгруппированных по категориям: работа с данными в формах и отчетах; выполнение команд, макросов, процедур и запросов; работа с объектами; импорт/экспорт данных и объектов и прочие. В категорию «Прочие» собраны все макрокоманды, которые позволяют влиять на интерфейс приложения.

Категория Назначение Макрокоманда
Работа с данными в формах и отчетах Отбор данных Применить Фильтр (ApplyFilter)
Перемещение по данным СледующаяЗапись (FindNext) НайтиЗапись (FindRecord) КЭлементуУправления (GoToControl) НаСтраницу (GoToPage) НаЗапись (GoToRecord)
Обновление данных или экрана Обновление (Requery) ПоказатьВсеЗаписи (ShowAllRecords)
Выполнение Выполнение команды Выполнить Команду (RunComraand)
Выполнение макроса, процедуры или запроса ЗапускМакроса (RunMacro) Залуск Программы (RunCode) ОткрытьЗапрос (OpenQuery) 3anycк 3anpoca SQL (RunSQL)
Выполнение другого приложения Запуск Приложения (RunApp)
Прерывание выполнения Отменить Событие (CancelEvent) Остановить ВсеМакросы (StopAllMacros) ОстановитьМакрос (StopMacro)
Выход из Microsoft Access Выход (Quit)
Импорт/экспорт Передача объектов Microsoft Access в другие приложения Вывести В Формате (OutputTo) ОтправитьОбъект (SendObject)
Преобразование формата данных Преобразовать БазуДанных (Transfer Database) ПереносБазыДанныхSQL (TransferSQLDat abase) Преобразовать ЭлектроннуюТаблицу (Transfer Spreadsheet) ПреобразоватьТекст (TransferText)
Работа с объектами Копирование, переименование и сохранение объекта КопироватьОбъект (CopyObject) Копировать Файл БазыДанных (CopyDatabase File) Переименовать (Rename) Сохранить (Save)
Прочие Вывод на экран или скрытие встроенной или специальной панели инструментов Подача звукового сигнала ПанельИнструментов (ShowToolbar) Сигнал (Веер)

Таблица 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, поэтому в ряде случаев без программирования на VBA не обойтись, хотя сначала нужно быть уверенным, что эти дополнительные возможности действительно нужны. Язык VBA предоставляет более широкие возможности для работы с данными, позволяет использовать механизм программирования объектов для связи с другими приложениями, вызывать функции из библиотек динамической загрузки (DLL) Windows и создавать собственные специализированные функции.
  • Макросы можно использовать практически везде, где применяются процедуры VBA, однако процедуры VBA, как правило, выполняются быстрее.
  • Макросы являются объектами, существующими отдельно от форм и отчетов, в которых они используются, поэтому, когда этих объектов становится очень много, их поддержка достаточно трудоемка. Процедуры обработки событий VBA являются неотъемлемой частью форм и отчетов, и в этом есть свои преимущества. Например, при переносе форм и отчетов из одной базы данных в другую с ними автоматически переносятся связанные процедуры.

Тем не менее, как уже отмечалось, во многих случаях использование макросов вполне оправдано, т. к. это существенно упрощает и ускоряет разработку приложения. С помощью макросов можно создавать небольшие однопользовательские приложения, хотя при создании многопользовательских или клиент-серверных приложений, где скорость работы приложения критична, лучше применять VBA.

Создание макросов

В Microsoft Access существует специальное средство для создания макросов - Конструктор макросов (Macro Design). Рассмотрим процесс создания макроса с помощью Конструктора.

Конструктор макросов

Открыть окно Конструктор макросов (Macro Design) для создания нового макроса можно двумя способами:

  1. Раскройте список макросов в окне База данных (Database), щелкнув левой кнопкой мыши по ярлыку Макросы (Macros), и нажмите кнопку Создать (New) в верхней части окна (рис. 11.1).
  2. Щёлкните по стрелке вниз на кнопке Новый объект (New Object) на панели инструментов База данных (Database) и выберите элемент Макрос (Macro).

Окно Конструктора макросов построено аналогично окну Конструктора таблиц, т. е. разделено по горизонтали на две части: панель описаний и панель аргументов.

Верхняя часть окна Конструктора - панель описаний - состоит из нескольких столбцов. По умолчанию на этой панели выводится два столбца: «Макрокоманда» (Action) и «Примечание» (Comments). Панель описаний позволяет определить последовательность макрокоманд, из которых состоит макрос.

Строка в столбце «Макрокоманда» (Action) представляет собой поле со списком, в котором можно выбрать нужную макрокоманду.

Строка в столбце «Примечание» (Comments) - это обычное текстовое поле, в которое можно ввести комментарий, описывающий выполняемое действие.

Когда поле «Макрокоманда» (Action) заполнено, в нижней части окна Конструктора макросов появляется панель аргументов, предназначенная для ввода значений аргументов соответствующей макрокоманды. Список полей на этой панели зависит от выбранной макрокоманды и может отсутствовать, если макрокоманда не имеет аргументов. Таким образом, при создании макросов не нужно запоминать список аргументов для каждой макрокоманды.

На рис. 11.1 проиллюстрирован выбор макрокоманды Применить Фильтр (ApplyFilter). На панели аргументов имеются два поля, которые позволяют задать имя фильтра и условие отбора записей. Для того чтобы задать условие отбора записей, можно воспользоваться Построителем выражений (см. разд. «Создание выражений с помощью Построителя выражений» гл. 4).

Рис. 11.1. Конструктор макросов и панель аргументов

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

Замечание

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

Существует еще один очень простой способ ввода макрокоманды. Допустим, нужно создать макрос, который должен открывать форму «Клиенты» (Customers) в приложении «Борей» (Northwind). Для этого в окне База данных (Database) необходимо щелкнуть по ярлыку Формы (Forms), затем, используя панель инструментов (способ 2), открыть окно Конструктор макросов (Macro Design) и перетащить с помощью мыши форму «Клиенты» (Customers) в поле «Макрокоманда» (Action) окна Конструктора макросов.

Совет

Для удобства перетаскивания объектов из окна База данных (Database) в форму выберите команду Окно, Слева направо (Window, Tile Vertically), чтобы расположить окна на экране рядом.

Тогда в поле «Макрокоманда» (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) на панели инструментов или просто клавишу . Появится пустая строка. В этой строке в поле «Макрокоманда» (Action) выберем макрокоманду ПесочныеЧасы (Hourglass). В поле «Включить» (Hourglass On) панели аргументов появится значение Да (Yes), установленное по умолчанию, что нам и нужно. Чтобы вернуть первоначальный вид указателю мыши, в конце созданного макроса нужно ввести такую же макрокоманду ПесочныеЧасы (Hourglass), но со значением Нет (No) аргумента Включить (Hourglass On).

Строго говоря, эту макрокоманду лучше поставить перед макрокомандой вывода сообщения на экран. Сделать это элементарно, поскольку макрокоманды легко меняются местами с помощью мыши. Чтобы поменять две последние макрокоманды местами, выделите последнюю строку, щелкнув левой кнопкой мыши по области выделения строк (слева в окне Конструктора) и перетащите строку вверх. Горизонтальная линия показывает место нового положения строки. Отпустите кнопку мыши, когда эта линия окажется над предпоследней строкой.

Теперь остается только сохранить созданный макрос. Для этого можно выбрать в меню Файл (File) команду Сохранить как (Save As) или нажать клавишу . Появится окно сохранения макроса. Введите в поле ввода имя макроса, соблюдая правила именования объектов Access, например Менеджеры по продажам.

Замечание

В Microsoft Word и Excel имеются средства автоматической записи макросов. Эти средства очень удобны для изучения VBA, поскольку позволяют автоматически создать процедуру, включив запись макроса, выполнив необходимые действия и остановив запись. Тогда все действия пользователя, выполняемые после включения записи и до ее остановки, преобразуются в текст процедуры VBA. Затем этот текст можно просмотреть и отредактировать с помощью редактора VBA. В Microsoft Access средств автоматической записи макросов нет так же, как нет и средств автоматической генерации кода VBA (за исключением того, что создают мастера).

Создание групп макросов

При разработке приложения с использованием макросов количество макросов может оказаться очень большим. Поэтому важно хорошо организовать доступ к нужным макросам. Для этого в одном объекте Макрос (Macro) можно объединить несколько макросов. Например, рекомендуется все макросы, связанные с событиями в форме или отчете, объединить в отдельный объект, соответствующий данной форме или отчету. Для того чтобы можно было это сделать, каждый макрос группы должен иметь свое имя, а имя объекта Макрос (Macro) будет являться именем группы макросов.

Чтобы создать группу макросов:

  1. Откройте Конструктор макросов одним из тех способов, которые были описаны в предыдущем разделе.
  2. Нажмите кнопку Имена макросов (Macro Name) на панели инструментов. На панели описаний в окне Конструктора появится еще один столбец - «Имя макроса» (Macro Name) (рис. 11.3).
  3. В этот столбец введите имя первого макроса. Остальные поля данной строки лучше оставить пустыми - это облегчит перемещение и копирование макрокоманд.
  4. Начиная со следующей строки, введите все макрокоманды макроса и соответствующие аргументы для каждой макрокоманды.
  5. Пропустите одну строку.
  6. Повторите шаги 3-5 для каждого макроса.

Рис. 11.3. Создание группы макросов

На рис. 11.З в окне Конструктора представлен макрос «Сотрудники» (Employees) базы данных (Northwind). Для указания конца макроса не требуется отдельной макрокоманды. Access продолжает выполнение макроса, входящего в группу, пока не обнаружит строку, содержащую имя в столбце «Имя макроса» (Macro Name), либо пока не дойдет до последней строки окна макросов.

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

Для запуска одного из макросов группы используется полное имя для ссылки на макрос. Полное имя макроса формируется таким образом: имяГруппы.имяМакроса.

Замечание

Можно настроить систему так, чтобы столбец Имя макроса (Macro Name) выводился всегда в Конструкторе макросов. Для этого необходимо установить соответствующие параметры на вкладке Вид (View) в диалоговом окне Параметры (Options) (см. разд. «Настройка параметров приложения Access»гл. 14).

Применение условий в макросах

В примерах макросов, которые мы приводили раньше, использовался последовательный порядок выполнения макрокоманд. Однако, как и в любой программе, порядок выполнения макрокоманд в макросе может быть изменен. Для этого вводятся условия выполнения или пропуска макрокоманд. Эти условия задаются в виде выражений в специальном столбце, который появляется в окне Конструктора макросов, если нажата кнопка Условия (Conditions) на панели инструментов (рис. 11.4).

Замечание

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

Рис. 11.4. Применение условий в макросах

На рис. 11.4 приведено окно Конструктора для группы макросов «Наклейки для клиентов» (Customer Label Dialog), используемой для печати отчета в виде наклеек на конверты. Причем можно напечатать наклейки сразу для всех клиентов или для клиентов одной страны, выбранной из списка. В окне виден столбец «Условие» (Condition). Если условие, заданное в этом столбце, истинно, выполняется макрокоманда, находящаяся в этой строке. Если условие ложно, соответствующая макрокоманда пропускается и выполняется следующая.

Если требуется при истинности условия выполнить сразу несколько макрокоманд, то для всех макрокоманд, кроме первой, в столбце «Условие» (Condition) ставится многоточие (…). Условие, которое должно проверяться, пишется в строке первой макрокоманды. Тогда, если оно истинно, выполняется весь набор макрокоманд от этого условия и до следующей макрокоманды с заданным условием, до следующего макроса или до конца макроса. Если условие ложно, пропускаются все команды, помеченные многоточием, включая макрокоманду с заданным условием. Далее выполняется макрокоманда, следующая за пропущенными, в которой содержится новое условие или поле «Условие» (Condition) не заполнено. Таким образом, в отличие от «большинства языков программирования, в макросах нет альтернативного ветвления. Для того чтобы создать макрос с двумя альтернативными ветвями, нужно сначала ввести условие и определить макрокоманды, исполняемые при выполнении этого условия. Сразу после них необходимо указать обратное условие и определить макрокоманды, исполняемые в альтернативной ветви. Затем можно ввести макрокоманды, которые исполняются безусловно. Такой способ ветвления используется, например, в макросе «Просмотр» (Preview), который связан с кнопкой Просмотр (Preview) в данной форме. Если пользователь выбрал вариант для всех стран (АН Countries), что определяется значением 1 элемента управления ПечатьНаклеек (PrintLabelFor), то отчет открывается в режиме Предварительного просмотра и форма закрывается. Если выбран переключатель для конкретной страны (Specific Country)», а страна не выбрана (значение поля со списком «ВыборСтраны» (SelectCountry) не задано), то выдается сообщение, фокус устанавливается в поле со списком для выбора страны и выполнение макроса прекращается. Если страна задана, то отображается отчет для выбранной страны и форма закрывается.

В этом макросе используется макрокоманда ОстановитьМакрос (StopMacro). Она позволяет прекратить выполнение макроса, при этом все макрокоманды, следующие по порядку за макрокомандой ОстановитьМакрос (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 много, и в разных режимах работы на экране появляются соответствующие панели. Поэтому наиболее разумным является создание специальной панели инструментов, на которую вы можете поместить все нужные кнопки. Тем не менее операция добавления специальной кнопки на стандартную панель инструментов чрезвычайно проста.

Чтобы добавить кнопку на стандартную панель инструментов Access:

  1. Щелкните правой кнопкой мыши по панели инструментов и выберите в контекстном меню команду Настройка (Customize).
  2. Настройка (Customize) раскройте вкладку Панели инструментов (Toolbars).
  3. Установите флажок для одной из стандартных панелей инструментов, например Запрос в режиме таблицы (Query Datasheet), чтобы она отобразилась на экране.
  4. Закройте диалоговое окно Настройка (Customize), нажав кнопку Закрыть (Close).
  5. Щелкните по ярлыку Макросы База данных (Database) и найдите нужный макрос.
  6. Перетащите макрос с помощью мыши на панель инструментов Запрос в режиме таблицы (Query Datasheet).

Рис. 11.7. Создание кнопки на панели инструментов для запуска макроса

Замечание

Если основной режим работы в вашем приложении - работа с формами, кнопки выполнения макросов можно поместить на панель инструментов Режим формы (Form View).

Чтобы удалить с экрана панель инструментов, на которую вы только что добавили кнопку, щелкните правой кнопкой мыши в области панелей инструментов и в списке стандартных панелей команд снимите флажок слева от названия панели (рис. 11. 8).

Рис. 11.8. Контекстное меню со списком панелей команд

Теперь рассмотрим создание специальной панели инструментов и размещение на ней кнопки вызова макроса.

  1. Щелкните по ярлыку Макросы (Macros) на панели объектов в окне База данных (Database) и выделите нужный макрос.
  2. Выберите команду (Tools, Macro, Create Toolbar from Macro). На экране появляется пустая панель инструментов.
  3. Перетащите с помощью мыши нужный макрос на эту панель.

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

Если нужно создать панель инструментов для вызова нескольких макросов, мы рекомендуем объединить эти макросы в одну группу (создание группы макросов было описано в предыдущем разделе). Тогда при выполнении команды меню Сервис, Макрос, Создать панель инструментов из макроса (Tools, Macro, Create Toolbar from Macro) будет создана панель инструментов, на которой каждому макросу группы будет соответствовать своя кнопка. При этом на кнопках отображаются имена соответствующих макросов. Новая панель инструментов получает такое же имя, как имя группы макросов. Попробуйте выполнить эту команду для одной из групп макросов в базе данных «Борей» (Northwind), например «Клиенты» (Customers). При желании можно заменить текст на кнопках значками. Дополнительная информация о настройке панелей инструментов приложения, и, в частности, об удалении кнопок с панелей и удалении самих панелей, изменении вида этих кнопок, представлена в

Запуск макроса с помощью команды меню

Еще одним распространенным способом запуска макроса является запуск с помощью специально созданной для этого команды меню. Способы создания команд меню для запуска макросов очень похожи на те, что применяются для создания кнопок на панели инструментов. Например, можно воспользоваться для этого командой меню Сервис, Макрос, Создать меню из макроса (Tools, Macro, Create Menu from Macro).

Более подробно создание и настройка пользовательских меню рассматриваются в разд. «Создание и изменение панелей команд»гл. 14. Поэтому в данном разделе мы не будем рассматривать создание команды меню из макроса.

Запуск макроса с помощью комбинации клавиш

Для запуска макроса можно назначить комбинацию клавиш. Для этого необходимо создать специальную группу макросов - «AutoKeys». Эта группа макросов должна для каждой назначенной вами комбинации клавиш содержать макрокоманду запуска соответствующего макроса. Пример группы макросов «AutoK»eys приведен в базе данных «Борей». Откройте эту группу макросов в режиме Конструктора. Она содержит один макрос (рис. 11.9). Имя макроса- это запись комбинации клавиш +

Сам макрос состоит из одной макрокоманды ЗапускМакроса (RunMacro), которая запускает макрос «Телефоны клиентов. Печать» (Customer Phone List.Print). Макрос «AutoKeys» просматривается каждый раз, когда пользователь вводит специальные комбинации клавиш, например +

Если введенная комбинация клавиш найдена в «AutoKeys», то запускается соответствующий макрос.

Рис. 11.9. Пример макроса «AutoKeys»

Этот способ запуска макроса, безусловно, является самым быстрым, однако он имеет существенный недостаток: свободных комбинаций клавиш очень немного. И хотя комбинации, определенные в «AutoKeys», имеют более высокий приоритет, чем стандартные (например, + - копировать), заменять стандартное назначение комбинаций клавиш не рекомендуется. Разрешенные комбинации клавиш приведены в табл. 11.2. Комбинации с клавишей в данном случае не применяются, т. к. используются для запуска команд меню и нажатия кнопок.

Таблица 11.2. Разрешенные комбинации клавиш

Запуск макроса при открытии базы данных

При открытии базы данных Microsoft Access могут выполняться некоторые действия. Чаще всего это открытие специальной формы, так называемой Главной кнопочной формы, вывод специальных меню или панелей инструментов, скрытие стандартных меню и т. д. Для определения этих действий используется диалоговое окно Параметры запуска (Startup). Однако иногда требуется при запуске приложения выполнить более сложный набор действий, чем тот, что позволяет задать это диалоговое окно. Например, может потребоваться заранее открыть несколько форм (не показывая их на экране), чтобы потом их отображение не занимало много времени, проверить некоторые условия или запросить ввод некоторых данных. Все это можно сделать с помощью специального макроса, который называется «AutoExec». При открытии базы данных Access проверяет наличие этого макроса и, если он существует, выполняет его. При создании макроса «AutoExec» следует помнить, что Access сначала выполнит действия, определенные в окне Параметры запуска (Startup), а затем - макрос «AutoExec», поэтому в них не должно быть противоречивых действий.

Запуск макроса из другого макроса

Иногда требуется вызвать макрос из другого макроса. Это можно сделать с помощью макрокоманды ЗапускМакроса (RunMacro). Мы уже встречались с этой макрокомандой при описании макроса «AutoKeys». Здесь нужно отметить, что эта макрокоманда имеет три аргумента: кроме имени макроса, задается число повторов выполнения макрокоманды и условие повтора. Таким образом, эта макрокоманда позволяет организовывать циклы. Аргумент Число повторов (Repeat Count) задает количество вызовов макроса. Аргумент Условие повтора (Repeat Expression) является выражением, которое может принимать значение Истина или Ложь. Перед выполнением макрокоманды ЗапускМакроса (RunMacro) проверяется значение этого выражения. Если оно Истина, то макрос выполняется, если Ложь, то макрос не выполняется и управление передается следующей макрокоманде. Если эти два аргумента не заданы, макрос выполняется только один раз. Если заданы оба эти аргумента, цикл вызова прекращается, когда макрос выполнился заданное число раз либо когда заданное условие окажется невыполненным и получит значение Ложь.

Замечание

Имя макроса в аргументе макрокоманды ЗапускМакроса (RunMacro) должно быть полным, т. е. должно иметь вид имяГруппы. имяМакроса, даже если вызываемый макрос находится в той же группе, что и вызывающий. Если условие повтора задано таким образом, что оно всегда истинно, то цикл окажется бесконечным. Можно прервать его с помощью комбинации клавиш +. Если это не поможет, придется прервать работу Access, нажав комбинацию клавиш ++.

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

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

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

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

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

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

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

  1. В макрос нужно добавить единственную макрокоманду ОткрытьФорму (OpenForm). Значения аргументов этой макрокоманды приведены в табл. 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).

  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) и нажмите клавишу . Теперь сохраните форму, перейдите в режим Формы и проверьте, как работают созданные вами макросы.

Рис. 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). В окне отображается макрокоманда, содержащая ошибку.

Поиск ошибок в макросах, как правило, не вызывает больших затруднений. Это связано с тем, что:

  • большинство синтаксических ошибок проверяется при вводе и система просто не даст ввести неправильное название макрокоманды или условное выражение (правда, она не защитит от ввода неправильного имени объекта, например несуществующей формы или элемента управления в форме);
  • макросы, как правило, достаточно просты и не содержат длинных последовательностей макрокоманд, в противном случае лучше написать процедуру на VBA, т. к. язык VBA предоставляет больше возможностей и имеет существенно лучшие средства отладки.

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

Совет

Прежде чем использовать ссылки на форму или элемент управления, рекомендуется выполнять проверку, открыта ли форма, с помощью функции isLoaded(). К сожалению, эта функция не является стандартной функцией Access, а обычно включается в модуль «Служебные функции» (Utility Function) базы данных «Борей». Вы можете скопировать ее оттуда в свою базу данных.

Стандартным приемом отладки как процедур, так и макросов, является вывод на экран специальных сообщений, говорящих о прохождении определенных этапов процесса. В макросах это осуществляется путем вставки дополнительных макрокоманд ВыводСообщения (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). Если нужно менять набор отображаемых записей в открытой форме динамически, поступают следующим образом:

  • создают в этой форме набор полей, в которых можно задать условия отбора;
  • создают кнопку Применить фильтр, с которой связывают макрос, содержащий макрокоманду ПрименитьФильтр (ApplyFilter). В качестве значения аргумента Условие отбора (Where Condition) для этой макрокоманды указывают выражение, содержащее ссылки на эти поля.

Пример такого решения приведен на рис. 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).

Похожая ситуация возникает даже в однопользовательском режиме, если в форме используется поле со списком, источником данных для которого является таблица или запрос. Если в исходную таблицу были добавлены записи, то в поле со списком они автоматически не появятся - нужно повторно выполнить запрос. Кроме полей со списком, к элементам управления, требующим обновления отображаемых данных, относятся также списки и элементы управления подчиненной формы, объекты OLE и вычисляемые элементы управления, содержащие статистические функции по подмножеству записей, такие как DLookUp () или DSum ().

Для того чтобы выполнить обновление записей в формах, таблицах или элементах управления, используются макрокоманды Обновление(Requery), ПоказатьВсеЗаписи(ShowAllRecords) И ОбновитьОбъект(RepaintObject).

Макрокоманда Обновление (Requery) обновляет данные в объекте базы данных путем повторного просмотра источника данных. Макрокоманда имеет один аргумент, содержащий имя объекта, который следует обновить. Если обновляется активный объект, например форма, то поле аргумента следует оставить пустым. При этом макрокоманда будет повторно выполнять запрос, указанный в свойстве Источник данных (RecordSource) этой формы.

Рассмотрим пример использования макроса для обновления данных. В форме «Клиенты» (Customers) есть поле со списком «Страна» (Country). Источником данных для этого поля является запрос, который выбирает значения из поля «Страна» (Country) таблицы «Клиенты» (Customers):

SELECT DISTINCT Клиенты.Страна FROM Клиенты;

Если при вводе клиента в таблицу добавляется новое название страны, то в списке эта страна не появится, поскольку запрос будет выполнен повторно только при следующем открытии формы. Чтобы провести обновление списка стран раньше, следует назначить событию После обновления (After Update) формы макрос Клиенты.Обновление списка стран, который состоит из одной макрокоманды Обновление (Requery) со значением аргумента «Страна» (Country) (рис. 11.18).

Рис. 11.18. Назначение макроса событию формы После обновления

Замечание

Макрокоманда Обновление (Requery) обновляет только один объект, поэтому если в форме существуют элементы управления, требующие обновления отображаемых данных, и в макросе, назначенном этой форме, используется макрокоманда Обновление (Requery) с пустым значением аргумента, то обновляться будут только записи в форме. Для каждого такого элемента управления нужно использовать отдельную макрокоманду. Если эта макрокоманда в качестве аргумента содержит имя элемента управления, то при ее выполнении обновляется только данный элемент. Записи в самой форме не обновляются.

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

Макрокоманда ПоказатьВсеЗаписи (ShowAllRecords), как уже отмечалось, отменяет действие фильтра и повторно просматривает источник записей. Ее часто используют для обновления данных в подчиненной форме.

Макрокоманда ОбновитьОбъект (RepaintObject) применяется только к объекту базы данных (к таблице, запросу, форме, отчету, странице, макросу и модулю) и не применяется к элементу управления. Она выполняет немедленное обновление указанного открытого объекта (если имя объекта не задано, обновляется активный объект), хотя при этом не производится повторное выполнение запроса к источнику данных. Обновление объекта не влияет на. отображение новых и удаленных записей, как это происходит при выполнении макрокоманды Обновление (Requery). Обычно макрокоманду ОбновитьОбъект (RepaintObject) применяют для отображения результатов изменения данных с помощью макрокоманд ЗадатьЗначение (SetValue), а также для повторного вычисления значений выражений в вычисляемых элементах управления.

Работа с объектами

Рассмотрим сначала, как используется макрокоманда ЗадатьЗначение (SetValue), которая позволяет устанавливать значения свойств элементов управления в формах и отчетах. Мы уже использовали эту макрокоманду в предыдущих примерах.

Установка свойств элементов управления позволяет динамически, в зависимости от условий, делать эти элементы недоступными или невидимыми. Вот несколько примеров.

  • Можно создать одну форму, в которой в зависимости от определенных условий, видимыми будут разные поля. Это позволяет использовать одну форму в нескольких случаях и не создавать для каждой ситуации дополнительную форму. Когда форм в приложении очень много, такая возможность становится очень полезной. Чтобы сделать элемент управления невидимым, следует задать значение Ложь (False) для свойства Вывод на экран (Visible) этого элемента. Чтобы показать элемент управления на экране, задайте для этого свойства значение Истина (True).
  • В зависимости от текущего состояния работы с данными можно изменять доступность кнопок, предназначенных для выполнения определенных действий, или других элементов управления в форме. Чтобы сделать элемент управления недоступным, задайте значение Ложь (False) его свойству Доступ (Enabled). Чтобы элемент управления стал доступным, задайте значение Истина (True) для этого свойства.
  • Можно запретить пользователю изменять данные в форме. Для этого свойству Доступ (Enabled) соответствующих полей следует присвоить значение Ложь (False), а свойству Блокировка записей (Locked) - значение Истина (True). Если необходимо запретить изменение во всех полях, установите значение Ложь (False) для следующих свойств формы: Разрешить изменения (Allow Edits), Разрешить добавление (Allow Additions), Разрешить удаление (Allow Delitions). Эти свойства можно изменять динамически, т. е. в процессе работы пользователя с формой. Например, можно разрешить или запретить редактирование данных после проверки прав пользователя.
  • С помощью макрокоманды ЗадатьЗначение (SetValue) можно динамически изменять значение свойства Источник записей (RecordSource) для формы, что позволяет управлять содержанием отображаемых данных.

Существуют макрокоманды для открытия «и закрытия объектов Access:

ОткрытьФорму(OpenForm), ОткрытьЗапрос(OpenQuery), ОткрытьОтчет(OpenReport) и т. д. Для открытия объекта каждого типа применяется отдельная макрокоманда, а для закрытия объекта используется общая для объектов всех типов макрокоманда Закрыть (Close). Тип объекта, к которому следует применить эту макрокоманду, указывается в качестве одного из ее аргументов. В предыдущих примерах уже использовались макрокоманды ОткрытьФорму(OpenForm) и Закрыть(Close) для активного объекта.

Макрокоманда ОткрытьЗапрос (OpenQuery) позволяет выполнить любой тип запроса, в том числе запрос на изменение данных. Если в качестве аргумента этой макрокоманды задается имя запроса на выборку или перекрестного запроса, то результатом выполнения макрокоманды будет вывод на экран выбранных записей. Если же аргумент - имя запроса на изменение данных, то макрокоманда выполнит запрос, изменяя соответствующим образом данные в таблицах.

При выполнении запроса, изменяющего данные, на экране будут отображаться предупреждающие сообщения. Чтобы отключить вывод этих сообщений, используйте макрокоманду УстановитьСообщения (SetWarnings) со значением аргумента Нет (No). Только не забудьте после выполнения запроса снова включить вывод системных сообщений, применив ту же макрокоманду, но с аргументом Да (Yes). Иначе в Access не будут отображаться никакие системные сообщения, что может привести к выполнению нежелательных действий в приложении.

Макрокоманда ОткрытьПредставление (OpenView) аналогична макрокоманде ОткрытьЗапрос (OpenQuery), только применяется она в проектах Access 2000 и предназначена для работы с данными, хранящимися на сервере.

Макрокоманда ОткрытьСохраненнуюПроцедуру (OpenStoreProcedure) позволяет выполнить или открыть в режиме редактирования хранимую процедуру сервера.

В данном разделе описаны далеко не все макрокоманды. Для получения полной информации используйте справочную систему Access. Чтобы быстро получить справку:

  1. Выберите команду Справка, Справка по Micrisift Access (Help, Microsoft Access Help).
  2. Раскройте вкладку Мастер ответов (Answer Wizard) и введите в поле Выберите действие (What would you like to do?) имя макрокоманды. Нажмите кнопку Найти (Search).

Преобразование макросов в процедуры VBA

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

Давайте попробуем преобразовать в процедуры обработки событий макросы, назначенные событиям формы «Наклейки для клиентов» (Customers Labels Dialog):

  1. Откройте форму «Наклейки для клиентов» (Customers Labels Dialog) в режиме Конструктора.
  2. Выберите команду Сервис, Макрос, Преобразовать макросы формы (Tools, Macro, Convert form’s Macros to Visual Basic).
  3. В диалоговом окне Преобразование макроса формы (Convert form macros) (рис. 11.19) нажмите кнопку Преобразовать (Convert), оставив флажки установленными по умолчанию.

Рис. 11.19. Преобразование макроса в процедуру VBA

  1. Когда преобразование закончится, в форме «Наклейки для клиентов» (Customers Labels Dialog) щелкните правой кнопкой мыши, например по кнопке Отменить, и выберите команду Свойства (Properties).
  2. В диалоговом окне Свойства (Properties) раскройте вкладку События (Events).
  3. В поле для события Нажатие кнопки (On Click) оказалось установленным значение [Процедура обработки событий] (). Щелкните по кнопке Построителя, находящейся справа от поля, - откроется окно редактора VBA с текстом процедуры (рис. 11.20).

Рис. 11.20. Процедура, полученная из макроса

В этой процедуре, полученной из макроса, используются объект DoCmd для выполнения макрокоманды закрытия формы. В соответствии с флажками, установленными в окне Преобразование макроса (Convert Macro), комментарии в макросе были преобразованы в комментарии в процедуре и был добавлен код обработки ошибки, который выдает на экран сообщение об ошибке в случае ее возникновения (см. гл. 13).

Аналогично выполняется преобразование макросов, назначенных событиям отчета.

Теперь рассмотрим преобразование в процедуру VBA макроса, не связанного с событием формы или отчета, например созданного ранее макроса «Менеджеры по продажам».

  1. Щелкните по ярлыку Макросы (Macros) в окне базы данных «Борей». Появится список макросов. Выделите макрос «Менеджеры по продажам».
  2. Выберите команду Сервис, Макрос, Преобразовать макросы (Tools, Macro, Convert Macros to Visual Basic).
  3. Откроется такое же диалоговое окно, как в предыдущем примере (см. рис. 11.19), в котором необходимо нажать кнопку Преобразовать (Convert). После окончания процесса преобразования появится сообщение об успешном завершении процесса преобразования и откроется окно редактора VBA, в котором можно посмотреть полученный код на VBA (рис. 11.21).
  4. Макрос преобразуется в функцию с аналогичным именем Менеджеры_по_продажам (пробелы заменились символами подчеркивания).

Рис. 11.21. Результат преобразования макроса «Менеджеры по продажам»

После преобразования исходный макрос «Менеджеры по продажам» не был удален, а в списке модулей в окне базы данных «Борей» появился новый модуль с именем «Преобразованный макрос - Менеджеры по продажам» (Converted Macro - Менеджеры по продажам).

Существует еще один способ преобразования макросов в модуль VBA:

  1. Выделите макрос «Менеджеры по продажам» в окне базы данных «Борей».
  2. Выберите команду Файл, Сохранить как (File, Save As).
  3. В появившемся диалоговом окне Сохранение (Save As), в раскрывающемся списке Как (As) выберите элемент Модуль (Module) (рис. 11.22) и нажмите кнопку ОК.

Рис. 11.22. Сохранение макроса в виде модуля

Выводы

В этой главе мы познакомили вас с макросами, способами их создания и запуска, привели краткий обзор существующих макрокоманд и показали примеры их использования. Мы не описывали все события в формах и отчетах и их обработку с помощью макросов. Этот материал подробно изложен в гл. 13. Нет необходимости уделять особое внимание обработке событий с помощью макросов, поскольку те же действия можно реализовать в процедурах на VBA.

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

1. Понятие макроса.

2. Обзор событий

3. Создание макросов.

3.1. Задание условий выполнения макрокоманд.

3.2. Создание группы макросов.

4. Запуск макроса.

1. Понятие макроса

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

Макрос – это объект базы данных MS Access, представляющий собой набор из одной или нескольких макрокоманд и предназначенный для автоматизации часто выполняемых задач.

Макрокоманда – основной компонент макроса, замкнутая инструкция, самостоятельно или в комбинации с другими макрокомандами определяющая выполняемые в макросе действия. Каждая макрокоманда имеет определенное имя и возможно один или несколько аргументов, которые задаются пользователем.

Макрокоманды по функциональному признаку можно разделить на несколько категорий:

– работа с данными в формах и отчетах;

– выполнение команд, макросов, процедур и запросов;

– работа с объектами;

– импорт/экспорт данных и объектов;

– прочие.

В таблице 11.1 представлены 56 макрокоманд СУБД MS Access, сгруппированных по категориям.

Таблица 11.1

Назначение

Макрокоманда

Работа с данными в формах и отчетах

Отбор данных

ПрименитьФильтр (ApplyFilter)

Перемещение по данным

СледующаяЗапись (FindNext).

НайтиЗапись (FindRecord),

КЭлементуУправления

НаСтраницу (GoToPage),

НаЗапись (GoToRecord)

Обновление данных или экрана

Обновление (Requery)

ПоказатьВсеЗаписи (ShowAllRecords)

Выполнение

Выполнение команды

ВыполнитьКоманду (RunCommand)

Выполнение макроса, процедуры или запроса

ЗапускПрограммы (RunCode), ЗапускМакроса (RunМасго), ОткрытьЗапрос (OpenQuery), ЗапускЗапросаSQL (RunSQL)

Выполнение другого приложения

ЗапускПриложения (RunApp)

Прерывание выполнения

ОтменитьСобытие (CancelEvent),

ОстановитьВсеМакросы (StopAIIMacros),

ОстановитьМакрос (Stop Macro)

Выход из Microsoft Access

Выход (Quit)

Импорт/
экспорт

Передача объектов Microsoft Access в другие приложения

ВывестиВФормате (OutputTo),

ОтправитьОбъект (SendObiect)

Преобразование формата данных

ПреобразоватьБазуДанных (TransferDatabase), ПреобразоватьЭлектроннуюТаблицу (TransferSpreadsheet)

ПреобразоватьТекст (TransferText)

Работа с oбъeктaми

Копирование, переименование или сохранение объекта

КопироватьОбъект (CopyObject), Переименовать (Rename),

КопироватьФайлБазыДанных
(CopyDatabaseFile)

Удаление объекта

УдалитьОбъект (DeleteObject)

Изменение размеров или положения окна

Развернуть (Maximize),

Свернуть (Minimize),

СдвигРазмер (MoveSize),

Восстановить (Restore)

Открытие или закрытие объекта

ОткрытьФорму (OpenForm), ОткрытьМодуль (OpenModule), ОткрытьЗапрос (OpenQuery), ОткрытьОтчет (OpenReport), ОткрытьТаблицу (OpenTable),

ОткрытьФункцию (OpenFunction)

ОткрытьСтраницу (OpenDataAccessPage)

Открыть схему (OpenDiagram)

ОткрытьСохраненнуюПроцедуру (OpenStoreProcedure)

ОткрытьПредставление (OpenView)

Закрыть (Close)

Печать объекта

Печать (PrintOut)

Выделение объекта

ВыделитьОбъект (SelectObject)

Задание значения поля, элемента управления или свойства

ЗадатьЗначение (SetValue)

Обновление объекта

ОбновитьОбъект (RepaintObject)

Создание специальной или общей строки меню, специального или глобального контекстного меню

ДобавитьМеню (AddMenu)

Задание состояния пунктов меню в специальной или общей строке меню

ЗадатьКомандуМеню (SetMenultem)

Вывод информации на экран

ВыводНаЭкран (Echo),

ПесочныеЧасы (Hourglass),

Сообщение (MsgBox),

УстановитьСообщения (SetWarnings)

Генерация нажатий клавиш

КомандыКлавиатуры (SendKeys)

Вывод на экран или скрытие встроенной или специальной панели инструментов

ПанельИнструментов (ShowToolbar)

Подача звукового сигнала

Сигнал (Веер)

Более полную информацию по макрокомандам можно получить в разделе Справка Microsoft Access | Программирование в Microsoft Access | Макрокоманды .

Действия, которые могут быть выполнены с помощью макросов, очень разнообразны, поэтому для создания макросов необходимо знание макрокоманд. Знание макрокоманд будет полезно и при создании процедур на VBA, т. к. многие макрокоманды являются методами объекта DoCmd.

По месту хранения макросы разделяются на два вида:

простые (объект, состоящий из набора макрокоманд);

групповые (объект, состоящий из набора логически связанных макросов, каждый из которых имеет собственное имя и набор макрокоманд).

По способу выполнения макросы разделяются на два вида:

линейные (каждая макрокоманда в макросе выполняется последовательно одна за другой);

с условием (макрокоманды выполняются в зависимости от выполнения определенных условий).

2. Обзор событий

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

Практически все программирование в MS Access сводится к написанию макросов или процедур, обрабатывающих события, т. е. программируется реакция объектов на происходящие события. События различных объектов MS Access представлены на рис.11.1 – 11.3.

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

– открытие и закрытие форм и отчетов;

– изменение данных;

– смена фокуса ввода;

– события работы с клавиатурой;

– события работы с мышью;

– печать;

– отслеживание ошибок;

– истечение промежутка времени.

Рис.11.1. Вкладка События окна свойств формы.

Рис.11.2. Вкладка События окна свойств элемента управления Подчиненная форма/отчет.

Рис.11.3. Вкладка События окна свойств элементов управления. Кнопка (а) и Поле со списком (б).

3. Создание макросов

Создание макроса состоит из двух шагов:

1. В окне базы данных перейти на вкладку Макросы и щелкнуть по кнопке Создать .

2. В появившемся окне Конструктор макросов создать макрос.

Окно Конструктора макросов состоит из двух областей (рис.11.4):

– верхняя область предназначена для описания логической структуры макроса;

– нижняя область предназначена для описания аргументов макрокоманд.

В верхней области Конструктора макросов по умолчанию отображается два столбца Макрокоманда и Примечание . Отображение столбцов Имя макроса и Условие осуществляется с помощью соответствующих кнопок на панели инструментов Конструктор макросов .

Ячейки в столбце Макрокоманда используются для выбора из списка макрокоманды, включаемой в макрос.

Ячейки в столбце Примечание используются для описания действия выполняемого макрокомандой (могут быть незаполненными).

Ячейки в столбце Имя макроса используются для задания имени макроса в группе макросов.

Ячейки в столбце Условие используются для задания последовательности выполнения макрокоманд.

Рис.11.4. Окно Конструктор макросов

Для быстрого переключения между верхней и нижней областью окна Конструктора макросов можно использовать клавишу < F 6> .

Существует еще один способ ввода макрокоманд.

В окне базы данных выбирается объект: форма, отчет, макрос, запрос или таблица и с помощью мыши перетаскивается в окно Конструктор макросов . В поле столбца Макрокоманда автоматически появится макрокоманда (например, ОткрытьФорму ) и автоматически заполнятся некоторые аргументы макрокоманды (имя объекта, режим, режим окна).

Для ввода значений аргументов макрокоманды используется два способа:

– выбор значения из списка допустимых значений;

– ввод значения вручную или с помощью диалогового окна Построитель выражений .

Пример макроса позволяющего открыть форму "Клиенты" в режиме формы, только для чтения и отобразить клиентов только из Испании, представлен на рис.11.5.

Рис.11.5. Окно Конструктор макросов с заполненными значениями аргументов

3.1. Задание условий выполнения макрокоманд

Для создания макросов нелинейной структуры необходимо отобразить столбец Условие и указать в нем условие выполнения макрокоманд.

Выполнение макроса начинается с первой макрокоманды и продолжается до тех пор, пока не встретится пустая строка (признак окончания макроса), имя другого макроса или макрокоманда ОстановитьМакрос . Макрокоманды, для которых определены условия, выполнятся только в том случае, если условие, записанное в строке макрокоманды, имеет значение Истина . Для распространения условия на последующие макрокоманды необходимо в столбце Условие указать троеточие ().

Пример создания макроса нелинейной структуры

В форме Поставщики имеется два поля Страна и Индекс . Необходимо до обновления записи (перед сохранением) проверить правильность введенного индекса для некоторых стран.

Если поле Страна имеет значение NULL, то сохранить запись, т. к. проверка индекса на принадлежность стране невозможна, иначе осуществить проверку значения в поле Индекс :

– если поле Страна имеет значение Франция , Италия или Испания , а в поле Индекс введено не 5 знаков, то не сохранять запись, если 5 – сохранить;

– если поле Страна имеет значение Австралия или Сингапур , а в поле Индекс введено не 4 знака, то не сохранять запись, если 4 – сохранить;

Алгоритм макроса в виде блок-схемы представлен на рис 11.6, а реализация макроса в окне Конструктор макросов , приведена на рис.11.7.

Данный макрос связан со свойством До обновления на вкладке События формы Поставщики .

Рис.11.6. Алгоритм работы макроса

Рис.11.7. Реализация макроса, имеющего нелинейную структуру

3.2. Создание группы макросов

Для автоматизации приложения требуется применение значительного числа макросов. Если создавать макросы для каждой отдельной операции, то в этом случае в базе данных накопятся сотни различных макросов.

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

– принадлежности к объекту автоматизации (для каждой формы и отчета);

– принадлежности к типу автоматизируемых операций.

Группа макросов хранится в одном объекте и, следовательно, имеет одно общее имя – имя объекта. Для запуска макроса, входящего в группу, используется полное имя: [Имя_группы].[Имя_макроса_в_группе].

Для создания группы макросов необходимо выполнить следующие действия:

1. Открыть Конструктор макросов .

2. Отобразить столбец Имя макроса.

3. В ячейке столбца Имя макроса ввести уникальное для группы имя макроса.

4. В ячейках столбца Макрокоманда , начиная со строки, в которой находится имя макроса, ввести все макрокоманды составляющие макрос и их аргументы.

5. Пропустить одну строку.

6. Повторить шаги 3 – 5 для каждого макроса.

Пример создания группы макросов представлен на рис.11.8.

Рис.11.8. Реализация группы макросов

4. Запуск макроса

Способов запуска макросов очень много.

Среди них есть способы, когда макрос запускается пользователем. Эти способы используются в основном при тестировании макросов.

После отладки макроса, для его запуска создается командная кнопка в форме, команда меню или кнопка на панели инструментов или макрос связывается с событием в форме или отчете. Макрос может быть запушен и из другого макроса, а также программно – из процедуры VBA.

Запуск макроса из Конструктора макросов.

Для запуска простого макроса или первого макроса из группы щелкнуть по кнопке Запуск на панели инструментов Конструктор макросов .

Для запуска любого макроса из группы выполнить команду Сервис | Макрос | Выполнить макрос … и в диалоговом окне Запуск макроса выбрать имя макроса.

Запуск макроса из окна базы данных.

Для запуска простого макроса или первого макроса из группы перейти на вкладку Макросы , выбрать макрос и щелкнуть по кнопке Запуск в окне БД.

Запуск любого макроса из группы см. выше.

1. Открыть форму или отчет в режиме Конструктор .

2. Выделить объект автоматизации (элемент управления, форму или отчет, раздел формы или отчета).

3. Открыть диалоговое окно Свойства объекта .

4. Выбрать событие на вкладке События , которому назначается макрос.

5. Выбрать из списка полное имя макроса.

Запуск макроса будет производиться каждый раз, когда будет происходить событие, для которого назначен макрос. Пример назначения макроса событию представлен на рис.11.9.

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

Макрос с именем Autoexec запускается автоматически при открытии базы данных. Для отмены действий, указанных в данном макросе, необходимо открывать базу данных при нажатой клавише > .

Похожие публикации