Программирование в Access
До обновления
До обновления
Событие До обновления (BeforeUpdate), так же как и следующее событие После обновления (AfterUpdate), возникает при любом изменении данных в записи или элементе управления. Это событие может относиться как к элементу управления, так и к записи в целом. Процедура обработки данного события имеет один параметр — Cancel, использующийся для того, чтобы отменить введенные изменения. Для этого ему необходимо присвоить значение True. Данное событие обычно применяется с целью проверки условий на значение в поле таблицы или записи в целом, если эти условия сложные (простые условия обычно задаются в свойстве Условие на значение (ValidationRule) элемента управления). Условия проверяются сразу для нескольких значений, причем в них используются ссылки на элементы управления в других формах. При разных значениях введенных данных выдаются разные сообщения об ошибках.
При невыполнении условий можно отменить введенные изменения перед переходом на другую запись.
В следующем разделе будет описан порядок возникновения событий, относящихся как к элементу управления, так и к записи в целом.
До подтверждения Del
До подтверждения Del
Удаление записи из базы данных имеет такое большое значение, что с ним связано несколько событий. После события Удаление (Delete) Access выдает специальное окно, запрашивающее подтверждение удаления записи. Событие До подтверждения Del (BeforeDelConfirm) возникает до появления этого окна. Процедура обработки данного события имеет два параметра: Cancel и Response. Присваивая в процедуре значение True параметру Cancel, можно отменить удаление, и окно подтверждения выдаваться на экран не будет. Так что это еще одна возможность отменить удаление программно (третья возможность отмены будет предоставлена пользователю в диалоговом окне подтверждения удаления). Если же параметру Cancel присвоить значение False, то параметр Response можно использовать, чтобы определить, нужно ли выдавать окно подтверждения. Если Response = 1, то запись будет удалена без подтверждения, если же Response установить равным 0, то Access выдаст окно, запрашивающее у пользователя подтверждение удаления записи.
Замечание
Если окно подтверждения удаления не выдается или событие До подтверждения Del (BeforeDelConfirm) не возникает, проверьте установку флажка Изменения записей (Record Changes) в окне Параметры (Options) (на вкладке Правка и поиск, группа Подтверждение).
До вставки
До вставки
Со вставкой новой записи связаны два события: До вставки (Beforelnsert) и описанное далее После вставки (AfterInsert). Событие До вставки (Beforelnsert) происходит, как только пользователь вводит первый символ в новую запись (одно из полей, необязательно первое), но до того, как запись фактически будет создана. Процедура обработки этого события может быть использована для проверки того, разрешена ли вставка. Процедура имеет один параметр: Cancel. Если установить его значение равным True, то вставка записи будет запрещена. После этого события отменить вставку будет уже нельзя, можно только удалить вставленную запись.
Двойное нажатие кнопки
Двойное нажатие кнопки
Событие Двойное нажатие кнопки (DblClick) происходит после быстрого двойного щелчка любой клавиши на форме или элементе управления, при этом интервал между щелчками не должен превышать предельного времени, заданного в панели управления Windows. Событие Двойное нажатие кнопки (DblClick) для формы и элемента управления формы определено так же, как и событие Нажатие кнопки (Click). Однако для элементов управления результат этого события зависит от типа элемента управления. По умолчанию двойной щелчок мыши в текстовом поле приводит к выделению слова, а в объекте OLE — запускает этот объект для редактирования. Вводя процедуру обработки для настоящего события, можно переопределить стандартные действия Access. Процедура имеет один параметр: Cancel. Если присвоить ему в процедуре значение True, то можно отменить это событие.
Замечание
Двойное нажатие кнопки мыши на элементе управления на самом деле вызывает сразу два события: сначала Нажатие кнопки (Click), а потом — Двойное нажатие кнопки (DblClick).
Фильтрация
Фильтрация
Событие Фильтрация (Filter) возникает перед открытием окна фильтра или расширенного фильтра, когда пользователь пытается выполнить команду Изменить фильтр (Filter by Form). Использовать это событие очень удобно, если требуется, например, ввести в фильтр некоторые условия по умолчанию или запретить включать в условия отбора некоторые поля. Чтобы запретить включать некое поле в условие отбора в окне фильтра, достаточно скрыть его в процедуре обработки события Фильтрация (Filter). Правда, это относится только к окну обычного фильтра, т. к. в окне расширенного фильтра выводятся все поля, в том числе и скрытые. Можно даже заменить стандартное окно фильтра своим собственным, в котором пользователь и будет задавать условия отбора. Процедура обработки события имеет два параметра — Cancel и FilterType. Cancel позволяет отменить открытие стандартного окна фильтра, если вместо него будет выводиться специальная форма, для чего нужно присвоить ему значение True. Параметр FilterType определяет, какое окно открывается, и может принимать значения 0 или 1. Значение 0 соответствует обычному фильтру, 1 — расширенному фильтру.
Форматирование
Форматирование
Событие Форматирование (Format) происходит после того, как отобраны данные для отчета, но перед тем, как фактически форматируется каждый раздел отчета. При этом для раздела данных это событие происходит для каждой записи в отчете, что позволяет при необходимости по-разному форматировать каждую запись. Для заголовка группы в отчете событие возникает для каждой группы. Процедура обработки данного события имеет два параметра — Cancel и FormatCount. Cancel позволяет отменить форматирование данного раздела, для чего нужно присвоить ему значение True. Это дает вам возможность пропускать разделы отчета, не оставляя пустого места на странице. FormatCount — счетчик, который считает, сколько раз произошло событие Форматирование (Format).
Данная глава посвящена основному средству
Глава 13.
Программирование в Access 2002
Данная глава посвящена основному средству программирования в Access 2002 — языку программирования Visual Basic for Applications (VBA). Язык программирования VBA является общим инструментом для всех приложений Microsoft Office, позволяющим решать любые задачи программирования, начиная от автоматизации действий конкретного пользователя и кончая разработкой полномасштабных приложений, использующих Microsoft Office в качестве среды разработки.
Цель этой главы — дать читателю основные сведения как о самом языке, так и о тех инструментальных средствах, которые предоставляет разработчику приложений среда Access 2002.
Поскольку Visual Basic for Applications является объектно-ориентированным языком программирования, будут описаны объектные модели, которые могут использоваться в Access 2002. Это не только собственная объектная модель Access, но и объектные модели Visual Basic for Applications и Microsoft Office, которые являются общими для всех приложений семейства. Основная работа в приложениях Access — это работа с данными, поэтому будут рассмотрены также библиотеки управления данными: DАО (Data Access Objects), ADO (ActiveX Data Objects), JRO (Jet and Replication Objects).
Модель программирования в Access является событийно-управляемой, т. е. в процессе работы приложения возникают события, которые запускают специальные программы — обработчики событий. Большое количество разнообразных событий определено в таких объектах Access, как формы, отчеты и элементы управления в них. Мы подробно описываем эти события и последовательности их возникновения, т. к. искусство программирования в формах и отчетах включает в себя правильное определение того события, которое требуется обработать специальной программой.
Итак, в данной главе будут рассмотрены следующие вопросы:
-
Синтаксис языка Visual Basic for Applications
-
Интегрированная среда VBA, которая включает в себя как редактор кода программных модулей, так и большое количество средств отладки этого кода
-
Объектные модели, применяемые в приложениях Access
-
События форм, отчетов и элементов управления и последовательности их возникновения
- Примеры применения процедур обработки событий в формах и отчетах
Окно редактора кода VBA
Иллюстрация 13.10. Окно редактора кода VBA

Если в модуле для некоторого события существует процедура, то это событие выделяется в списке жирным шрифтом. В данном случае таких событий нет, т. к. обработка событий в форме "Клиенты" (Customers), которую мы открыли, выполняется с помощью макросов. При попытке открытия редактора VBA автоматически создается модуль формы, который будет иметь название Fогm_Клиенты (Form_Customers).
Если теперь закрыть окно редактора кода, а затем форму, то, хотя мы не вносили никаких изменений в форму, на экране появится вопрос: Сохранить изменения макета или структуры формы Клиенты? (Do you want to save changes to the design of form 'Customers'?). Вопрос связан с появлением модуля формы. Если вы ответите Нет (No), модуль не будет сохранен.
Для того чтобы из программы VBA открыть форму и изменить какие-либо свойства формы или элементов управления формы, можно использовать два метода.
-
Макрокоманду OpenForm, как метод объекта DoCmd, например:
DoCmd.OpenForm "Товары"
Forms!Товары.RecordSource = "Товары клиента"
-
Ссылку на соответствующий модуль класса, например:
Form_ToBapbi. Visible = True
Рогт_Товары.RecordSource = "Товары клиента" ,|
VBA позволяет открывать сразу несколько экземпляров класса формы. Это может потребоваться, например, когда хотят показать в разных окнах головную организацию и дочернюю фирму. Информация о той и другой может храниться в разных записях одной таблицы, и вам необходимо открыть два экземпляра одной формы с разными записями в каждом экземпляре.
Класс формы может иметь только один стандартный экземпляр, поэтому в данном случае придется создать нестандартный экземпляр формы. Для этого в программе нужно описать переменную, типом которой является имя модуля класса формы, при этом в описание переменной включить ключевое слово New. Например, следующая команда создает новый экземпляр формы " Клиенты" (Customers) и связывает его с переменной типа Form:
Dim frm As New Fоrm_Клиенты
Теперь изменим источник данных для этой формы, расположение на экране (иначе формы просто перекроются) и присвоим свойству Вывод на экран (Visible) значение Да (Yes):
frm.RecordSource = "Наша организация" DoCmd.MoveSize 1440, 2400 frm.Visible = True
Для изменения положения на экране используется макрокоманда СдвигРазмер (MoveSize), в которой в данном случае задаются координаты верхнего левого угла окна формы относительно главного окна Access.
Замечание
Для того чтобы второй экземпляр формы не исчез с экрана сразу после появления, переменная frm должна быть описана на уровне модуля, т. е. объявлена в разделе (Declarations ) модуля с помощью ключевого слова Private.
Значения свойств формы или элементов управления формы относятся только к текущему экземпляру формы и не сохраняются после того, как он закроется. Это является отличием модуля класса от стандартного модуля: они по-разному хранят данные. В стандартном модуле можно объявить переменную Public, и она, будучи установлена, сохраняет свое значение до тех пор, пока явно не будет изменена другой командой в любом другом модуле. В модуле класса данные относятся к одному экземпляру класса, т. е. одному объекту. Они появляются, когда объект создается, и исчезают, когда исчезает объект. Это означает, что переменные Public в модуле класса могут быть доступны только до тех пор, пока существует переменная, содержащая ссылку на отдельный экземпляр класса. Это утверждение справедливо также для процедур, объявленных Public.
Формы и отчеты являются стандартными классами объектов в Access, однако можно использовать модули класса для создания пользовательских объектов. Имя, под которым сохраняется модуль класса, становится именем специального объекта. Процедуры типа Sub и Function, определенные в модуле класса, при этом станут методами объекта, а процедуры типа Property Let, Property Get и Property Set-свойствами объекта. Для описания метода, не возвращающего никакого значения, используется процедура Sub, а для метода, возвращающего значение, — процедура Function. Процедура Property Get возвращает значение свойства объекта. Процедура Property Set присваивает значение свойству объекта. Процедура Property Let устанавливает значение свойства, не принадлежащего объекту. Более детальные сведения об этих процедурах можно получить из справки Access, набрав в качестве критерия поиска имя процедуры: Property Let, Property Get и Property Set соответственно.
Точно так же, как и в модуле формы, новый экземпляр объекта создается путем объявления переменной, например:
Dim els As New MyClass
После этого обращение к его методам и свойствам осуществляется с помощью данной переменной. Например, если в модуле определена процедура MyProcedure, для того чтобы выполнить эту процедуру, используется выражение
cls.MyProcedure
Создание нового модуля
Иллюстрация 13.11. Создание нового модуля

-
Создать необходимые процедуры и описания.
-
Сохранить модуль, нажав кнопку
Сохранить
(Save) на панели инструментов. При этом выдается диалоговое окно
Сохранение
(Save), в котором необходимо ввести имя нового модуля и нажать кнопку
ОК.
Окно редактора кода VBA
Иллюстрация 13.12. Окно редактора кода VBA

Обычно в окне редактора используются три панели (три отдельных окна). На самом деле окон может быть и больше и меньше, и скоро вы узнаете обо всех, но на рис. 13.12 показано только расположение основных окон.
-
Project
(Панель проекта), располагается в верхнем левом углу редактора. В ней отображается иерархическое дерево модулей приложения. Если это окно неактивно, выполните команду
View, Project Explorer
либо нажмите комбинацию клавиш
+ .
-
Properties
(Панель свойств), находится под панелью проекта. Она позволяет просматривать и изменять свойства различных входящих в проект объектов, отображаемых на панели проекта. Список свойств может отображаться как в алфавитном порядке, так и по категориям.
-
Code
(Панель редактора кода). Это окно занимает большую часть экрана и является "многодокументным", т. е. можно открыть одновременно несколько окон данного типа для разных модулей. Оно представляет собой высокоинтеллектуальный текстовый процессор, существенно облегчающий написание кода VBA.
-
Microsoft Access Class Objects
(Модули классов Access) — включает все модули форм и отчетов;
-
Modules
(Модули) — стандартные модули;
-
Class Modules
(Модули классов) — модули пользовательских классов, если они присутствуют в приложении.
В верхней части панели проекта расположены три кнопки:
-
View Code
(Просмотр кода). При нажатии этой кнопки указатель мыши перемещается в окно кода, в котором отображается код выделенного в иерархии проекта объекта.
-
View Object
(Просмотр объекта). Эта кнопка доступна только когда в дереве проекта выделен модуль формы или отчета. Тогда она позволяет быстро переключиться на соответствующий модулю объект, т. е. в окно Конструктора формы или отчета.
-
Toogle Folders
(Переключение видов представления дерева). При нажатой кнопке все элементы в дереве проекта группируются в папках по категориям, при отжатой — они отображаются в алфавитном порядке..
Чтобы изменить значение свойства объекта, необходимо:
-
Выделить имя свойства в левой колонке.
-
Изменить значение в правой колонке, либо введя его вручную, либо путем выбора из списка.
Код в каждом модуле состоит из разделов, переключение между которыми выполняется путем выбора значения из списка Object (Объект), который размещается в левом верхнем углу окна. Список разделов различается для разных типов модулей.
Для модуля формы этот список включает раздел General (Общая область), который содержит объявления переменных, констант, специальных типов, внешних процедур. Данный раздел открывается по умолчанию при открытии окна кода. Для стандартного модуля этот раздел единственный — он содержит описание всех процедур. Модуль класса имеет разделы General и Class. Модуль формы, кроме раздела General, содержит раздел самой формы и разделы для каждого элемента управления. Модуль отчета включает в себя раздел для объекта Report (Отчет) и разделы для каждой области отчета. Для полей отчета не определены события, поэтому отсутствуют и соответствующие разделы в модуле кода.
Стандартный модуль в окне редактора
Иллюстрация 13.13. Стандартный модуль в окне редактора

Каждый раздел может содержать несколько процедур, выбираемых из списка Procedure в правом верхнем углу окна на рис. 13.13. Список процедур в стандартном модуле содержит Declarations (Описания) и имена всех процедур модуля в алфавитном порядке. Список процедур для модуля формы включает в себя перечень всех событий формы и ее элементов. Для модуля класса список процедур содержит только две процедуры для событий класса: Initialize и Terminate.
С помощью кнопок в левом нижнем углу окна можно выбрать один из видов представления кода в окне.
-
Procedure View
(Представление процедуры), когда в окне отображается только одна выбранная процедура.
-
Full Module View
(Представление полного модуля), когда в окне отображается сразу несколько процедур, отделенных друг от друга тонкой линией.
Диалоговое окно параметров редактора кода
Иллюстрация 13.14. Диалоговое окно параметров редактора кода

Оно содержит четыре вкладки.
Первая вкладка Editor (Редактор) состоит из двух групп параметров: Code Settings и Window Settings.
-
Группа
Code Settings
(Программирование) содержит шесть флажков, которые позволяют включать и отключать интеллектуальные функции редактора, такие как автоотступ, автоматическая проверка синтаксиса, подсказки при написании пользователем программ.
-
Группа
Window Settings
(Параметры окна) включает в себя три флажка, влияющих на представление кода в окне редактора. Эти флажки позволяют переключаться между представлениями полного модуля и процедуры, выводить или не выводить на экран тонкие линии, разделяющие процедуры, включать или отключать функцию перетаскивания текста, т. е. перемещения выделенного фрагмента кода с помощью мыши.
Третья вкладка General (Общая) содержит несколько групп переключателей и флажков.
-
Группа
Form Grid Setting
относится к созданию форм в Microsoft Visual Basic 6.0 и в других компонентах Office и не используется в Access.
-
Флажок
Show ToolTips
позволяет включить или отключить вывод всплывающих подсказок для кнопок на панели инструментов.
-
Флажок
Collapse Proj. Hides Windows
определяет, будет ли скрываться окно редактора при закрытии проекта на панели проекта.
-
Флажок
Notify Before State Loss
определяет, получит ли пользователь сообщение о том, что предпринимаемое действие вызовет потерю состояния текущего проекта.
-
Переключатели
Error Trapping
определяют установки по умолчанию, используемые при обработке ошибок в программах:
-
Break on All Errors
— любая ошибка, независимо от того, обрабатывается ли она программой, приведет к прерыванию выполнения программы;
-
Break in Class Module
— любая необработанная ошибка в модулях класса приведет к прерыванию выполнения программы;
-
Break on Unhandled Errors
— прерывание программы вызывают все необработанные ошибки.
-
Break on All Errors
— любая ошибка, независимо от того, обрабатывается ли она программой, приведет к прерыванию выполнения программы;
-
Compile On Demand
— определяет, будут ли все модули проекта компилироваться перед началом работы или только по требованию, в первом случае запуск приложения будет более длительным;
-
Background Compile
— определяет, будет ли компиляция модулей выполняться в фоновом режиме.
Для того чтобы убедиться, что наши утверждения об интеллектуальности редактора не являются голословными, достаточно попробовать написать даже самую простую программу. Давайте заменим в форме "Клиенты" (Customers) макрос, который открывает форму "Заказы" (Orders) при нажатии кнопки Заказы клиента, процедурой VBA, которая выполняет те же действия. Мы создавали такой макрос в разд. "Назначение макроса событию" гл. 11. Если вы этого не делали, тогда создайте сейчас командную кнопку в области заголовка окна и назовите ее "Заказы клиента" (кнопка Мастера на панели элементов при этом должна быть отжата).
После этого нажмите кнопку Программа (Code) на панели инструментов. Откроется редактор кода VBA, который по умолчанию попытается создать процедуру обработки события Load формы. Выберите из списка слева объект Заказы клиента. Редактор автоматически вставит заголовок и концовку процедуры обработки события Click (рис. 13.15). Открыв список справа, вы можете увидеть, как много различных событий связано с командной кнопкой, однако наиболее часто используется именно событие Click. Так как с этим событием сейчас не связано никакой процедуры, редактор сразу пытается ее создать.
Начнем писать текст процедуры. Процедура будет состоять из нескольких команд. Нам необходимо открыть форму "Заказы" (Orders) и показать в этой форме только те заказы, которые относятся к определенному клиенту, поэтому придется задать условие для отбора записей в форме "Заказы" (Orders). Обычно для этого используют переменную типа string, которой сначала присваивают нужное значение, а потом подставляют в качестве параметра в макрокоманду Открытьформу (OpenForm). Чтобы использовать такую переменную, ее сначала нужно описать, поэтому первое предложение в процедуре должно быть следующим:
Dim stLinkCriteria As String
Создание процедуры обработки события
Иллюстрация 13.15. Создание процедуры обработки события

Как только вы напишете первые три слова Dim stLinkCriteria As, на экране появится список слов (рис. 13.16), которые могут быть использованы в данном предложении.
Автоматический вывод списка компонентов
Иллюстрация 13.16. Автоматический вывод списка компонентов

Вы набираете следующие буквы — str, после чего курсор в списке устанавливается на слове string. Дальше можно не продолжать, а просто нажать клавишу <Таb> — конец слова допишется автоматически. Нажмите клавишу
Следующая строка будет присваивать переменной strLinkCriteria значение: stLinkCriteria = "[КодКлиента]=" & "'" & Me![КодКлиента] & "'"
Две формы будут связаны по значению поля CustomerID. Первое выражение [КодКлиента] относится к форме "Заказы" (Orders), а второе значение Me! [КодКлиента] — к текущей форме "Клиенты" (Customers), о чем говорит слово Me. Теперь используем макрокоманду Открыть форму (OpenForm) для того, чтобы открыть форму "Заказы" (Orders). Как только набирается docmd, появляется новая подсказка — список макрокоманд (рис. 13.17).
Автоматический вывод методов объекта
Иллюстрация 13.17. Автоматический вывод методов объекта

Уже известным способом выбираем нужную макрокоманду, нажимаем пробел и опять подсказка — синтаксис макрокоманды Открыть форму (OpenForm) (рис. 13.18).
Автоматический вывод кратких сведений
Иллюстрация 13.18. Автоматический вывод кратких сведений

И это очень кстати, т. к. позволяет не запоминать все аргументы макрокоманды и порядок их следования. Введите имя формы: Заказы (Orders), запятую, и опять появится подсказка с именами возможных констант, которые могут быть указаны в следующем параметре. Выберите константу acNormal и продолжайте ввод. Должна получиться строка:
DoCmd.OpenForm "Заказы", acNormal, , stLinkCriteria
Две следующие подряд запятые говорят о пропущенном параметре — имя фильтра.
Теперь добавим еще одну команду — изменим заголовок формы:
Forms!Заказы.Caption = "Заказ" & Название
И наконец, напишем комментарий, который объясняет, что делает данная программа. Для этого поместите курсор в начало второй строки программы и нажмите клавишу
Программа открытия формы "Заказы"
Иллюстрация 13.19. Программа открытия формы "Заказы"

На примере этой простой программы мы продемонстрировали три очень полезных свойства редактора.
-
Автоматическая проверка синтаксиса —
ввод команды успешен и все слова выделяются нужным цветом, только когда синтаксис предложения правилен, в противном случае вы услышите звуковой сигнал, текст будет выделен красным цветом и появится сообщение об ошибке.
-
Автоматический вывод списка компонентов
Auto List Members
позволяет избежать ошибок при вводе наименований свойств объектов, встроенных констант, типов переменных. Особенно эта функция полезна при установке свойств, т. к. позволяет не только вспомнить правильное имя свойства, но и увидеть, какие свойства объекта доступны в данный момент.
-
Автоматический вывод кратких сведении
Auto Quick Info
показывает в виде всплывающей подсказки синтаксис встроенных функций и макрокоманд. По мере ввода параметров очередной параметр выделяется в подсказке жирным шрифтом.
Однако при необходимости вы легко получите требуемую помощь, если воспользуетесь контекстным меню редактора кода (рис. 13.20).
Первый уровень иерархии объектной модели
Иллюстрация 13.1. Первый уровень иерархии объектной модели Microsoft Access 2002

Контекстное меню редактора кода
Иллюстрация 13.20. Контекстное меню редактора кода

Кроме описанных выше функций, в контекстном меню присутствуют и другие очень полезные функции, способствующие быстрому написанию кода, — List Constants, Parameter Info, Complete Word, а также две команды, очень упрощающие навигацию среди программных модулей:
-
Definition.
Если в процедуре выполняется вызов другой процедуры, то, установив курсор на имя вызываемой процедуры и выбрав из контекстного меню команду
Definition
(а еще быстрее, нажав комбинацию клавиш
+ ), вы сразу попадете в тело вызываемой процедуры;
-
Last Position
— позволяет после такого перехода вернуться обратно.
Окно просмотра объектов
Иллюстрация 13.21. Окно просмотра объектов

При этом в нижней части окна, которая называется область описания, отображается описание выбранного элемента.
Если выбрать в поле Project/Library (Проект/Библиотека) текущее приложение "Борей" (Northwind), то в поле Classes (Классы) отобразятся все модули форм, отчетов и стандартные модули приложения (рис. 13.22).
Если вы написали много процедур, то это удобный способ найти нужную процедуру. Кроме того, если вы, выбрав в списке компонентов модуля интересующую вас процедуру, нажмете кнопку View Definition (Посмотреть описание) (на панели инструментов в верхней части окна вторая справа), то откроется окно данного модуля, и вы увидите в нем именно эту процедуру.
Объекты приложения "db1"
Иллюстрация 13.22. Объекты приложения "db1"

Для поиска необходимого объекта, метода или свойства существует поле Search Text (Образец поиска). Это второе поле со списком в верхней части окна. В него можно ввести фрагмент текста для поиска и нажать кнопку с биноклем, которая находится рядом. Тогда открывается дополнительная область Search Results (Результаты поиска), в которой отображается список компонентов, удовлетворяющих условию поиска (рис. 13.23).
Отображение результатов поиска
Иллюстрация 13.23. Отображение результатов поиска

Выделив в списке нужную строку, можно снова воспользоваться кнопкой View Definition, чтобы открыть нужную процедуру.
Еще одна очень полезная кнопка в этом окне Copy to Clipboard (Копировать в буфер обмена). Она позволяет копировать выбранный объект в буфер, после чего объект можно будет вставить прямо в текст программы.
Диалоговое окно References
Иллюстрация 13.24. Диалоговое окно References

Все библиотеки, на которые установлены ссылки, помещаются в начале списка, причем, пользуясь кнопками Priority, вы можете поменять порядок их следования. Обращение к этим библиотекам при разрешении ссылок на объекты выполняется в том порядке, в каком они следуют в списке.
Меню и панель инструментов Debug
Иллюстрация 13.25. Меню и панель инструментов Debug

Добавление контрольного значения
Иллюстрация 13.27. Добавление контрольного значения

Замечание
Группа Context (Контекст) в окне Add Watch позволяет определить область контроля заданного значения или выражения: конкретная процедура текущего модуля, все процедуры текущего модуля или все модули текущей базы данных.
Окно Watches редактора кода
Иллюстрация 13.28. Окно Watches редактора кода

Теперь нужно снять точку останова, которую мы установили. Для этого щелкните правой кнопкой мыши в строке останова и выберите команду Toggle, Breakpoint из контекстного меню (или нажмите клавишу
Закройте окно редактора кода и снова нажмите кнопку Заказы клиента в форме 'Клиенты" (Customers). Выполнение программы остановится на той же команде. Нажмите кнопку Watch Window на панели инструментов или выберите соответствующую команду в меню View. В нижней части редактора появляется новое окно Watches (рис. 13.28), в котором будет выведена одна строка, содержащая контрольное выражение, его значение, тип и контекст, т. е. процедура, в которой вычисляется контрольное значение. Выражение истинно, и программа остановлена.
Существует очень простой способ добавления контрольных значений в окно Watches. Можно просто выделить в тексте процедуры выражение и перетащить его в это окно мышью. Попробуйте проделать эту операцию с выражением Forms! Заказы. Caption и выполните несколько шагов процедуры, наблюдая, как изменяется выражение в окне Watches.
Диалоговое окно Quick Watch
Иллюстрация 13.29. Диалоговое окно Quick Watch

Если вы решите добавить выбранное выражение к контрольным значениям, просто нажмите кнопку Add (Добавить).
Второй уровень иерархии объектной модели Microsoft Access 2002 — объекты баз данных
Иллюстрация 13.2. Второй уровень иерархии объектной модели Microsoft Access 2002 — объекты баз данных

Окно Immediate
Иллюстрация 13.30. Окно Immediate

Окно Immediate открывается при нажатии кнопки Immediate Window на панели инструментов, или при выполнении соответствующей команды в меню View, или при нажатии комбинации клавиш
Для того чтобы вывести значение переменной, нужно ввести знак "?" и имя переменной и нажать клавишу
Метод Print объекта Debug направляет вывод в это окно в процессе выполнения программы. Например, команда
Debug.Print "Цена.Enabled = "; Цена.Enabled
печатает значение свойства Доступ (Enabled) поля "Цена" (UnitPrice) в окне Immediate.
В окне Immediate можно не только выводить значения переменных и свойств, но и задавать их, например можно в режиме останова ввести команду
Цена.Enabled = True
При этом на экране должна быть открыта форма, в которой присутствует данное поле. Аналогично присваиваются значения переменным, вызываются процедуры и выполняется большинство других команд. Ограничение на вводимые команды существует одно — они должны полностью помещаться на одной строке кода. После ввода команды и нажатия клавиши
Диалоговое окно Call Stack
Иллюстрация 13.31. Диалоговое окно Call Stack

Выбрав в стеке нужную процедуру, можно нажать кнопку Show (Показать), тогда окно Call Stack закроется и в окне кода модуля появится выбранная процедура. При этом курсор устанавливается на строку кода, вызывающую следующую процедуру из стека. Если выбирается текущая процедура, то курсор устанавливается на текущую команду.
Окно Call Stack вызывается несколькими способами:
-
нажать кнопку
Call Stack
на панели инструментов;
-
выбрать команду
View, Call Stack;
-
нажать комбинацию клавиш
+ ;
-
нажать кнопку с многоточием в верхнем правом углу окна
Locals.
Диалоговое окно событий формы
Иллюстрация 13.32. Диалоговое окно событий формы

Если процедура обработки выбранного события имеет аргументы, они будут также присутствовать в заголовке процедуры (рис. 13.34).
Теперь нужно ввести код процедуры между этими двумя строками. Ниже приведены некоторые примеры процедур обработки событий.
Заготовка процедуры обработки события
Иллюстрация 13.33. Заготовка процедуры обработки события


Иллюстрация 13.34.
Процедура обработки событий с аргументом Cancel
Перекрестный запрос "Выработка сотрудников"
Иллюстрация 13.35. Перекрестный запрос "Выработка сотрудников"

Поле "Отпускная цена" является вычисляемым, и для его вычисления используется формула
CCur(CLng([Заказано].[Цена]*
[Количество]*(1-[Скидка])*100)/100)
Создание такого отчета требует написания довольно большого числа процедур обработки событий.
В запросе в качестве критерия выборки заказов указан год — 1998. Нужно вывести приглашение пользователю, чтобы он, в свою очередь, мог ввести желаемый год. Это можно сделать при открытии отчета. Сначала нужно создать базовый набор записей для отчета и посчитать, сколько получилось столбцов в этом наборе. Следующая процедура обрабатывает событие Открытие (On Open) отчета:
Private Sub Report_0pen(Cancel As Integer)
On Error Resume Next
' Создает базовый набор записей для отчета.
Dim intX As Integer
Dim qdf As QueryDef
Dim frm As Form
Dim StrSql As String
' Связывает переменную с текущей базой данных.
Set dbsReport = CurrentDb
' Открывает запрос (объект QueryDef).
Set qdf = dbsReport.QueryDefs("Выработка сотрудников")
' Запрашивает год.
Год = InputBox("Отчет за год:", "Год", 1998)
StrSql =Left(qdf.SQL, InStr(qdf.SQL, "where") - 1) & " WHERE_ (((Year([ДатаИсполнения]))= " & Год & "))" & Right(qdf.SQL, Len(qdf.SQL) - InStr(qdf.SQL, "GROUP BY") + 1)
qdf.SQL = StrSql
' Открывает набор записей
Set rstReport = qdf.OpenRecordset()
' Определяет количество столбцов в перекрестном запросе.
intColumnCount = rstReport.Fields.Count
End Sub
Здесь переменная intColumnCount должна быть определена на уровне модуля формы, т. к. она используется и другими процедурами данной формы.
Для событий Форматирование (On Format) верхнего колонтитула (листинг 13.1) и области данных отчета (листинг 13.2) необходимо определить процедуры, которые бы заполняли поля заголовков и значений и скрывали неиспользуемые поля.
Использование функции при обработке событий в форме
Иллюстрация 13.36. Использование функции при обработке событий в форме

Еще один пример применения функции для обработки событий в форме вы может увидеть в базе данных "Контакты" (Contacts) (см. пример к гл. 18 на компакт-диске) В этом приложении с помощью Мастера кнопочных форм создана главная кнопоч ная форма, которая открывается при открытии приложения. На форме имеются не сколько кнопок, каждая из которых выполняет определенную функцию, но обрабаты ваются они все одинаково. Для этого мастер создает функцию =HandleButtonClick которая имеет один аргумент — идентификатор нажатой кнопки. Вызов функци! выполняется, как показано на рис. 13.37. Аргумент определяет нажатую клавишу. Oi обрабатывается программой в блоке Select Case, после чего выполняется соот ветствующее действие.

Иллюстрация 13.37.
Вызов функции для обработки события
Нажатие кнопки
Второй уровень иерархии объектной модели Microsoft Access 2002 — объекты для работы с базой данных и проектом
Иллюстрация 13.3. Второй уровень иерархии объектной модели Microsoft Access 2002 — объекты для работы с базой данных и проектом

Глядя на схемы объектной модели, можно определить какие объекты описывают приложение, как они связаны между собой и как составить ссылку для доступа к конкретному объекту.
Табл. 13.3 содержит описание объектов Microsoft Access 2002, определенных в библиотеке Access, если не указана другая библиотека объектов.
Модель объектов доступа к данным для рабочей области Microsoft Jet
Иллюстрация 13.4. Модель объектов доступа к данным для рабочей области Microsoft Jet

В табл. 13.4 описаны объекты доступа к данным. В первом столбце приведены объекты-семейства, а во втором — объекты, являющиеся элементами соответствующего семейства, в третьем — описание объекта. В последующих главах книги "вы встретитесь с примерами использования объектной модели DAO.
Модель объектов доступа к данным для рабочей области ODBCDirect
Иллюстрация 13.5. Модель объектов доступа к данным для рабочей области ODBCDirect

Объектная модель ADOX
Иллюстрация 13.6. Объектная модель ADOX

Объектная модель Microsoft Office 2002
Иллюстрация 13.7. Объектная модель Microsoft Office 2002

Объекты Microsoft Office используются в иерархической структуре других объектных моделей. В объектной модели Microsoft Office 2002 появилось много новых объектов. Описание основных объектов, определенных в библиотеке Office, приведено в табл. 13.10.
Функция IsLoaded
Иллюстрация 13.8. Функция IsLoaded

Список стандартных модулей приложения всегда можно увидеть, нажав кнопку Модули (Modules) в окне База данных (Database). В этом окне обычно и выполняется работа с модулями. Выделите в окне базы данных (Northwind) модуль "Служебные функции" (Utility Functions) и нажмите кнопку Конструктор (Design). Откроется окно редактора кода VBA, в котором можно увидеть содержание модуля. Модуль состоит из двух строк описания и одной процедуры — функции isLoaded, с которой мы уже встречались (рис. 13.8) (см. гл. 11).
Это пример универсальной функции, которая проверяет, загружена ли форма, имя которой передается ей в качестве аргумента. Она никак не связана не только с объектом, но и с данным приложением и может использоваться как в нем самом, так и в любом другом приложении Access.
Диалоговое окно свойств формы
Иллюстрация 13.9. Диалоговое окно свойств формы

В окне редактора VBA отображается объект Форма (Form), а справа — поле со списком событий, которые могут обрабатываться процедурами VBA (рис. 13.10).
Инструментальные средства отладки
Инструментальные средства отладки
Помимо интеллектуального редактора текста профессиональная среда программирования обычно содержит инструментальные средства отладки. Инструментальные средства отладки призваны дать разработчику максимально ясное представление о том, как работает его программа. И уже искусство разработчика состоит в том, чтобы, используя все имеющиеся в его распоряжении средства, быстро выявить ошибки. Набор средств отладки в Access широк: это и специальное меню Debug (Отладка), и во многом дублирующие его кнопки на панели инструментов, и специальные окна отладки. Далее кратко дается описание каждого средства.
Использование функций для обработки событий
Использование функций для обработки событий
Обычно для обработки событий в формах и отчетах используют процедуры типа Sub (подпрограммы) или макросы. Однако иногда можно и даже нужно использовать функции. Дело в том, что если в рамках одной формы делается множество однотипных задач, то лучше создать одну процедуру — функцию для выполнения этих задач, описать ее на уровне модуля формы, т. е. в разделе General, а потом вызывать из любого места в форме. Если это необходимо, для такой функции определяется один или несколько параметров, которые передаются при вызове данной функции. И хотя значение, возвращаемое функцией, не используется (а обычно и не определяется), применение ее оправдано не только потому, что требуется писать меньше строк кода, а главным образом потому, что минимизация кода в модуле формы ускоряет ее открытие.
Если же идентичные задачи решаются в разных формах, например, одна и та же реакция предусматривается для одинаковых кнопок в разных формах, то такую функцию нужно написать в стандартном модуле базы данных.
Совет
Если форма сложная, например содержит большое количество элементов управления, в том числе поля со списками, то в целях повышения ее быстродействия рекомендуется удалить модуль формы, а все процедуры обработки событий заменить функциями, которые следует при этом вынести в стандартный модуль.
Допустим, вы отображаете в форме список каких-либо объектов, например счетов клиента. Обычно это делается в подчиненной форме табличного или ленточного вида, в которой отображаются наиболее важные характеристики счета: номер счета, дата выписки, наименование клиента, сумма. И вы хотите дать возможность пользователю при желании посмотреть тот счет, который он выбрал, установив курсор на соответствующую строчку. Это можно сделать, создав процедуру открытия формы счета с нужной записью при двойном щелчке мыши на строчке счета. Естественно, что форма должна открываться при щелчке в любом поле подчиненной формы. Вместо того чтобы в каждом поле подчиненной формы на событие Двойное нажатие (DblClick) создавать процедуру обработки событий, можно создать одну функцию и присоединить ее ко всем полям. Функция будет выглядеть так:
Private Function Order_DblClick()
Dim strCriteria As String
On Error Goto Err Order DblClick
strCriteria = "КодЗаказа = Forms![Заказы клиента]!_ [Заказы клиента подчиненная].form!КодЗаказа"
DoCmd.OpenForm "Заказы", acNormal, , strCriteria
Exit_Order_DblClick: Exit Function
Err_Order_DblClick: ; MsgBox Err.Description Resume Exit_Order_DblClick
End Function
А присоединить эту функцию к событию элемента управления формы можно так, как показано на рис. 13.36. Мы сделали это для формы "Заказы клиента" (Customer Orders) приложения (NorthWind).
Использование комбинаций клавиш быстрого вызова
Использование комбинаций клавиш быстрого вызова
Поскольку работа в редакторе — это главным образом работа с клавиатурой, существует большое количество специальных клавиш и комбинаций клавиш быстрого вызова для выполнения определенных функций. Вы можете увидеть их в меню Run, Debug и View. Список наиболее часто используемых клавиш и их комбинаций приведен в табл. 13.12.
Использование объектов и семейств
Использование объектов и семейств
Несмотря на разнообразие библиотек объектов, методы работы с объектами в процедурах VBA общие и не зависят от того, к какой библиотеке относится конкретный объект. В данном разделе мы как раз и рассмотрим эти общие методы.
Использование окна просмотра объектов
Использование окна просмотра объектов
Окно Object Browser (Обозреватель объектов) позволяет просматривать все объекты, их свойства и методы, доступные для текущего проекта. Объекты могут быть встроенными объектами Access или VBA, объектами, которые вы создали в своем приложении, а также объектами, входящими во внешние библиотеки, на которые имеются ссылки в текущем проекте. Вызвать окно просмотра объектов можно тремя способами:
-
нажать клавишу
— самый быстрый;
-
нажать кнопку
Object Browser
(Обозреватель объектов) на панели инструментов — удобный;
-
выбрать команду
View, Object Browser
(Вид, Обозреватель объектов) — если вы забыли другие способы.
Список Project/Library (Проект/Библиотека) в левом верхнем углу окна содержит перечень всех библиотек и проектов, на которые имеются ссылки в данном проекте. Как минимум, он включает библиотеку Access, библиотеку VBA, библиотеку текущего проекта.
При выборе из списка одной из библиотек в нижнем левом поле Classes (Классы) отображается список следующего уровня — перечень всех объектов, входящих в эту библиотеку. Например, если выбрать библиотеку Access, то в списке Classes вы увидите много знакомых объектов. Выбрав один из них, например DoCmd, в правом поле Members of можно увидеть все методы этого объекта. Если бы мы выбрали объект Form, то в списке справа отобразились бы все свойства и методы объекта Form.
Изменение размера
Изменение размера
Событие Изменение размера (Resize) возникает при открытии формы и при изменении ее размеров. Его обычно применяют, если требуется подстроить размер элементов управления под изменяющиеся размеры формы или вычислить заново вычисляемые элементы. Если нужно, чтобы при каждом изменении размеров формы происходило обновление экрана, используйте в процедуре обработки этого события метод Repaint.
Замечание
При создании процедур обработки событий часто возникают сомнения, какое из двух событий — Открытие (Open) или Загрузка (Load) — использовать (или, соответственно, Закрытие (Close) или Выгрузка (Unload)). Рекомендуется принимать во внимание следующее соображение. Если требуется возможность отменить событие, то пользуйтесь событиями Открытие (Open) и Выгрузка (Unload), в противном случае можно использовать любое.
Клавиша вниз и Клавиша вверх
Клавиша вниз и Клавиша вверх
События Клавиша вниз (KeyDown) и Клавиша вверх (KeyUp) возникают всякий раз, когда пользователь нажимает или отпускает клавишу на клавиатуре и при этом фокус находится на элементе управления или форме. Процедуры обработки этих событий используют, когда требуется определить, какую клавишу нажал пользователь — функциональную, клавишу управления курсором, клавишу цифровой панели или комбинацию клавиш с
Кнопка вниз и Кнопка вверх
Кнопка вниз и Кнопка вверх
События Кнопка вниз (MouseDown) и Кнопка вверх (MonseUp) возникают, когда пользователь нажимает и, соответственно, отпускает кнопку мыши, и, в отличие от событий Нажатие кнопки (Click) и Двойное нажатие кнопки (DblClick), оно позволяет определить, какая кнопка нажата. Процедуры обработки этих событий имеют четыре параметра: Button, Shift, х и Y. Эти параметры аналогичны параметрам процедуры для события Перемещение указателя (MouseMove) за исключением первого параметра — Button. Так как в данном случае нажимается конкретная кнопка мыши, параметр Button определяет, какая это кнопка. Если пользователь нажмет сразу две кнопки, то возникнут отдельно события для первой и для второй кнопок.
Замечание
Если кнопка мыши была нажата, когда указатель находился на одном из элементов управления формы, то именно к этому объекту будут относиться все остальные события мыши до последнего Кнопка вверх (MouseUp) включительно.
Колесико мыши
Колесико мыши
Событие возникает, когда пользователь перемещает указатель мыши с помощью колесика скроллирования. Процедура обработки события имеет два параметра:
-
Page — принимает значение True при перемещении указателя на другую страницу;
-
Count — количество линий, на которое переместился указатель при прокрутке формы с помощью колесика мыши.
Процедура обработки события Форматирование верхнего колонтитула
Листинг 13.1. Процедура обработки события Форматирование верхнего колонтитула
Private Sub PageHeader()_Format(Cancel As Integer,_
FormatCount As Integer)
Dim intx As Integer
' Помещает заголовки столбцов в поля в верхнем колонтитуле.
Me("Head" + Format(0)) = rstReport(0).Name
For intX = 1 To intColumnCount - 1
Me("Head" + Format(intX)) =_
MonthRus(CInt(rstReport(intX).Name))
Next intX
' Вводит в ближайшее свободное поле заголовок "Итого".
Me("Head" + Format(intColumnCount)) = "Итого"
' Скрывает пустые поля в верхнем колонтитуле.
For intX = (intColumnCount +1) То conTotalColumns - 1
Me("Head" + Format(intX)).Visible = False
Next intX
End Sub
В этой процедуре используется функция MonthRus, которая по порядковому номеру месяца выдает его название. Мы здесь не приводим текста этой функции, надеясь, что вы сможете написать ее сами conTotalColumns — константа, которая описана на уровне модуля и значение которой определяет максимальное число столбцов в отчете. В данном примере conTotalColumns равна 14.
что не достигнут конец набора
Листинг 13.2. Процедура обработки события Форматирование области данных 1
Private Sub Detaill_Format(Cancel As Integer,_ FormatCount As Integer)
' Вводит значения в поля и скрывает пустые поля.
Dim intX As Integer
' Проверяет, что не достигнут конец набора записей.
If Not rstReport.EOF Then
'Помещает значения из набора записей в поля области данных
If Me.FormatCount = 1 Then
For intX = 0 To intColumnCount - 1
' Преобразует пустые значения в 0.
Me ("Col" + Format(intX)} =_
xtabCnulls(rstReport(intX))
Next intX
' Скрывает неиспользуемые поля в области данных.
For intX = intColumnCount + 1 То conTotalColumns - 1
Me("Col" + Format(intX)).Visible = False Next intX
' Переходит к следующей записи в наборе. rstReport.Move
Next
End If
End If
End Sub
Свойство FormatCount отчета содержит значение, равное количеству столбцов для форматирования, поэтому в процедуре проверяется это свойство, и присвоение значений полям в области данных выполняется, только если это значение не 0. В процедуре используется также функция xtabCnulls, преобразующая пустое значение в 0.
Для события Печать (On Print) области данных отчета нужно создать процедуру, которая бы суммировала значения по строке отчета, выводила полученное значение в последнем столбце и, кроме того, добавляла эту сумму в массив итоговых значений по столбцам (листинг 13.3). Массив итоговых значений по столбцам IngRgColumnTotal и переменная IngReportTotal, определяющая общий итог, должны быть описаны на уровне модуля. Кроме того, они должны быть инициализированы, т. е. им нужно присвоить начальные значения 0. Это можно сделать в процедуре обработки события Загрузка (On Load) отчета.
Процедура обработки события Печать области данных
Листинг 13.3. Процедура обработки события Печать области данных
Private Sub Detaill_Print(Cancel As Integer, PrintCount As Integer)
Dim intX As Integer
Dim IngRowTotal As Long
' Вычисляет сумму по строке и добавляет ее к итоговому значению. ' по столбцу и общему итогу
If Me.PrintCount = 1 Then IngRowTotal = 0
For intX = 1 To intColumnCount - 1
' Начиная со столбца 1 (первый столбец с перекрестными
' значениями), вычисляет сумму по строке.
lngRowTotal = IngRowTotal + Me("Col" + Format(intX))
' Добавляет итоговое значение для текущего столбца.
IngRgColurenTotal(intX) = IngRgColumnTotal(intX) +_
Me ("Col" + Format(intX))
Next intX
' Заносит сумму по строке в поле в области данных. Me("Col" + Format(intColumnCount)) = IngRowTotal
' Прибавляет сумму по строке к общему итогу.
IngReportTotal = IngReportTotal + IngRowTotal
End If
End Sub
Процедура обработки события Печать (On Print) примечания отчета должна заполнить поля примечания итоговыми значениями по столбцам из массива IngRgColumnTotal (листинг 13.4).
Процедура обработки события Печать примечания
Листинг 13.4. Процедура обработки события Печать примечания
Private Sub ReportFooter4_Print(Cancel As Integer,_
PrintCount As Integer)
Dim intX As Integer
' Помещает суммы по столбцам в поля примечания.
For intX = 1 То intColumnCount - 1
Me("Tot" + Format(intX)) = IngRgColumnTotal(intX)
Next intX
' Помещает общий итог в поле примечания.
Me("Tot" + Format(intColumnCount)) = IngReportTotal
' Скрывает неиспользуемые поля в примечании отчета.
For intX = intColumnCount + 1 То conTotalColumns - 1
Me("Tot" + Format(intX)).Visible = False
Next intX
End Sub
Для корректной работы нужно еще добавить две небольшие процедуры в свойства отчета:
-
при закрытии отчета нужно закрыть базовый набор записей — обработка события
Закрытие
(On Close);
-
при отсутствии данных в базовом наборе записей нужно закрыть этот набор и прервать формирование отчета — событие
Отсутствие данных
(On No Data).
Процедура обработки события Закрытие отчета
Листинг 13.5. Процедура обработки события Закрытие отчета
Private Sub Report_Close()
On Error Resume Next
rstReport.Close
End Sub
Процедура обработки события Отсутствие данных отчета
Листинг 13.6. Процедура обработки события Отсутствие данных отчета
Private Sub Report_NoData(Cancel As Integer)
MsgBox "He найдены записи, удовлетворяющие указанным_
условиям.", vbExclamation, "Записи не найдены"
rstReport.Close Cancel = True
End Sub
Массивы
Массивы
Массив — это переменная, в которой хранится одновременно несколько значений одинакового типа. Формальное определение массива таково: он представляет собой совокупность однотипных индексированных переменных.
Количество используемых индексов массива также может быть различным. Чаще всего применяются массивы с одним или двумя индексами, реже — с тремя, еще большее количество индексов встречается крайне редко. В VBA допускается использовать до 60 индексов. О количестве индексов массива обычно говорят как о размерности массива. Массивы с одним индексом называют одномерным, с двумя — двумерными и т. д. Массивы с большим количеством измерений могут занимать очень большие объемы памяти, так что следует быть осторожным в их применении.
Прежде чем использовать массив, нужно обязательно объявить его с помощью оператора Dim и указать при этом тип хранящихся в массиве значений. Все значения в массиве обязаны принадлежать к одному типу данных. Это ограничение на практике можно обойти, использовав при объявлении массива тип Variant — в этом случае элементы массива смогут принимать значения разных типов. Вот синтаксис оператора объявления массива:
Dim <имяМассива> (<размер1>, <размер2>, ...) As <типДанных>
где указанные в скобках величины <размер1>, <размер2> и т.д. задают размеры массива — количество индексов и максимально допустимое значение для каждого. конкретного индекса. При этом индексирование элементов массива по умолчанию начинается с нуля. Так, объявление
Dim Array1 (9) As Integer
определяет одномерный массив из 10 элементов, являющихся переменными целого типа, а объявление
Dim Array2 (4, 9) As Variant
определяет двумерный массив из пятидесяти (5x10) элементов, являющихся переменными универсального типа variant.
Замечание
В качестве стандартного значения нижней границы для допустимых значений индекса может использоваться не только ноль. Можно изменить это стандартное значение с помощью оператора Option Base. Например, если поместить в начало вашего модуля оператор Option Base 1, то индексирование элементов массивов по умолчанию будет начинаться не с нуля, а с единицы.
При объявлении массива можно указать не только верхнюю границу индекса, но и его нижнюю границу, т. е. явно задать диапазон изменения конкретного индекса массива, причем нижняя граница может быть любым целым числом, необязательно неотрицательным. Вот синтаксис такого определения:
Dim <имяМассива> (<мин1> То <макс1>, ...)
As <типДанных>
Например, если вы собираетесь работать с массивом метеорологических данных, представляющих собой средние дневные температуры за последние две недели, то может оказаться весьма удобным дать следующее определение массива:
Dim Temperature (-14 То 0)
As Single
При этом, например, Temperature (-2) будет соответствовать позавчерашней температуре, а для определения нужного индекса для интересующего вас дня будет достаточно использовать разность дат.
В приведенных выше примерах речь шла о массивах фиксированного размера, количество элементов в которых явно указано во время описания массива в операторе Dim. Такие массивы называются статическими. В VBA допускается использование и динамических массивов, размеры которых при описании не фиксируются. Определение размера динамического массива может быть сделано непосредственно во время выполнения программы.
При определении динамического массива в операторе Dim после имени массива стоят лишь пустые скобки и описание типа переменных. Количество индексов и диапазон их изменения не задаются. Однако перед тем, как использовать массив, нужно выполнить оператор ReDim, который задаст размерность и диапазоны изменения индексов динамического массива.
Синтаксис объявления и определения размеров динамического массива таков:
Dim <имяМассива> ( ) As <типДанных>
ReDim <имяМассива> (<размер1>, <размер2>, . . . )
Вот как может выглядеть объявление, определение размеров и использование динамического массива, а затем последующее изменение размерности и размеров этого же массива:
Dim dArray ( ) As Variant
ReDim dArray ( 1 , 2 )
dArray (0, 0) = 2
dArray (0, 1) = 3
k = dArray (0, 0) + dArray (0, 1)
ReDim dArray (k)
dArray (0) = "Строка1"
В этом примере массив dArray сначала определяется как двумерный массив из шести элементов, а затем переопределяется как одномерный массив, причем верхняя граница индекса задается значением переменной k.
Замечание
Чтобы определить текущую нижнюю или верхнюю границу массива, можно использовать функции LBound и Ubound соответственно.
Учтите, что по умолчанию при изменении размеров массива ему заново выделяется память и текущие значения его элементов теряются. Чтобы не потерять текущие значения массива при изменении его размеров, используется ключевое слово Preserve. Например, чтобы увеличить размер массива dArray на один элемент, не потеряв значений существующих элементов, можно поступить следующим образом:
ReDim Preserve dArray (UBound( dArray) + 1)
Меню Debug
Меню Debug
Меню Debug (Отладка) и специальная панель инструментов Debug (Отладка) представлены на рис. 13.25. Назначение команд меню описано в табл. 13.11.
Модель объектов ActiveX для управления данными
Модель объектов ActiveX для управления данными
Объекты управления данными ActiveX (ADO/ ActiveX Data Objects) предназначены для обеспечения доступа к источникам данных разных видов, от текстовых файлов до распределенных баз данных. ADO представляет собой объектно-ориентированный интерфейс для приложений, использующих OLE DB. OLE DB — это программный интерфейс, удовлетворяющий спецификации COM (Component Object Model, компонентная модель объектов), который предоставляет унифицированный способ доступа к различным источникам данных. Интерфейс OLE DB разрабатывался с целью получения оптимальной функциональности для приложений разных видов и поэтому не является простым в использовании. ADO — промежуточное звено между приложением и OLE DB, предоставляющее разработчикам приложений удобный объектно-ориентированный интерфейс.
Существует три объектных модели, которые вместе обеспечивают те функции работы с данными, которые реализуются объектами DАО:
-
Microsoft ActiveX Data Objects 2.6 (ADODB);
-
Microsoft ActiveX Data Objects Extensions for DDL and Security 2.6 (ADOX);
-
Microsoft Jet and Replication Objects 2.6 (JRO).
-
Управление данными.
Объектная модель ADODB обеспечивает вашему приложению доступ к источнику данных и возможность отбирать для просмотра и изменять эти данные. Однако она не предоставляет возможности изменять структуру таблиц и других объектов источника данных.
-
Определение данных и защита.
Объектная модель ADOX позволяет программно изменять структуру объектов в источнике данных, в частности добавлять и удалять таблицы, изменять структуру таблиц, создавать и изменять запросы, представления и хранимые процедуры, а также управлять схемой защиты данных: создавать группы пользователей и отдельных пользователей, наделять их требуемыми правами доступа к объектам.
-
Репликация и службы ядра базы данных Jet.
Объектная модель JRO позволяет создавать, модифицировать и синхронизировать реплики. Она была спроектирована специально для доступа к объектам Jet и, в отличие от моделей ADODB и ADOX, может работать только с базами данных Access.
Модули как объекты Access
Код VBA в приложении Access содержится в модулях. Модули являются объектами Access, такими же, как таблицы, запросы, формы, отчеты, страницы и макросы, о чем свидетельствует ярлык на панели объектов в окне База данных (Database). Основное содержание модулей — это процедуры на языке VBA. Существуют два типа модулей: стандартные модули и модули класса.
Модули класса
Модули класса
Вторым типом модуля в Access является модуль класса. Модуль класса отличается от стандартного модуля тем, что, кроме процедур, он содержит описание объекта и используется для создания объектов. Процедуры, определенные в этом модуле, являются методами и свойствами объекта. Примерами модулей класса являются модули форм и отчетов.
Модули форм и отчетов связаны с конкретной формой или отчетом и содержат процедуры обработки событий для этой формы или отчета. Модуль формы не создается сразу при создании новой формы. Он создается и связывается с формой, как только вы попытаетесь создать первую процедуру обработки событий для этой формы или одного из элементов управления формы или же нажмете кнопку Программа (Code) в окне Конструктора формы.
Чтобы убедиться в этом, откройте любую форму приложения "Борей" (Northwind) в режиме Конструктора и посмотрите свойства этой формы. На вкладке Другие (Others) есть свойство Наличие модуля (Has Module). Оно должно иметь значение Нет (No). После нажатия кнопки Программа (Code), которая служит для открывания редактора кода VBA, значение этого свойства изменится на Да (Yes) (рис. 13.9).
Нажатие клавиши
Нажатие клавиши
Событие Нажатие клавиши (KeyPress) происходит, если пользователь нажимает и отпускает любую комбинацию клавиш для элемента управления или формы, имеющей фокус. В отличие от событий Клавиша вниз (KeyDown) и Клавиша вверх (KeyUp), данное событие не происходит, когда нажимаются функциональные клавиши, клавиши управления курсором и клавиши
Если пользователь нажимает и удерживает некоторую клавишу, то возникают повторяющиеся события Клавиша вниз (KeyDown) и Нажатие клавиши (KeyPress) до тех пор, пока он не отпустит клавишу. Тогда возникает событие Клавиша вверх (KeyUp).
Если результатом нажатия клавиши является перевод фокуса с одного элемента на другой, то событие Клавиша вниз (KeyDown) возникает для первого элемента, а события Нажатие клавиши (KeyPress) и Клавиша вверх (KeyUp) — для второго.
Если в результате нажатия клавиши появляется диалоговое окно, то возникают события Клавиша вниз (KeyDown) и Нажатие клавиши, а событие Клавиша вверх (KeyUp) не возникает.
Нажатие кнопки
Нажатие кнопки
Это наиболее широко распространенное событие. Оно возникает как в самой форме, так и в элементах управления формы. Для формы событие Нажатие кнопки (Click) возникает, когда пользователь щелкает мышью на пустой области формы или на области выделения записи в форме. Для элемента управления событие Нажатие кнопки (Click) возникает при щелчке мыши не только на самом элементе, но и на присоединенной к нему надписи. Однако для элемента управления оно возникает не только при щелчке мыши, но и в некоторых других случаях, а именно:
-
при выборе элемента из списка, независимо от того, был ли он выбран с помощью мыши или клавиш управления курсором с последующим нажатием
;
-
при нажатии клавиши <Пробел>, когда фокус установлен на флажке, переключателе или командной кнопке;
-
при нажатии клавиши
в форме, которая содержит кнопку свойства По умолчанию (Default) со значением Да, тогда именно на эту кнопку по умолчанию устанавливается фокус;
-
при нажатии клавиши
в форме, которая содержит кнопку свойства Отмена (Cancel) со значением Да;
-
при нажатии клавиш доступа, если они связаны с кнопками на форме.
Объектная модель Microsoft Access 2002
Объектная модель Microsoft Access 2002
Объектная модель Microsoft Access 2002 реализована в виде набора объектов, собранных в библиотеке Access. Основным элементом в иерархии объектов библиотеки Access является объект Application. Он содержит ссылки на все объекты и семейства объектов Microsoft Access. Каждый объект из библиотеки Access имеет в качестве свойства объект Application (в том числе и сам объект Application имеет свойство Application), который ссылается на активное приложение Microsoft Access.
Иерархия объектов и семейств объектов Microsoft Access 2002 представлена на рис. 13.1 — 13.3. Названия объектов, являющихся элементами семейств, приведены в скобках. Новые объекты, появившиеся в Microsoft Access 2002, отмечены звездочкой. Иерархия объектов, представленная на рисунках, образована следующим образом:
-
каждый объект может содержать набор свойств, часть из которых может являться ссылками на другие объекты;
-
в каждый новый уровень иерархии входят объекты, ссылки на которые хранятся в объектах, расположенных на предыдущем уровне иерархии.
Data Access Objects) создавались, как
Объектная модель Microsoft DAO 3.6
Объекты доступа к данным (DAO, Data Access Objects) создавались, как объектно-ориентированный интерфейс для ядра баз данных Jet фирмы Microsoft. В ранних версиях Microsoft Office доступ к данным обеспечивался исключительно ядром Jet. Сначала ядро Jet могли использовать только Access и Visual Basic, но с выходом пакета Microsoft Office 95 ядро Jet стало сервером Automation, что позволило использовать DАО для доступа к данным из любого клиента Automation. В версии Office 97 компоненты Excel, Word и PowerPoint стали клиентами Automation и вышла новая версия DAO 3.5. В DАО 3.5 появился новый режим доступа к данным ODBCDirect, который позволяет манипулировать данными в обход ядра Jet, напрямую связываясь с источниками данных ODBC no технологии "клиент-сервер". За счет прямого доступа к данным получается выигрыш в производительности, при этом конечный пользователь имеет стандартный объектно-ориентированный интерфейс доступа к различным типам данных, начиная от баз данных Access до баз данных ISAM (Indexed Sequential Access Method — индексно-последовательный метод доступа) и SQL. Отсюда можно заключить, что DАО — это унифицированный набор объектов для доступа к данным.
В Microsoft Office 2000 вошли новая версия DAO 3.6 и новая версия Microsoft Jet 4.0, в которой реализована поддержка Unicode, т. е. в базах данных появилась возможность хранить символы любых национальных алфавитов одновременно. В версии Microsoft Access 2002 используются те же версии Jet и DАО.
DАО версии 3.5 и выше включает две объектные модели, соответствующие двум типам "рабочей области" (сеанс работы с базой данных), в зависимости от того, используется ли ODBCDirect. При доступе к данным с помощью ядра Microsoft Jet применяется рабочая область Microsoft Jet. В случае прямого доступа к источнику данных ODBC используется рабочая область ODBCDirect. Тип рабочей области и связанного с ней источника данных определяет, какие объекты, свойства и методы DАО можно использовать (рис. 13.4, 13.5).
Применяйте рабочую область Microsoft Jet для доступа к базам данных Jet (таким, как MDB-файлы Access) или другим настольным базам данных ISAM или в том случае, когда требуется использовать уникальные средства ядра Jet, такие как объединение данных в разных форматах.
Применяйте в клиентском приложении рабочую область ODBCDirect вместо рабочей области Jet в следующих случаях:
-
если нужно только выполнить запрос или хранимую процедуру на сервере баз данных, таком как SQL Server;
-
когда требуется воспользоваться специфическими возможностями ODBCDirect, такими как пакетное обновление записей, обновленные записи оптируются на локальном компьютере;
-
когда требуется асинхронное выполнение запроса, запрос выполняется в фоновом режиме, не останавливая выполнение других
Объектная модель Microsoft Office 2002
Объектная модель Microsoft Office 2002
Иерархия объектов Microsoft Office 2002 представлена на рис. 13.7.
Объектная модель Visual Basic для приложений
Объектная модель Visual Basic для приложений
|
Объект
|
Тип
|
Описание
|
||
|
Collection |
Объект из библиотеки VBA |
Упорядоченная совокупность объектов, с которой можно обращаться как с единым объектом |
||
|
Debug |
Объект |
Позволяет выводить текущую информацию в окно отладки непосредственно во время выполнения кода на VBA |
||
|
Dictionary |
Объект из библиотеки Scripting |
Объект, представляющий пару: ключ и элемент. Представляет собой аналог элемента ассоциативной памяти |
||
|
Drives |
Семейство из библиотеки Scripting |
Содержит объекты Drive, предоставляющие информацию (только для чтения) обо всех доступных дисках. Является свойством объекта FileSystemObject |
||
|
Drive |
Объект из библиотеки Scripting |
Предоставляет доступ к свойствам конкретного локального или сетевого диска |
||
|
Err |
Объект из библиотеки VBA |
Предназначен для обработки ошибок Automation и ошибок модулей VBA во время выполнения кода наЛ/ВА |
||
|
Files |
Семейство из библиотеки Scripting |
Содержит объекты File и представляет собой совокупность всех файлов в данной папке. Является свойством объекта FileSystemObject |
||
|
File |
Объект из библиотеки Scripting |
Предоставляет доступ ко всем свойствам файла на диске |
||
|
FileSystemObject |
Объект из библиотеки Scripting |
Предоставляет доступ к файловой системе компьютера |
||
|
Folders |
Семейство из библиотеки Scripting |
Содержит объекты Folder и представляет собой совокупность всех папок внутри данной папки. Является свойством объекта Folder (свойство называется SubFolders) |
||
|
Folder |
Объект из библиотеки Scripting |
Предоставляет доступ ко всем свойствам папки на диске |
||
|
TextStream |
Объект из библиотеки Scripting |
Обеспечивает последовательный доступ к текстовому файлу |
||
| UserForm |
Абстрактный объект VBA Object |
Представляет объект — окно или диалоговое окно, являющееся частью пользовательского интерфейса приложения. Характеристики этого объекта определяются пользователем | ||
|
UserForms |
Семейство из библиотеки VBA |
Содержит объекты object, соответствующие объектам User Form, и представляет собой совокупность пользовательских форм, загруженных в данный момент в приложение. Это семейство является свойством объекта Global из библиотеки VBA |
||
Объектные модели доступа к данным
Объектные модели доступа к данным
Объекты доступа к данным предназначены для программного доступа и управления данными в локальной или удаленной базе данных, а также для программного управления самими базами данных, их объектами и структурой. В Microsoft Access 2002, так же как и в Microsoft Access 2000, сохранилась возможность двух способов работы с данными:
- старый, посредством DAO (Data Access Objects);
-
новый, посредством ADO (ActiveX Data Objects). Каждому из этих способов соответствует своя объектная модель.
Язык Visual Basic for Applications
Язык Visual Basic for Applications является объектно-ориентированным языком программирования. Стандартные объекты Visual Basic представляют собой основное средство манипуляции с данными Microsoft Access и других приложений семейства Microsoft Office. Знание технологии объектно-ориентированного программирования и состава объектных моделей Visual Basic позволяет разрабатывать профессиональные приложения, выполняющие всю необходимую обработку данных.
Объектные модели Microsoft Office 2002
Объектные модели Microsoft Office 2002
Управление приложениями семейства Microsoft Office 2002 осуществляется интерактивно — с помощью интерфейса пользователя или программно — с помощью объектных моделей. Каждый из компонентов Microsoft Office предоставляет свои объектные модели в виде одноименной библиотеки объектов (файл с расширением olb), которая может быть использована в других приложениях. Microsoft Access 2002, как компонент Microsoft Office, имеет такую библиотеку — Microsoft Access 10.0 Object Library. Доступ и управление данными в Microsoft Access могут осуществляться с помощью объектных моделей, реализованных в нескольких библиотеках:
-
библиотека объектов Microsoft Access (Microsoft Access 10.0 Object Library);
-
библиотека объектов доступа к данным (Microsoft DAO 3.6 Object Library);
-
библиотека объектов ActiveX (Microsoft ActiveX Data Objects 2.6);
-
расширения ADO для поддержки DDL и защиты информации (Microsoft ADO Extensions 2.6 for DDL and Security);
-
библиотека объектов Microsoft Jet и репликации (Microsoft Jet and Replication Objects 2.6).
- библиотека объектов Visual Basic (Microsoft Visual Basic for Applications);
-
библиотека объектов Microsoft Office (Microsoft Office 10.0 Object Library). Две эти библиотеки являются общими для всех приложений Microsoft Office.
Область действия переменных и процедур
Область действия переменных и процедур
Все процедуры, функции, переменные и константы в VBA имеют свою область действия. Это означает, что они могут использоваться только в определенном месте программного кода — именно там, где они описаны. Например, если переменная А описана с помощью оператора Dim в теле процедуры с именем Prod, именно эта процедура и является ее областью действия. Таким образом, если имеется другая процедура Ргос2, вы не можете использовать в ней эту же переменную. Если вы попытаетесь сделать это, то либо получите сообщение об ошибке из-за использования неописанной переменной (в том случае, если используется упоминавшийся выше оператор Option Explicit) либо просто получите другую переменную — с тем же самым именем, но никак не связанную с одноименной переменной из первой процедуры.
Начнем с определения области действия переменных. То, в каком месте программы и как именно описана переменная, определяет область ее действия и то, как долго она "живет" в памяти и сохраняет присвоенное ей значение. Имеются три различных уровня при определении области действия переменных:
-
уровень процедуры;
-
уровень модуля;
-
уровень проекта.
Чтобы определить процедуру на уровне модуля и сделать её тем самым доступной для совместного применения во всех процедурах данного модуля, следует поместить ее описание в секции объявлений модуля — перед текстом каких-либо процедур или функций. При этом может использоваться и явное описание области действия: ключевое слово Dim в этом случае заменяется на ключевое слово Private. Нет никакой разницы в том, какой из этих описателей вы используете.
Наконец, чтобы описать переменную на уровне проекта, необходимо расположить ее описание в секции объявлений одного из модулей проекта и при этом обязательно должно использоваться ключевое слово Public. Описанные таким образом переменные могут применяться в любом модуле проекта.
Замечание
Все вышесказанное относится и к описанию и определению области действия констант и массивов.
Для переменных имеется еще один способ их описания, не изменяющий их уровня, но позволяющий сохранить значение переменной, описанной на уровне процедуры, после завершения работы этой процедуры. Для этого следует использовать описатель static, тем самым определяя ее как статистическую переменную. Такая переменная сохраняет выделенное ей место в памяти и свое значение даже после завершения процедуры, в которой она была описана и использована.
Тем не менее статистическая переменная не может быть использована в других процедурах. Изменяется лишь время ее жизни, но не область действия. Если произойдет повторный вызов той же самой процедуры, в которой была описана статистическая переменная, то эта переменная сохранит свое прежнее значение, которое она имела в момент завершения работы этой процедуры при предыдущем вызове. Обыкновенные, не статистические, переменные всякий раз инициализируются заново и получают при входе в процедуру пустые значения.
Перейдем к обсуждению области действия процедур и функций. Процедуры и функции имеют только два уровня областей действия: уровень модуля и уровень проекта. По умолчанию используется уровень проекта. Таким образом, процедура или функция может быть вызвана любой другой процедурой или функцией в этом проекте. При описании процедур и функций на уровне проекта может также использоваться необязательное ключевое слово Public. Никакого воздействия на процедуру наличие или отсутствие этого слова не оказывает.
Если требуется описать процедуру, используемую только на уровне модуля, то для этого применяется ключевое слово Private. Учтите, что такое описание не только сужает область действия для процедуры, но и запрещает ее использование как самостоятельной процедуры — ее можно вызвать только из другой процедуры.
Наконец, при описании процедур или функций может использоваться и ключевое слово static. Оно никак не влияет на область действия процедуры, но воздействует на все переменные, описанные внутри этой процедуры или функции. В этом случае все локальные переменные получают статус Static и тем самым остаются в памяти после завершения такой процедуры и при повторном ее вызове сохраняют свои прежние значения.
Рассмотрим пример модуля, начинающегося следующим образом:
Public Al As String Private A2 As Integer
Dim A3 As Single
Sub Prod ()
Dim A4 As Integer
Static A5 As Integer
Al = "Текстовая строка 1"
A2= 2
A3 = 3.14
A4 = A4 + 4
A5 = A5 + 5
MsgBox A4
MsgBox A5
End Sub
Sub Proc2 () Procl
MsgBox Al
MsgBox A2
MsgBox A3
MsgBox A4
MsgBox A5
Procl End Sub
В этом примере переменная А1 определена на уровне всего проекта (использовано ключевое слово Public), переменные А2 и A3 определены на уровне модуля, переменная А4 — только на уровне процедуры Prod, а переменная А5 хотя и определена в теле процедуры Procl, но описана как статическая переменная.
При вызове процедуры Рrос2 произойдет следующее: из этой процедуры будет в свою очередь вызвана процедура Procl, которая присвоит значения всем пяти переменным А1, А2, A3, А4 и А5, а затем покажет текущие значения переменных А4 и А5 в диалоговом окне.
После завершения этой процедуры будут выведены текущие значения переменных А1—А5 из процедуры Ргос2. При этом окажется, что переменные А1—A3 сохранили свои значения, поскольку они описаны на уровне модуля, а переменные А4 и А5 принимают пустые значения, поскольку областью действия этих переменных являются процедуры, в которых они используются. Никакие изменения этих переменных внутри одной из процедур не имеют отношения к аналогичным переменным из другой процедуры — на самом деле это разные переменные, просто для них используются совпадающие имена.
Затем происходит еще один вызов процедуры Procl, и она вновь начинает изменять и выводить на экран значения переменных А4 и А5. При этом переменная А4 вновь получит значение 4, поскольку при новом вызове процедуры для этой переменной будет заново выделена память и она будет инициализирована пустым значением. В отличие от А4, переменная А5, описанная как статическая переменная, сохранит свое прежнее значение от предыдущего вызова этой процедуры, в результате ее значение при повторном вызове окажется равным 10.
Окно Call Stack
Окно Call Stack
Окно Call Stack (Стек вызовов) содержит список всех незавершенных процедур приложения и используется для трассировки вложенных процедур. При этом самая перва из вызванных процедур будет размещаться в нижней части стека, а самая последняя — в верхней части. Наименование процедуры состоит из трех частей: имени проекта, имени модуля (в том числе модуля формы), имени процедуры (рис. 13.31).
Окно Immediate
Окно Immediate
Кроме всех перечисленных окон отладки, в Access 2002 сохранилось окно Immediate (Отладка) для тестирования данных и процедур, которое присутствовало еще в Access 2.0. Это окно может быть использовано двояким образом: можно вручную проверить значение выражения с помощью команды Print или "?" (рис. 13.30) или, вставив в код программы команду Debug.Print, посмотреть в этом окне контрольную печать.
Окно Locals
Окно Locals
Специальные окна отладки используются главным образом для того, чтобы просматривать промежуточные значения данных: переменных, выражений, свойств объектов и т. д. К ним относятся два окна: Locals (Локальные) и Watches (Контрольные). Чтобы познакомиться с этими окнами, давайте установим точку останова на одной из команд написанной нами ранее процедуры 3aKaaH_Click в форме "Клиенты" (Customers). Для этого нужно:
-
Открыть данную процедуру в окне редактора кода, как это описывалось выше.
-
Установить курсор на строку DoCmd.OpenForm "Заказы", acNormal, stLinkCriteria
-
Нажать кнопку на панели инструментов с изображением руки или выбрать команду
Toggle Breakpoint
в меню
Debug.
Строка будет выделена коричневым фоном и на панели слева, напротив этой строки, появится специальный значок — жирная коричневая точка.
Самый простой и естественный способ установки точек останова: щелкните мышью по серой полосе у левого края окна редактора напротив нужной строки. Снять точку можно щелчком мыши по коричневой точке напротив нужной строки.
Теперь окно модуля можно закрыть, открыть форму "Клиенты" (Customers) в режиме формы и нажать кнопку Заказы клиента. При нажатии этой кнопки запускается наша процедура обработки событий и, как только выполнение дойдет до помеченной строки, произойдет останов, а на экране появится окно редактора кода, в котором помеченная строка выделена желтым цветом, означающим, что это текущая команда. Нажмите кнопку Local Window или выберите соответствующую команду из контекстного меню редактора. Тогда в нижней части экрана появится новое окно Locals (Локальные) (рис. 13.26). В этом окне можно увидеть все локальные переменные и константы текущей процедуры, а также иерархический список свойств всех объектов формы, который скрывается за коротеньким словом ме. Именно эти свойства и интересуют, как правило, разработчика, т. к. в большинстве случаев значения переменных в точке останова можно увидеть просто подведя курсор к этой переменной в окне редактора. Тогда появляется всплывающая подсказка со значением переменной, как это показано на рис. 13.26.
Замечание
Если подсказка не появляется, проверьте значение флажка Auto Value Tips на вкладке Editor окна Options.
Если вы будете выполнять процедуру по шагам, то сможете наблюдать, как меняются значения свойств.


Иллюстрация 13.26.
Установка точки прерывания в программе
Окно Quick Watch
Окно Quick Watch
Окно Quick Watch (Быстрый просмотр) используется для просмотра значения свойства, переменной или выражения, которое не определено заранее как контрольное значение. Чтобы открыть это окно, необходимо:
-
Выделить в тексте программы интересующее выражение.
-
Нажать кнопку
Quick Watch
на панели инструментов, или выбрать команду
Debug, Quick Watch
(Быстрый просмотр), или нажать комбинацию клавиш
+ .
Окно редактора кода
Окно редактора кода
Для того чтобы открыть окно редактора, достаточно открыть любой модуль Access (рис. 13.12).
Замечание
Даже в локализованных версиях Access окно редактора кода VBA, а также все другие диалоговые окна, составляющие среду программирования VBA, традиционно не локализуются. Поэтому все рисунки в этом разделе главы, а также экранные термины (названий команд меню, диалоговых окон и т. д.) приводятся в нелокализованном варианте.
Окно Watches
Окно Watches
Окно Watches (Контрольные) содержит контрольные выражения. Данные выражения контролируются самой Access в процессе выполнения программы, и когда выполнение программы останавливается, в этом окне можно увидеть текущие значения этих выражений. Можно составить контрольное выражение таким образом, что приложение останавливается, когда это выражение принимает определенное значение. Такой прием, например, используется, когда отлаживаются длинные циклы, которые слишком долго выполнять по шагам.
Для того чтобы отследить контрольные значения, их сначала нужно задать. Для этого используется команда Add Watch (Добавить контрольное значение) в меню Debug (Отладка). Добавлять контрольные значения можно как в обычном режиме редактирования кода, так и в режиме останова. При выборе команды появляется диалоговое окно Add Watch (Добавление контрольного значения) (рис. 13.27). В поле Expression (Выражение) можно ввести контрольное значение — это может быть переменная, свойство или любое допустимое выражение. Давайте введем в это поле условие останова приложения stbinkcritria <> "", а в группе переключателей Watch Type (Тип контрольного значения) выберем переключатель Break When Value Is True (Останов, если значение истинно).
Основные понятия
Основные понятия
Начнем с определения основных понятий, которые потребуются для понимания работы с объектами в языке VBA. Такими понятиями в данном случае будут:
- объект
- семейство
- метод
- класс
- свойство
-
событие
-
объектная модель
Класс представляет собой описание совокупности однотипных объектов. Класс можно сравнить с типом данных, где переменной такого специфического типа является объект. В этом случае говорят, что объект представляет собой экземпляр определенного класса.
Каждый объект имеет свойства и методы, которые различны у разных классов объектов, но применяются они одинаково, в чем вы скоро убедитесь на примерах использования объектов в процедурах VBA.
Свойством называют отдельную характеристику объекта или класса. Например, знакомые уже вам свойства формы являются свойствами объекта Form. Свойство .объекта может принимать определенное значение. Например, свойство Вывод на экран (Visible) может принимать значение True или False, в зависимости от чего форма будет появляться или исчезать с экрана.
Метод представляет собой процедуру (или функцию) объекта или класса. Совокупность методов объекта определяет его "поведение". Например, объект Form имеет метод Refresh, вызов которого позволяет обновить данные в форме Access.
Объект может реагировать на определенные события, происходящие в процессе работы приложения и влияющие на объект. Совокупность событий, на которые объект способен реагировать, определяется создателем класса, экземпляром которого является данный объект. Например, набор событий, которые определены для формы Access, мы видим на вкладке События (Event) диалогового окна Свойства (Properties). Реакцией объекта на произошедшее событие может быть выполнение объектом некоторой специальной процедуры, которая называется процедурой обработки события. Любому событию объекта может быть назначена некоторая процедура его обработки.
Упорядоченный набор однотипных объектов — экземпляров одного класса называется семейством. Семейство тоже является объектом. Одним из методов этого объекта является процедура, возвращающая ссылку на конкретный объект в семействе. Одним из свойств семейства является число объектов, хранящихся в нем. Например, совокупность элементов управления в форме образует семейство Controls.
Объекты и семейства сгруппированы в виде иерархических структур, которые называются объектными моделями. В VBA определены специальные объектные модели для каждого компонента семейства Microsoft Office и объектные модели, общие для всех компонентов Microsoft Office. Объектные модели VBA можно изучать, используя справочную систему и окно просмотра объектов. Окно просмотра объектов представляет собой специальное средство редактора Visual Basic, позволяющее просматривать содержимое библиотек объектов и производить поиск справочной информации. (Описание окна просмотра объектов можно найти в данной главе, в разд. "Среда программирования Access 2002".)
Отключение
Отключение
Событие Отключение (Deactivate) происходит, когда фокус из формы или отчета переносится на другое окно (таблицы, запроса, формы, отчета, макроса, модуля или окно базы данных). Однако это событие не возникает, когда фокус переходит в диалоговое окно или другое приложение. Событие Отключение (Deactivate) возникает после события Потеря фокуса (LostFocus).
Открытие
Открытие
Событие Открытие (Open) происходит после того, как выполнен запрос, лежащий в основе формы или отчета, но до отображения первой записи или печати отчета. Процедура обработки этого события имеет один параметр — Cancel, при установке которого в значение True отменяется открытие формы или отчета. Обычно процедура обработки события Открытие (Open) используется для проверки условий и предотвращения открытия формы, т. к. следующее по времени событие Загрузка (Load) уже не может быть отменено.
Отмена
Отмена
Событие происходит, когда пользователь отменяет изменения, сделанные в текущем поле или текущей записи, например, нажав клавишу
Отсутствие данных
Отсутствие данных
Событие Отсутствие данных (No Data) возникает после форматирования отчета, но до его вывода на печать (до первого события Страница (Page)) и позволяет обнаружить отсутствие записей для отчета, в этом случае печать можно отменить. Процедура обработки данного события имеет один параметр: Cancel, которому следует присвоить значение True, если нужно отменить печать отчета.
Отсутствие в списке
Отсутствие в списке
Событие Отсутствие в списке (NotlnList) возникает в поле со списком, когда пользователь вводит вручную значение в текстовую часть поля, которое отсутствует в списке, и после этого пытается перейти в другое поле или сохранить запись. Для того чтобы данное событие происходило, нужно присвоить свойству Ограничиться списком (LimitToList) значение Yes. Если это свойство имеет значение No, то разрешается ввод в поле данных, не совпадающих ни с одним значением из списка. Процедура обработки настоящего события имеет два параметра: NewData и Response. Параметр NewData содержит введенные данные, a Response управляет обработкой события и может иметь значения 0, 1 или 2. Значение 0 позволяет вывести на экран стандартное сообщение о том, что введенные данные отсутствуют в списке, и запретить ввод. Значение 1 позволяет вместо стандартного сообщения вывести специальное сообщение, например запрашивающее, следует ли сохранить введенное значение. Новые данные при этом не добавляются в список. Значение 2 разрешает добавить новое значение в список. При этом в процедуре обработки данного события нужно добавить значение к источнику строк для поля со списком, после чего поле обновляется, т. к. Access повторно запрашивает источник строк.
Однако, если источником строк для поля со списком является таблица-справочник, простого добавления значения может оказаться недостаточно. Скорее всего, придется вывести специальную форму, в которой пользователь должен будет заполнить все необходимые поля. После сохранения записи в этой форме новые данные добавляются в список. Типичная ситуация, когда требуются такие действия — добавить нового клиента при выписке ему стандартного документа: счета, накладной и т. д.
Базы данных: Разработка - Управление - Excel