Список стандартных модулей приложения всегда можно увидеть, нажав кнопку
Модули
(Modules) в окне
База данных
(Database). В этом окне обычно и выполняется работа с модулями. Выделите в окне базы данных (Northwind) модуль "Служебные функции" (Utility Functions) и нажмите кнопку
Конструктор
(Design). Откроется окно редактора кода VBA, в котором можно увидеть содержание модуля. Модуль состоит из двух строк описания и одной процедуры — функции isLoaded, с которой мы уже встречались (рис. 13.8)
(см. гл. 11).
Это пример универсальной функции, которая проверяет, загружена ли форма, имя которой передается ей в качестве аргумента. Она никак не связана не только с объектом, но и с данным приложением и может использоваться как в нем самом, так и в любом другом приложении Access.
В окне редактора VBA отображается объект Форма (Form), а справа — поле со списком событий, которые могут обрабатываться процедурами VBA (рис. 13.10).
Если в модуле для некоторого события существует процедура, то это событие выделяется в списке жирным шрифтом. В данном случае таких событий нет, т. к. обработка событий в форме "Клиенты" (Customers), которую мы открыли, выполняется с помощью макросов. При попытке открытия редактора VBA автоматически создается модуль формы, который будет иметь название Fогm_Клиенты (Form_Customers).
Если теперь закрыть окно редактора кода, а затем форму, то, хотя мы не вносили никаких изменений в форму, на экране появится вопрос:
Сохранить изменения макета или структуры формы Клиенты?
(Do you want to save changes to the design of form 'Customers'?). Вопрос связан с появлением модуля формы. Если вы ответите Нет (No), модуль не будет сохранен.
Для того чтобы из программы VBA открыть форму и изменить какие-либо свойства формы или элементов управления формы, можно использовать два метода.
DoCmd.OpenForm "Товары"
Forms!Товары.RecordSource = "Товары клиента"
Ссылку на соответствующий модуль класса, например:
Form_ToBapbi. Visible = True
Рогт_Товары.RecordSource = "Товары клиента" ,|
В том и в другом случае при выполнении открывается
стандартный
экземпляр формы "Товары" (Products) и подменяется источник записей для этой формы.
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
После этого новый модуль появляется в списке модулей окна базы данных. Чтобы его открыть, можно нажать кнопку Конструктор (Design) окна базы данных. Если у вас открыты форма или отчет в режиме Конструктора, то для того, чтобы открыть модуль формы (отчета), следует нажать кнопку Программа (Code) на панели инструментов.
Обычно в окне редактора используются три панели (три отдельных окна). На самом деле окон может быть и больше и меньше, и скоро вы узнаете обо всех, но на рис. 13.12 показано только расположение основных окон.
Проект приложения состоит из модулей, которые делятся на три категории:
Список объектов в окне проекта является иерархическим, кроме модулей самого проекта, он может включать ссылки на объекты из внешних библиотек и список модулей этих библиотек.
В верхней части панели проекта расположены три кнопки:
Панель свойств позволяет просматривать и изменять свойства различных объектов, входящих в проект. Для отображения свойств объекта его нужно выделить либо в дереве проекта, либо в окне Конструктора формы (отчета). Во многом эта панель дублирует диалоговое окно
Свойства
(Properties) в формах и отчетах. И в том и в другом случае изменение свойств объекта статично, поэтому они могут быть использованы для задания начальных или постоянных свойств объекта.
Чтобы изменить значение свойства объекта, необходимо:
Для каждого модуля, выбранного на панели проекта, открывается свое окно редактора кода. В данном случае в окне редактора мы видим модуль "Заставка" (Startup) приложения "Борей" (рис. 13.13).
Код в каждом модуле состоит из разделов, переключение между которыми выполняется путем выбора значения из списка
Object
(Объект), который размещается в левом верхнем углу окна. Список разделов различается для разных типов модулей.
Для модуля формы этот список включает раздел
General
(Общая область), который содержит объявления переменных, констант, специальных типов, внешних процедур. Данный раздел открывается по умолчанию при открытии окна кода. Для стандартного модуля этот раздел единственный — он содержит описание всех процедур. Модуль класса имеет разделы
General и Class.
Модуль формы, кроме раздела
General,
содержит раздел самой формы и разделы для каждого элемента управления. Модуль отчета включает в себя раздел для объекта
Report
(Отчет) и разделы для каждой области отчета. Для полей отчета не определены события, поэтому отсутствуют и соответствующие разделы в модуле кода.
Каждый раздел может содержать несколько процедур, выбираемых из списка
Procedure
в правом верхнем углу окна на рис. 13.13. Список процедур в стандартном модуле содержит
Declarations
(Описания) и имена всех процедур модуля в алфавитном порядке. Список процедур для модуля формы включает в себя перечень всех событий формы и ее элементов. Для модуля класса список процедур содержит только две процедуры для событий класса: Initialize и Terminate.
С помощью кнопок в левом нижнем углу окна можно выбрать один из видов представления кода в окне.
Для настройки параметров редактора используется также диалоговое окно
Options
(Параметры), которое можно открыть, выбрав команду
Options
в меню
Tools
(Сервис) (рис. 13.14). Это окно описывает только параметры редактора кода и вызывается из среды редактора кода.
Оно содержит четыре вкладки.
Первая вкладка
Editor
(Редактор) состоит из двух групп параметров:
Code Settings и Window Settings.
Вторая вкладка
Editor Format
(Формат редактора) позволяет определить шрифт, его размер и цвет для разных областей текста. Открыв любой модуль, вы можете убедиться, что текст программ представлен несколькими цветами: по умолчанию комментарии выделяются зеленым цветом, ключевые слова — синим. При отладке программ используются и другие цветовые выделения фрагментов текста: точек останова, текущей команды и т. д. Все эти способы выделения могут быть настроены в соответствии с вашим вкусом в данном окне.
Третья вкладка
General
(Общая) содержит несколько групп переключателей и флажков.
Последняя группа флажков определяет, когда компилируются модули проекта:
На последней вкладке
Docking
находятся флажки, позволяющие закрепить положение основных окон на экране.
Для того чтобы убедиться, что наши утверждения об интеллектуальности редактора не являются голословными, достаточно попробовать написать даже самую простую программу. Давайте заменим в форме "Клиенты" (Customers) макрос, который открывает форму "Заказы" (Orders) при нажатии кнопки
Заказы клиента,
процедурой VBA, которая выполняет те же действия. Мы создавали такой макрос
в разд. "Назначение макроса событию" гл. 11.
Если вы этого не делали, тогда создайте сейчас командную кнопку в области заголовка окна и назовите ее "Заказы клиента" (кнопка Мастера на панели элементов при этом должна быть отжата).
После этого нажмите кнопку
Программа
(Code) на панели инструментов. Откроется редактор кода VBA, который по умолчанию попытается создать процедуру обработки события Load формы. Выберите из списка слева объект Заказы клиента. Редактор автоматически вставит заголовок и концовку процедуры обработки события Click (рис. 13.15). Открыв список справа, вы можете увидеть, как много различных событий связано с командной кнопкой, однако наиболее часто используется именно событие Click. Так как с этим событием сейчас не связано никакой процедуры, редактор сразу пытается ее создать.
Начнем писать текст процедуры. Процедура будет состоять из нескольких команд. Нам необходимо открыть форму "Заказы" (Orders) и показать в этой форме только те заказы, которые относятся к определенному клиенту, поэтому придется задать условие для отбора записей в форме "Заказы" (Orders). Обычно для этого используют переменную типа string, которой сначала присваивают нужное значение, а потом подставляют в качестве параметра в макрокоманду Открытьформу (OpenForm). Чтобы использовать такую переменную, ее сначала нужно описать, поэтому первое предложение в процедуре должно быть следующим:
Dim stLinkCriteria As String
Как только вы напишете первые три слова Dim stLinkCriteria As, на экране появится список слов (рис. 13.16), которые могут быть использованы в данном предложении.
Вы набираете следующие буквы — str, после чего курсор в списке устанавливается на слове string. Дальше можно не продолжать, а просто нажать клавишу <Таb> — конец слова допишется автоматически. Нажмите клавишу <Enter>, курсор перейдет на новую строку, а текст во введенной строке изменится: все ключевые слова — Dim, As, string — будут выделены синим цветом. При вводе ключевых слов можно не беспокоиться о том, чтобы слово начиналось с заглавной буквы. Вы можете набирать весь текст строчными буквами — необходимое преобразование будет выполняться автоматически. Но, конечно, названия переменных, элементов управления и других объектов, на которые имеются ссылки в тексте, вы должны вводить сами с использованием нужного регистра, т. к. в них преобразования выполняться не будут.
Следующая строка будет присваивать переменной strLinkCriteria значение: stLinkCriteria = "[КодКлиента]=" & "'" & Me![КодКлиента] & "'"
Две формы будут связаны по значению поля CustomerID. Первое выражение [КодКлиента] относится к форме "Заказы" (Orders), а второе значение Me! [КодКлиента] — к текущей форме "Клиенты" (Customers), о чем говорит слово Me. Теперь используем макрокоманду Открыть форму (OpenForm) для того, чтобы открыть форму "Заказы" (Orders). Как только набирается docmd, появляется новая подсказка — список макрокоманд (рис. 13.17).
Уже известным способом выбираем нужную макрокоманду, нажимаем пробел и опять подсказка — синтаксис макрокоманды Открыть форму (OpenForm) (рис. 13.18).
И это очень кстати, т. к. позволяет не запоминать все аргументы макрокоманды и порядок их следования. Введите имя формы: Заказы (Orders), запятую, и опять появится подсказка с именами возможных констант, которые могут быть указаны в следующем параметре. Выберите константу acNormal и продолжайте ввод. Должна получиться строка:
DoCmd.OpenForm "Заказы", acNormal, , stLinkCriteria
Две следующие подряд запятые говорят о пропущенном параметре — имя фильтра.
Теперь добавим еще одну команду — изменим заголовок формы:
Forms!Заказы.Caption = "Заказ" & Название
И наконец, напишем комментарий, который объясняет, что делает данная программа. Для этого поместите курсор в начало второй строки программы и нажмите клавишу <Enter>. Появится пустая строка. Введите символ (') в начало новой строки и пишите дальше текст комментария. Закончите ввод нажатием клавиши <Enter>, и вы увидите, что комментарий оказался выделен зеленым цветом. В целом текст программы должен выглядеть как на рис. 13.19.
На примере этой простой программы мы продемонстрировали три очень полезных свойства редактора.
Когда вы уже усвоите язык VBA, такие подсказки могут показаться вам навязчивыми. Тогда вы можете отключить их, сбросив соответствующие флажки в диалоговом окне
Options
(Параметры) редактора кода (вкладка
Editor).
Однако при необходимости вы легко получите требуемую помощь, если воспользуетесь контекстным меню редактора кода (рис. 13.20).
Кроме описанных выше функций, в контекстном меню присутствуют и другие очень полезные функции, способствующие быстрому написанию кода, —
List Constants, Parameter Info, Complete Word,
а также две команды, очень упрощающие навигацию среди программных модулей:
Команда Definition позволяет также быстро открыть окно Object Browser и посмотреть описание нужного свойства, метода или объекта приложения. Для этого нужно установить курсор на интересующий объект, свойство, метод и нажать комбинацию клавиш <Shift>+<F2>.
При этом в нижней части окна, которая называется
область описания,
отображается описание выбранного элемента.
Если выбрать в поле
Project/Library
(Проект/Библиотека) текущее приложение "Борей" (Northwind), то в поле
Classes
(Классы) отобразятся все модули форм, отчетов и стандартные модули приложения (рис. 13.22).
Если вы написали много процедур, то это удобный способ найти нужную процедуру. Кроме того, если вы, выбрав в списке компонентов модуля интересующую вас процедуру, нажмете кнопку
View Definition
(Посмотреть описание) (на панели инструментов в верхней части окна вторая справа), то откроется окно данного модуля, и вы увидите в нем именно эту процедуру.
Для поиска необходимого объекта, метода или свойства существует поле
Search Text
(Образец поиска). Это второе поле со списком в верхней части окна. В него можно ввести фрагмент текста для поиска и нажать кнопку с биноклем, которая находится рядом. Тогда открывается дополнительная область
Search Results
(Результаты поиска), в которой отображается список компонентов, удовлетворяющих условию поиска (рис. 13.23).
Выделив в списке нужную строку, можно снова воспользоваться кнопкой View Definition, чтобы открыть нужную процедуру.
Еще одна очень полезная кнопка в этом окне Copy to Clipboard (Копировать в буфер обмена). Она позволяет копировать выбранный объект в буфер, после чего объект можно будет вставить прямо в текст программы.
Все библиотеки, на которые установлены ссылки, помещаются в начале списка, причем, пользуясь кнопками Priority, вы можете поменять порядок их следования. Обращение к этим библиотекам при разрешении ссылок на объекты выполняется в том порядке, в каком они следуют в списке.
Замечание
Группа Context (Контекст) в окне Add Watch позволяет определить область контроля заданного значения или выражения: конкретная процедура текущего модуля, все процедуры текущего модуля или все модули текущей базы данных.
Теперь нужно снять точку останова, которую мы установили. Для этого щелкните правой кнопкой мыши в строке останова и выберите команду
Toggle, Breakpoint
из контекстного меню (или нажмите клавишу <F9>). Строка примет обычный вид.
Закройте окно редактора кода и снова нажмите кнопку
Заказы клиента
в форме 'Клиенты" (Customers). Выполнение программы остановится на той же команде. Нажмите кнопку
Watch Window
на панели инструментов или выберите соответствующую команду в меню View. В нижней части редактора появляется новое окно
Watches
(рис. 13.28), в котором будет выведена одна строка, содержащая контрольное выражение, его значение, тип и контекст, т. е. процедура, в которой вычисляется контрольное значение. Выражение истинно, и программа остановлена.
Существует очень простой способ добавления контрольных значений в окно Watches. Можно просто выделить в тексте процедуры выражение и перетащить его в это окно мышью. Попробуйте проделать эту операцию с выражением Forms! Заказы. Caption и выполните несколько шагов процедуры, наблюдая, как изменяется выражение в окне Watches.
Если вы решите добавить выбранное выражение к контрольным значениям, просто нажмите кнопку Add (Добавить).
Окно
Immediate
открывается при нажатии кнопки
Immediate Window
на панели инструментов, или при выполнении соответствующей команды в меню View, или при нажатии комбинации клавиш <Ctrl>+<G>. Это окно отображается на экране, даже если окно редактора закрыто и выполняется приложение. При этом в нем можно наблюдать значения указанных данных. Выводить в это окно можно любые допустимые выражения, включая свойства объектов.
Для того чтобы вывести значение переменной, нужно ввести знак "?" и имя переменной и нажать клавишу <Enter>. Значение переменной отобразится на следующей строке.
Метод Print объекта Debug направляет вывод в это окно в процессе выполнения программы. Например, команда
Debug.Print "Цена.Enabled = "; Цена.Enabled
печатает значение свойства
Доступ
(Enabled) поля "Цена" (UnitPrice) в окне
Immediate.
В окне
Immediate
можно не только выводить значения переменных и свойств, но и задавать их, например можно в режиме останова ввести команду
Цена.Enabled = True
При этом на экране должна быть открыта форма, в которой присутствует данное поле. Аналогично присваиваются значения переменным, вызываются процедуры и выполняется большинство других команд. Ограничение на вводимые команды существует одно — они должны полностью помещаться на одной строке кода. После ввода команды и нажатия клавиши <Enter> Access выполняет введенную команду и снова переходит в режим останова. Таким образом, можно тестировать фрагменты программ, процедуры и функции.
Выбрав в стеке нужную процедуру, можно нажать кнопку
Show
(Показать), тогда окно
Call Stack
закроется и в окне кода модуля появится выбранная процедура. При этом курсор устанавливается на строку кода, вызывающую следующую процедуру из стека. Если выбирается текущая процедура, то курсор устанавливается на текущую команду.
Окно
Call Stack
вызывается несколькими способами:
Данное окно может быть открыто только в режиме останова.
Если процедура обработки выбранного события имеет аргументы, они будут также присутствовать в заголовке процедуры (рис. 13.34).
Теперь нужно ввести код процедуры между этими двумя строками. Ниже приведены некоторые примеры процедур обработки событий.
Рис. 13.34. Процедура обработки событий с аргументом Cancel
Поле "Отпускная цена" является вычисляемым, и для его вычисления используется формула
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) необходимо определить процедуры, которые бы заполняли поля заголовков и значений и скрывали неиспользуемые поля.
Еще один пример применения функции для обработки событий в форме вы может увидеть в базе данных "Контакты" (Contacts)
(см. пример к гл. 18 на компакт-диске)
В этом приложении с помощью Мастера кнопочных форм создана главная кнопоч ная форма, которая открывается при открытии приложения. На форме имеются не сколько кнопок, каждая из которых выполняет определенную функцию, но обрабаты ваются они все одинаково. Для этого мастер создает функцию =HandleButtonClick которая имеет один аргумент — идентификатор нажатой кнопки. Вызов функци! выполняется, как показано на рис. 13.37. Аргумент определяет нажатую клавишу. Oi обрабатывается программой в блоке Select Case, после чего выполняется соот ветствующее действие.
Рис. 13.37. Вызов функции для обработки события Нажатие кнопки
Пример синхронизации данных в двух связанных формах с помощью процедуры обработки события
Текущая запись
(Current) можно увидеть в модуле формы "Поставщики" (Supplier). В форме есть кнопка
Просмотр товаров
(Review Products), при нажатии на которую выводится форма "Список товаров" (Product List), показывающая товары данного поставщика. Естественно, что при переходе к новой записи в форме "Поставщики" (Supplier), записи в форме "Список товаров" (Product List) тоже должны быть сменены. Процедура выглядит следующим образом:
Private Sub Form_Current()
On Error GoTo Err_Form_Current
' Отображение товаров текущего поставщика при открытии формы "Список ' товаров".
Dim strDocName As String
Dim strLinkCriteria As String
strDocName = "Список товаров"
strLinkCriteria = "[КодПоставщика] = Forms![Поставщики]![КодПоставщика] "
If IsNull(Me![Название]) Then
Exit Sub
Elself IsLoaded("Список товаров") Then
DoCmd.OpenForm strDocName, , , strLinkCriteria
End if
Exit_Form_Current:
Exit Sub
Err_Form_Current:
MsgBox Err.Description
Resume
Exit_Form_Current
End Sub
Если текущая запись в форме "Поставщики" (Supplier) пустая, т. е. добавляется новая запись, то сразу выполняется выход из процедуры. Если текущая запись отображает конкретного поставщика, то проверяется, загружена ли форма "Список товаров" (Product List). Если форма загружена, то меняется набор записей в ней. Делается это с помощью макрокоманды ОткрытьФорму(OpenForm) с соответствующим условием отбора записей. При этом на самом деле форма не открывается, просто повторно запрашивается источник данных.
Событие
Ошибка
(Error) возникает, когда в процессе обработки формы или отчета ядром Access возникает ошибка. В процедуре обработки этого события можно перехватить стандартное сообщение об ошибке, которое выдает Access, и выдать собственное сообщение. Процедура имеет два параметра — DataErr и Response. Параметр DataErr содержит код ошибки, а параметр Response может принимать два значения — 0 и 1. Значение 0 отменяет выдачу стандартного сообщения об ошибке, а 1 — позволяет его отобразить.
Замечание
Это событие не возникает, когда ошибка встречается в коде VBA.
Событие Таймер (Timer) возникает регулярно через интервал времени, который задается свойством Интервал таймера (Timerlnterval) формы. Оно позволяет определять действия, которые должны выполняться периодически по сигналу таймера. Обычно используется для регулярных обновлений экрана в многопользовательском приложении, тогда в процедуре обработки события Таймер (Timer) нужно использовать метод Requery, который будет выполнять повторный запрос источника данных формы.
Обычно события инициируются действиями пользователя. В зависимости от производимых пользователем действий события можно разделить на несколько типов: события данных, события фокуса, события клавиатуры, события мыши, события печати, события фильтра, события окна, события ошибок и событие таймера. Ниже мы рассмотрим все эти типы событий.
В Microsoft Access 2002 появилось несколько новых событий для формы, связанных с выполнением транзакций. Эти события возникают только в формах проекта Access и в данном разделе рассматриваться не будут (о проектах Microsoft Access см. гл. 17). Кроме того, в связи с появлением двух новых режимов формы: Сводной таблицы и Сводной диаграммы, появились события, позволяющие программно управлять отображением данных в этих режимах: После конечного отображения (AfterFinalRender), До разметки (AfterLayout), После отображения (AfterRender), До отображения (BeforeRende), До экранной подсказки (BeforeScreenTip), Изменение представления (ViewChange), До запроса (BeforeQuery), Запрос (Query), До выполнения команды (CommandBeforeExecute), Включение команды (CommandEnabled), Выполнение команды (CommandExecute), Проверка команды (CommandChecked), Изменение набора данных (DataSetChange), Изменение сводной таблицы (PivotTableChange), Изменение выбора фрагмента (SelectionChange), Соединение (OnConnect), Отсоединение (OnDisconnect). Эти события также не будут здесь рассматриваться. При необходимости обработки этих событий вы можете найти информацию о них в справке Access в разделе Программирование в Visual Basic, Microsoft Access Visual Basic Reference, Events.
К этому типу относятся события, происходящие тогда, когда пользователь вводит, удаляет или изменяет данные в форме, а также перемещается от одной записи к другой.
События фильтра происходят при применении или удалении фильтра в форме.
События фокуса происходят, когда форма, отчет или элемент управления в форме получают или теряют фокус, а также когда форма или отчет становятся активными или, наоборот, неактивными.
События клавиатуры происходят в форме и элементе формы, когда пользователь нажимает клавиши на клавиатуре или же выполняется макрокоманда sendKeys.
Все события клавиатуры связываются с тем объектом в форме, который имеет в данный момент фокус. Обычно это один из элементов управления. Форма может получить фокус (а значит, и события клавиатуры могут относиться к форме), только если все ее элементы управления заблокированы или невидимы. Если нужно привязать эти события именно к форме, а не к элементу формы, то можно присвоить свойству
Перехват нажатия клавиш
(KeyPreview) для формы значение Да (Yes). Тогда все события клавиатуры возникают сначала для формы, а потом уже для элемента управления, имеющего фокус. Это дает возможность запрограммировать реакцию формы на нажатие определенных клавиш вне зависимости от того, в каком элементе управления формы находится фокус.
Замечание
События клавиатуры не определены для элементов управления в отчетах, а также для флажков и переключателей в группах. Они определены только для группы в целом.
События мыши происходят, когда какое-либо действие в форме или ее элементе управления выполняется с помощью мыши. События мыши не определены для элементов управления в отчетах, а также для флажков и переключателей в группах, они определены только для группы в целом.
События окна запускаются при открытии и закрытии форм и отчетов, а также при изменении размеров формы.
События печати вызываются отчетом и любой из его областей при печати или предварительном просмотре.
Для того чтобы создать стандартный модуль или модуль класса, нужно:
Выбрать команду Модуль (Module) или Модуль класса (Class Module) в меню Вставка (Insert) или в списке кнопки Новый объект (New Object) выбрать соответствующий объект (рис. 13.11). При этом откроется редактор кода VBA с пустым окном модуля.
Рассмотрим возможности обработки событий в отчете на примере отчета "Выработка сотрудников". Этот отчет строится на базе перекрестного запроса и показывает выработку сотрудников отдела продаж за год по месяцам. Максимальное число столбцов в отчете — 14. Первый столбец содержит фамилии сотрудников, следующие двенадцать столбцов — выработку для каждого месяца и последний столбец — итоговый.
(Как выглядит этот отчет, мы показывали в разд. "Перекрестные отчеты" гл. 10.)
В качестве источника данных для такого запроса используется перекрестный запрос "Выработка сотрудников", представленный на рис. 13.35.
Теперь рассмотрим, как создавать процедуры обработки событий. Для большинства элементов управления формы, а также самой формы и отчета, стандартный набор действий следующий:
Для обращения к модулям в программах VBA используется семейство Modules, которое содержит все открытые объекты типа Модуль (Module). Для того чтобы открыть объект Module, можно использовать макрокоманду ОткрытьМодуль (OpenModule). Ссылка на модуль может быть создана тремя способами:
Для ссылки на модуль формы или отчета можно использовать или имя модуля, например Modules ! Fоrm_Клиенты, или " . свойство формы, например
Forms!Клиенты.Module.
Объект Module имеет свойство туре. Значение этого свойства определяет тип модуля: для стандартного модуля используется значение 0, для модуля класса — 1.
Кроме обычных переменных, в Visual Basic часто встречаются неременные, представляющие собой ссылку на объект. Оказывается, зачастую использование переменных для ссылок на объекты позволяет не только сократить и упростить текст программы, но и существенно ускорить ее работу.
Применение переменной-объекта отличается от использования обычных переменных: нужно не только объявить такую переменную, но и назначить ей соответствующий объект с помощью специального оператора Set. Вот синтаксис этого объявления и назначения:
Dim <имяПеременкой> As Object
Set <имяПеременной> = <ссылкаНаОбъект>
Иногда при объявлении такой переменной удобно заранее указать конкретный тип объекта — можно использовать любой конкретный объект из объектной модели Office. Приведем пример упомянутого объявления и назначения:
Dim MyBase As Database
Set MyBase = CurrentDb( )
После такого объявления и назначения вы можете применять переменную MyBase для обращения к текущей открытой базе данных. Мало того, что такая ссылка короче: она еще и быстрее обрабатывается, и программа, использующая переменные для прямых ссылок на объекты вместо сложных иерархических ссылок, включающих в себя большое количество операторов уточнения (точек), работает быстрее. Время, которое уходит у программы на разрешение ссылок, пропорционально количеству операторов уточнения, которые приходится обрабатывать программе.
Совет
Еще одно замечание о быстродействии. Если вы всерьез озабочены быстродействием вашей программы, то рекомендуется при описании переменных типа "объект" использовать конкретные объекты модели Office, а не универсальное описание Object. В оправдание можно привести примерно те же соображения, что и по поводу применения универсального типа Variant при описании обычных переменных: обработка такого типа переменных требует дополнительного времени и места в памяти.
Объектная переменная будет указывать на объект до тех пор, пока мы другим оператором Set не присвоим ей ссылку на другой объект этого же типа или не присвоим ей значение Nothing, что означает, что переменная не содержит никакой ссылки. Например:
Set txt = Nothing
После такого действия переменная продолжает существовать, хотя и не ссылается ни на какой объект. Другим оператором Set ей можно снова присвоить ссылку на объект.
Замечание
Обратите внимание, что объектные переменные, в отличие от обычных переменных, содержащих значения, включают в себя только ссылки на объекты, а не сами объекты или их копии.
Ссылки на объекты
Первый вопрос, который следует обсудить, — как обратиться к объекту. Для обращения к объекту существует одно общее правило: нужно проследить путь в иерархии объектов, начиная от объекта самого верхнего уровня, до целевого объекта и записать последовательность имен встреченных на пути объектов или семейств, отделяя их друг от друга точкой. Если на пути встречается семейство, то, кроме имени семейства, необходимо в скобках указать индекс или имя его элемента, т. е. задать конкретный объект в семействе. Например, чтобы обратиться к форме, входящей в состав семейства AllForms, необходимо написать следующее выражение:
Application. CurrentProject .AllForms ("Заказы клиента")
Таким образом, чтобы правильно создавать
ссылки
на объекты, нужно достаточно хорошо представлять себе место каждого объекта в иерархии объектов модели. Такие длинные ссылки особенно характерны для моделей, которые имеют многоуровневую, иерархическую структуру, например DАО. На самом деле, на практике чаще применяют не полные, а сокращенные ссылки. Дело в том, что наиболее часто используемые семейства, объекты, свойства и методы считаются
глобальными.
Ссылки на них хранятся в специальном объекте с именем Global. Для обращения к глобальному объекту можно пропустить объекты более высокого уровня.
Например, семейство Forms является глобальным. Для доступа к объекту этого семейства можно использовать сокращенную ссылку вида:
Forms ( "Заказы") вместо полной ссылки:
Application. Forms ( "Заказы")
Замечание
Узнать, какие объекты, свойства и методы являются глобальными, позволяет окно просмотра объектов. Чтобы отобразить список глобальных компонентов объектной модели, выберите элемент
<globals>
в списке
Classes
в окне просмотра объектов (см. разд. "Использование обозревателя объектов в редакторе VBA " данной главы).
Кроме указанного способа ссылки на объект, входящий в состав семейства, существуют и другие способы, которые можно использовать, причем требующие меньшего числа нажатий клавиш. При любом способе обращения к объекту возвращается
ссылка на объект,
находящийся в памяти.
Обычно имя семейства и имя объекта разделяются оператором "!" (восклицательный знак), например:
Forms ! Товары
Если имя объекта состоит из нескольких слов, разделенных пробелом, тогда вам придется написать
Forms![Заказы клиента]
Третий способ ссылки состоит в том, что на объект в семействе ссылаются не по названию, а по индексу, например:
Properties(0)
Такой способ применяется обычно тогда, когда имя объекта неизвестно. В то же время каждый объект в семействе имеет индекс (порядковый номер), который обычно начинается с нуля. Есть, правда, исключения из этого правила, например в семействе CommandBars модели Microsoft Office нумерация объектов начинается с, единицы. Поэтому перед использованием индексов лучше узнать о способе нумерации в справочной системе Access.
И наконец, последний способ ссылки на объект состоит в использовании вместо имени объекта строковой переменной, например:
Reports (strИмяОтчета)
Если какой-то объект содержит несколько семейств объектов более низкого уровня, то одно из этих семейств, обычно наиболее часто используемое, считается стандартным или семейством по умолчанию. Можно обращаться к объекту, входящему в это семейство, не указывая имени семейства. Например, для объекта TableDef модели DАО стандартным семейством считается Fields. Поэтому для обращения к столбцу таблицы можно использовать сокращенную ссылку
TableDefs!Должности!Код Должности вместо полной ссылки
TableDefs!Должности.Fields!КодЦолжности
Совет
Использование сокращенных ссылок в программах предпочтительнее еще и потому, что в этом случае программы будут выполняться быстрее.
Еще одним способом сокращения ссылки на объект является использование объектной переменной. Особенно полезно использовать объектную переменную, если к объекту нужно обратиться несколько раз. (О том, как объявить объектную переменную и установить ссылку на объект см. разд. "Язык Visual Basic для приложений" выше в данной главе.)
Стандартные модули
содержат общие процедуры, которые не связаны с конкретным объектом: формой или отчетом. Эти процедуры могут вызываться из других модулей и использоваться при обработке событий в разных объектах, для вычисления значений в разных запросах или формах и т. д. Если в процедурах модуля нет ссылок на конкретные объекты данного приложения (формы, отчеты, элементы управления), то такой модуль может быть с успехом использован другими приложениями Access. Стандартные модули применяются также для объявления глобальных (то есть доступных из всех модулей приложения) переменных, констант, типов.
Событие
Страница
(Page) возникает после форматирования страницы отчета, но до вывода ее на печать, и позволяет с помощью процедуры обработки этого события добавить на страницу некоторые элементы оформления, например рамку.
Как уже говорилось выше, каждый объект имеет свойства, которые являются его характеристиками, и методы, которые позволяют управлять поведением этого объекта. То же справедливо и для семейств. Работа с объектами и семействами заключается в установке или получении значений конкретных свойств объекта или семейства и вызове их методов. Поэтому для управления объектами приложения необходимо хорошо знать свойства и методы каждого объекта.
Замечание
Если вы хотите иметь подробную информацию обо всех свойствах и методах объекта, следует обратиться к соответствующему разделу справки. Например, чтобы получить сведения о любом объекте модели Access, нужно раскрыть раздел Объекты Microsoft Access в папке Программирование, Справочник по языку Visual Basic Microsoft Access и затем щелкнуть на нужном объекте или семействе. Однако делать это вам придется, скорее всего, не очень часто, т. к. краткую информацию обо всех свойствах и методах объекта при написании программы в среде редактора VBA можно получить очень быстро, подключив оперативную подсказку или пользуясь Окном просмотра объектов.
Установка свойства объекта — это присвоение значения данному свойству. Поэтому для установки свойства используется оператор присваивания, например, чтобы установить свойство Visible (Вывод на экран) элемента управления формы, можно использовать инструкцию VBA:
Forms! Товары ! КодТовара . Visible = False
или
frm! КодТовара. Visible = False
Таким образом, ссылка на свойство объекта состоит из двух частей, разделенных точкой: ссылки на объект (любого вида) и имени свойства.
Получить свойство означает прочитать текущее значение этого свойства. Например, инструкция VBA
intCount = Forms . Count
присваивает переменной значение свойства Count семейства Forms.
Метод объекта в инструкциях VBA обозначается так же, как и свойство. Это видно и из приведенных в предыдущем разделе примеров, где мы использовали методы Append, Delete и Refresh семейства TableDefs. Однако, в отличие от свойств, методы могут иметь аргументы. Например, в следующей инструкции VBA применяется метод OpenReport объекта DoCmd.
DoCmd.OpenReport "Вакинсии", acPreview
Объект DoCmd — это специальный объект, который позволяет в программах VBA выполнять макрокоманды. Имя каждой макрокоманды является методом этого объекта. В приведенном примере создается отчет "Вакансии" в режиме Предварительного просмотра. При этом метод OpenReport не возвращает никакого значения, и аргументы в данном случае не требуется заключать в скобки.
Если же метод используется как функция, возвращающая значения, как показано в следующем примере, аргументы необходимо заключить в скобки.
Dim db As Database, rs As Recordset
Set db = CurrentDB
Set rs = db.OpenRecordset ("Сотрудники")
.............................
rs.Close
db.Close
Метод OpenRecordset объекта Database возвращает ссылку на объект Recordset (Набор записей), присваиваемую объектной переменной rs. Метод close, который имеют оба объекта — Recordset и Database, — не использует аргументов.
Тип данных |
Описание |
||
Array |
Массив переменных, для ссылки на конкретный элемент массива используется индекс. |
||
Boolean | Требуемая память: зависит от размеров массива Принимает одно из двух логических значений: True или False. Требуемая память: 2 байта | ||
Byte | Число без знака от 0 до 255 Требуемая память: как нетрудно догадаться, 1 байт | ||
Currency |
Используется для произведения денежных вычислений с фиксированным количеством знаков после десятичной запятой, в тех случаях, когда важно избежать возможных ошибок округления.
Диапазон возможных значений: от -922 337 203 685 477,5808 до 922 337 203 685 477,5807. Требуемая память: 8 байтов. Символ определения типа по умолчанию: @ |
||
Date | Используется для хранения дат. Диапазон возможных значений: от 1 января 0100 г. до 31 декабря 9999 г. Требуемая память: 8 байтов | ||
Double |
Числовые значения с плавающей точкой двойной точности.
Диапазон возможных значений для отрицательных чисел: от -1 ,797693 13486232Е308 до -4,94065645841 247Е-324.
Диапазон возможных значений для положительных чисел: от 4,94065645841 247Е-324 до 1, 7976931 3486232Е308. Требуемая память: 8 байтов. Символ определения типа по умолчанию: # |
||
Integer | Короткие целые числовые значения. Диапазон возможных значений: от -32 768 до 32 767. Требуемая память: 2 байта. Символ определения типа по умолчанию: % | ||
Long |
Длинные целые числовые значения.
Диапазон возможных значений: от -2 147 483 648 до 2 147 483 647.
Требуемая память: 4 байта. Символ определения типа по умолчанию: & |
||
Object | Используется только для хранения ссылок на объекты. Требуемая память: 4 байта |
Тип данных |
Описание |
||
Single |
Числовые значения с плавающей точкой обычной точности.
Диапазон возможных значений для отрицательных чисел: от -3.402823Е38 до -1 ,401 298Е-45.
Диапазон возможных значений для положительных чисел: от 1 ,401 298Е-45 до 3.402823Е38.
Требуемая память: 4 байта. Символ определения типа по умолчанию: ! |
||
String |
Используется для хранения строковых значений. Длина строки: от 0 до 64 Кбайтов. Требуемая память: 1 байт на символ. Символ определения типа по умолчанию: $ |
||
Variant |
Может использоваться для хранения различных типов данных: даты/времени, чисел с плавающей точкой, целых чисел, строк, объектов.
Требуемая память: 16 байтов, плюс 1 байт на каждый символ строковых значений.
Символ определения типа по умолчанию: отсутствует |
||
Определяемый пользователем тип |
Определяемые пользователем типы данных, назначение и размер выделяемой памяти зависят от определения. Используется для описания структур данных. Позволяет хранить в переменной такого типа множество различных значений разного типа |
||
При описании переменной указание типа данных может быть опущено. Тип переменной в таком случае определяется последним символом имени переменной: @, #, %, &, ! или $ (Currency, Double, Integer, Long, Single или String соответственно). Например, поскольку символ "$" является символом определения типа для строковых данных, то переменная под именем text$ автоматически становится переменной типа "строка символов". В дальнейшем этот специальный символ указания типа данных может быть опущен, однако постоянное присутствие в имени переменной символа определения типа будет напоминать о том, к какому типу данных относится эта переменная, что поможет избежать ошибок использования несовместных типов данных.
Если же последний символ не является ни одним из вышеперечисленных и явное указание типа тоже не используется, в этом случае переменной будет назначен по умолчанию тип данных Variant, который позволяет хранить в ней данные любого типа.
Учтите также, что нельзя использовать в одной и той же процедуре имена переменных, отличающиеся друг от друга только специальным символом определения типа в конце переменной. Например, не допускается одновременное использование переменных var$ и var%. He допускается и явное объявление переменной, уже содержащей символ определения типа в конце имени, с помощью описателя As <типПеременной> (даже если такое определение не противоречит обычному применению символа определения типа). Так, например, вы получите сообщение об ошибке, попытавшись ввести любое из следующих определений:
Dim var1% As String
Dim var2% As Integer
Для определения типа данных аргументов процедуры или функции используется описание типа данных непосредственно в заглавной строке процедуры или функции. Например, следующая заглавная строка процедуры описывает ее параметры как переменные строкового типа:
Sub SplitStr(str1 As String,
str2 As String, str3 As String)
Определение типа данных возвращаемого функцией значения завершает заглавную строку функции, например:
Function FindSplitSpace
(strl As String) As Integer
описывает возвращаемое функцией значение как переменную короткого целого типа.
Чтобы программа работала быстрее и занимала меньше памяти, рекомендуется использовать, когда это возможно, конкретные типы переменных, а не универсальный тип Variant. На обработку переменных типа Variant требуется не только дополнительная память (сравните размеры, приведенные в табл. 13.1), но и дополнительное время: требуется выяснить, к какому конкретному типу данных принадлежит такая переменная в момент обработки, а также при необходимости выполнить преобразование данных к нужному типу. Может показаться, что в таком случае лучше вообще не использовать подобные переменные. Это не так. Часто подобные переменные просто необходимы: например, в том случае, когда вы точно не уверены, какие именно данные будут присвоены переменной.
Приведем здесь лишь один пример. Если вы хотите, чтобы пользователь программы ввел некоторое целое значение, необходимое для дальнейшей работы программы, и описали для этого переменную целого типа, то рекомендуется использовать для ввода данных промежуточную переменную, описанную как Variant, а затем выполнить присваивание введенного значения нужной переменной (или же описать переменную, в которую вы хотите поместить это значение как Variant, несмотря на то, что ввести предполагается именно целое число). Дело в том, что пользователь может ошибиться и ввести, например, вещественное число или вообще нечаянно нажать не на ту клавишу и ввести строковое значение. В таком случае при присваивании введенного значения переменной целого типа произойдет ошибка во время выполнения программы. Если же переменная для ввода будет объявлена как Variant, ничего страшного не случится: введенное значение будет благополучно присвоено этой переменной, а вы получите возможность проанализировать введенное значение и попросить пользователя повторить ввод, если введенное им значение не отвечает нужным условиям.
И в завершение этого раздела обсудим использование именованных констант. Для их описания применяется оператор Const, схожий с оператором описания переменных Dim. Вот синтаксис этого оператора:
Const <имяКонстанты>
[As <типДанных>] = <выражение>
где <выражение> — эго любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы. Например, следующий оператор определяет целую константу maxLen:
Const maxLen% = 30
Как и переменные, константы могут содержать значения различных типов данных, но при этом они не меняют своих значений во время выполнения программы.
Совет
Если вы собираетесь использовать в вашей программе какие-либо константы, то рекомендуется дать этим константам осмысленные имена и описать их в самом начале модуля, а затем использовать всюду только именованные константы. Это не только делает программу понятнее, но и проще в сопровождении и отладке. Зачастую значение той или иной константы требуется изменить (хотя бы на время отладки), и тогда достаточно поменять лишь одно значение в описании именованной константы. Если же непосредственное значение использовалось прямо в тексте кода программы, то изменить все вхождения этого значения намного сложнее.
Кроме описываемых пользователем констант, существуют еще предопределенные встроенные константы, которые включаются в тексты программ без предварительного описания. Сведения о предопределенных встроенных константах, используемых для различных объектов приложений Microsoft Office и Visual Basic, можно найти в справке—в разделах описания свойств объектов (реже — в разделах описания методов). При именовании встроенных констант используется стандартное соглашение, позволяющее определить, к объектам какого приложения относится эта константа. Например, встроенные константы, относящиеся к объектам Access, начинаются с префикса ас, относящиеся к объектам Excel — с префикса xl, относящиеся к объектам Word — с префикса wd, а относящиеся к объектам VBA — с префикса vb.
Например, в команде
DoCmd.OpenForm "Orders",
acNormal, , stLinkCriteria
используется встроенная константа Access acNormal.
Конструкция
|
Описание
|
||
Do While <условие> <блокОператоров> Loop
|
Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, пока это условие выполняется (то есть имеет значение True), иными словами, в этой конструкции указывается условие продолжения работы цикла
|
||
Do Until <условие> <блокОператоров> Loop | Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, если это условие еще не выполнено, и прекращает работу, когда оно станет истинным, иными словами, в этой конструкции указывается условие прекращения работы цикла | ||
Do <блокОператоров> Loop Until <условие> | Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, если это условие еще не выполнено, а когда оно станет истинным, цикл прекращает работу, иными словами, в этой конструкции указывается условие прекращения работы цикла | ||
Do <блокОператоров> Loop While <условие> |
Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, пока это условие остается истинным, иными словами, в этой конструкции указывается условие продолжения работы цикла |
Имеется также две разновидности оператора цикла с перечислением For. . .Next. Очень часто при обработке массивов, а также в тех случаях, когда требуется повторить выполнение некоторой группы операторов заданное число раз, используется цикл
For. .
.Next со счетчиком. В отличие от циклов Do. . .Loop, данный тип цикла использует специальную переменную, называемую
счетчиком,
значение которой увеличивается или уменьшается при каждом выполнении тела цикла на определенную величину. Когда значение этой переменной достигает заданного значения, выполнение цикла заканчивается.
Синтаксис этого вида цикла выглядит, следующим образом (в квадратные скобки заключены необязательные элементы синтаксической конструкции):
For <счетчик> = <начальноеЗначение>
То <конечноеЗначение>
[Step <приращение>]
<блокОператоров> Next [<счетчик>]
Несколько пояснений к приведенному описанию:
Рассмотрим еще одну разновидность цикла For. . .Next, часто использующуюся в VBA при обработке объектов, составляющих
массив
или
семейство
однородных объектов. В этой разновидности цикла счетчик отсутствует, а тело цикла выполняется для каждого элемента массива или семейства объектов. Вот синтаксис такого цикла:
For Each <элемент> In <совокупность>
<блокОператоров>
Next [<элемент>]
где:
<элемент> — это переменная, используемая для ссылки на элементы семейства объектов;
<совокупность> — это имя массива или семейства.
Приведем пример использования подобного цикла. Следующая процедура предназначается для выдачи на печать списка всех полей для всех таблиц текущей открытой базы данных:
Public Sub EnumerateAllFields()
Dim MyBase As Database
Dim tdf As TableDef, fid As Field
Set MyBase = CurrentDb()
For Each tdf In MyBase.TableDefs
Debug.Print "Таблица: " & tdf.Name
For Each fid In tdf.Fields
Debug.Print " Поле: "
&
fid.Name Next fid
Next tdf
Set MyBase = Nothing
End Sub
Итак, в операторах Dim мы объявили переменную MyBase как объект "база данных DАО", переменные tdf и fid — как определение таблицы и поле таблицы, соответственно. Оператор Set назначает переменной MyBase текущую открытую базу данных. Далее для каждого определения таблицы выполняется вывод на печать названия таблицы, а затем вложенный цикл такого же типа печатает названия всех ее полей.
Приведем еще один пример использования подобного оператора цикла For Each. . .Next для обработки всех элементов многомерного массива. Пусть у нас имеется трехмерный числовой массив из 1000 элементов (размерами 10x10x10), который мы хотим заполнить случайными вещественными числами в диапазоне от 0 до 1. Если бы мы применяли обычные циклы For. . .Next со счетчиками, используя счетчики в качестве индексов элементов массива, то для решения этой задачи потребовалось бы написать три вложенных цикла For. . . Next:
Dim tArray{9, 9, 9) As Single
Dim i%, j%, k%
Randomize
For i=0 To 9
For j=0 To 9
For k=0 To 9
tArray(i, j, k) = Rnd()
Next k
Next j
Next i
На самом же деле достаточно всего одного цикла, если вместо циклов со счетчиками воспользоваться циклом For Each . . . Next:
Dim tArray(9, 9, 9) As Single
Dim elem As Variant
Randomize
For Each elem In tArray
elem = Rnd()
Next
Еще раз порекомендуем использовать отступы при записи циклов, так же, как и при записи операторов ветвления.
Объект
|
Тип |
Описание
|
|
Application |
Объект | Ссылается на активное приложение Microsoft Access. Используется для управления приложением. Этот объект является" СОМ-компонентом и может быть использован другим приложением, которое поддерживает Automation | |
Forms |
Семейство |
Содержит объекты Form, соответствующие |
|
|
всем открытым в данный момент формам в |
||
|
базе данных Access |
||
Form |
Объект |
Ссылается на конкретную форму Access, |
|
|
описывает свойства формы, элементы |
||
|
управления и модуль, содержащий процедуры формы. Каждый объект Form содержит в |
||
|
качестве свойства по умолчанию семейство |
||
|
Controls, представляющее элементы |
||
|
управления данной формы. Поэтому доступ |
||
|
к элементам управления формы может осу- |
||
|
ществляться двумя способами: явно (как к |
||
|
элементу семейства Controls) и неявно |
||
|
(как к элементу объекта Form): |
||
|
Forms ! Заказы. Controls ШомерЗаказа, |
||
|
Forms ! Заказы ! НомерЗаказа. |
||
|
Последний способ доступа обрабатывается |
||
|
быстрее |
||
Reports |
Семейство |
Содержит объекты Report, соответствую щие всем открытым в данный момент отчещие всем открытым в данный момент отчетам в базе данных Access
|
|
|
|||
|
|||
Report |
Объект |
Ссылается на конкретный отчет Access, опи- |
|
|
сывает свойства отчета, элементы управле- |
||
|
ния и модуль, содержащий процедуры отче- |
||
|
та. Доступ к элементам управления отчета |
||
|
осуществляется с помощью семейства |
||
|
Controls (свойства по умолчанию) двумя |
||
|
способами — явно или неявно |
||
Modules |
Семейство |
Содержит объекты Module, соответствую- |
|
|
щие всем открытым в данный момент стан- |
||
|
дартным модулям и модулям объектов в |
||
|
базе данных Access |
||
Module |
Объект |
Ссылается на конкретный стандартный мо- |
|
|
дуль или модуль класса Access, описывает |
||
|
содержимое модуля в строках кода. |
||
|
Приложение Microsoft Access, кроме стан- |
||
|
дартных модулей, не привязанных к объек- |
||
|
там, модулей форм и отчетов, привязанных, |
||
|
соответственно, к форме или отчету, может |
||
|
иметь модули классов, не зависящие от |
||
|
других объектов приложения и определяю- |
||
|
щие новый класс. Тип модуля можно узнать |
||
|
с помощью свойства Туре |
||
Объект |
Тип |
Описание |
||
References |
Семейство |
Содержит объекты Reference, представ- |
||
|
|
ляющие собой установленные ссылки в при- |
||
|
|
ложении Access, С помощью данного семей- |
||
|
|
ства в приложении можно динамически |
||
|
|
устанавливать или удалять ссылки на внеш- |
||
|
|
ние библиотеки |
||
Reference |
Объект |
Соответствует ссылке, установленной на |
||
|
|
библиотеку объектов или типов, содержит |
||
|
|
информацию о ссылке, включая имя биб- |
||
|
|
лиотеки и путь к соответствующему файлу |
||
Printers |
Новое семей- |
Содержит объекты Printer, представляю- |
||
|
ство |
щие собой установленные ссылки на все |
||
|
|
печатающие устройства, доступные в при- |
||
|
|
ложении |
||
Printer |
Новый объект |
Ссылается на конкретное печатающее уст- |
||
|
|
ройство |
||
Da taAccess Pages |
Семейство |
Содержит объекты DataAccessPages, со- |
||
|
|
ответствующие открытым в данный момент |
||
|
|
страницам доступа к данным в базе данных |
||
|
|
или проекте Access |
||
DataAccessPage |
Объект |
Ссылается на конкретную страницу доступа |
||
|
|
к данным Access. Описывает свойства стра- |
||
|
|
ницы |
||
Screen |
Объект |
Ссылается на конкретную форму, отчет или |
||
|
|
элемент управления, который в данный мо- |
||
|
|
мент имеет фокус |
||
DoCmd |
Объект |
Позволяет выполнить макрос или встроен- |
||
|
|
ную инструкцию Access с помощью проце- |
||
|
|
дуры на Visual Basic |
||
VBE |
Объект из |
Предоставляет доступ к функциональным |
||
|
библиотеки |
средствам редактора Visual Basic для Micro- |
||
VBIDE |
soft Access |
|||
DefaultWebOptions |
Объект |
Предоставляет доступ к атрибутам приложе- |
||
|
|
ния, используемым в Access по умолчанию |
||
|
|
при открытии и сохранении Web-страниц |
||
WebOptions |
Новый объект |
Предоставляет доступ к атрибутам конкрет- |
||
|
|
ной страницы доступа к данным, используе- |
||
|
|
мым в Access при открытии и сохранении |
||
|
|
Web-страниц. Эти атрибуты имеют более |
||
|
|
высокий приоритет, чем соответствующие |
||
|
|
атрибуты приложения. Если установлены |
||
|
|
атрибуты страницы доступа к данным, то |
||
|
соответствующие атрибуты приложения для |
|||
|
|
работы с Web-страницами игнорируются. |
||
Объект
|
Тип
|
Описание
|
||
References |
Семейство |
Содержит объекты Reference, представляющие собой установленные ссылки в приложении Access. С помощью данного семейства в приложении можно динамически устанавливать или удалять ссылки на внешние библиотеки |
||
Reference |
Объект |
Соответствует ссылке, установленной на библиотеку объектов или типов, содержит информацию о ссылке, включая имя библиотеки и путь к соответствующему файлу |
||
Printers |
Новое семейство |
Содержит объекты Printer, представляющие собой установленные ссылки на все печатающие устройства, доступные в приложении |
||
Printer |
Новый объект |
Ссылается на конкретное печатающее устройство |
||
DataAccessPages |
Семейство |
Содержит объекты DataAccessPages, соответствующие открытым в данный момент страницам доступа к данным в базе данных или проекте Access |
||
DataAccessPage
|
Объект |
Ссылается на конкретную страницу доступа к данным Access. Описывает свойства страницы |
||
Screen |
Объект |
Ссылается на конкретную форму, отчет или элемент управления, который в данный момент имеет фокус |
||
DoCmd |
Объект |
Позволяет выполнить макрос или встроенную инструкцию Access с помощью процедуры на Visual Basic |
||
VBE |
Объект из библиотеки VBIDE |
Предоставляет доступ к функциональным средствам редактора Visual Basic для Microsoft Access |
||
DefaultWebOptions |
Объект |
Предоставляет доступ к атрибутам приложения, используемым в Access по умолчанию при открытии и сохранении Web-страниц |
||
WebOptions |
Новый объект |
Предоставляет доступ к атрибутам конкретной страницы доступа к данным, используемым в Access при открытии и сохранении Web-страниц. Эти атрибуты имеют более высокий приоритет, чем соответствующие атрибуты приложения. Если установлены атрибуты страницы доступа к данным, то соответствующие атрибуты приложения для работы с Web-страницами игнорируются. |
||
Объект
|
Тип |
Описание
|
||
|
Если изменяются атрибуты страницы досту- |
|||
|
па к данным, автоматически такие же значе- |
|||
|
ния получают атрибуты приложения. Поэто- |
|||
|
му полезно сохранять текущие атрибуты |
|||
|
приложения, чтобы восстанавливать их по- |
|||
|
сле изменения атрибутов страницы доступа |
|||
|
к данным |
|||
DBEngine |
Объект из библиотеки DAO |
Является объектом самого верхнего уровня в |
||
|
объектной модели DАО. Позволяет использовать объекты доступа к данным в приложении Access |
|||
Current Project |
Объект |
Ссылается на программный проект |
||
|
(представляющий совокупность всех про- |
|||
|
граммных модулей, включая стандартные |
|||
|
модули и модули классов) текущей базы |
|||
|
данных или проекта Microsoft Access. Этот |
|||
|
объект содержит семейства объектов |
|||
|
AccessObjects, соответствующих реаль- |
|||
|
ным объектам базы данных или проекта: |
|||
|
AllForms, AllReports, AllMacros, |
|||
|
AllModules, AllDataAccessPages. |
|||
|
Перечисленные семейства включают в себя |
|||
|
все реальные объекты базы данных, незави- |
|||
|
симо от того, открыты они или закрыты в |
|||
|
данный момент |
|||
CurrentData |
Объект |
Ссылается на объекты, сохраненные прило- |
||
|
жением — источником данных (ядром Jet или |
|||
|
SQL-сервером) в текущей базе данных. Со- |
|||
|
держит семейства объектов AccessObject: |
|||
|
AllTables, AllQueries, AllViews, |
|||
|
AllStoredProcedures, All Functions, |
|||
|
AllDatabaseDiagrams. |
|||
|
Перечисленные семейства включают в себя |
|||
|
все реальные объекты базы данных, незави- |
|||
|
симо от того, открыты они или закрыты в |
|||
|
данный момент |
|||
CodeProject |
Объект |
Ссылается на программный проект кода той |
||
|
базы данных (или проекта Microsoft Access), |
|||
|
в которой выполняется (и содержится) код |
|||
|
VBA, включающий данную ссылку. |
|||
|
Этот объект содержит семейства объектов |
|||
|
AccessObjects, соответствующих реаль- |
|||
|
ным объектам базы данных или проекта: |
|||
|
AllForms, AllReports, AllMacros, |
|||
|
AllModules, AllDataAccessPages. |
|||
Объект |
Тип |
Описание |
||
|
Перечисленные семейства включают в себя |
|||
|
все реальные объекты базы данных, незави- |
|||
|
симо от того, открыты они или закрыты в |
|||
|
данный момент |
|||
CodeData |
Объект |
Ссылается на объекты, сохраненные прило- |
||
|
жением — источником данных (ядром Jet или |
|||
|
SQL-сервером) в той базе данных, в которой |
|||
|
выполняется (и содержится) код VBA, вклю- |
|||
|
чающий данную ссылку. Содержит семейст- |
|||
|
ва объектов AccessObj ect: |
|||
|
AllTables, AllQueries, AllViews, |
|||
|
AllStoredProcedures, All Functions, |
|||
|
AllDatabaseDiagrams. |
|||
|
Перечисленные семейства включают в себя |
|||
|
все реальные объекты базы данных, незави- |
|||
|
симо от того, открыты они или закрыты в |
|||
|
данный момент |
|||
Controls |
Семейство |
Содержит объекты Control, представляю- |
||
|
щие все элементы управления в конкретной |
|||
|
форме, отчете или секции, вложенные или |
|||
|
присоединенные элементы управления. Это |
|||
|
семейство является свойством объектов |
|||
|
Form, Report, Section и Control |
|||
Control |
Объект |
Представляет собой любой конкретный эле- |
||
|
мент управления в форме, отчете или сек- |
|||
|
ции, вложенный или присоединенный эле- |
|||
|
мент управления. Объект Control может |
|||
|
ссылаться на один из объектов, характери- |
|||
|
зующих элемент управления определенного |
|||
|
типа, такой как: |
|||
|
CheckBox, TextBox, ComboBox, |
|||
|
CommandButton, CustomControl, |
|||
|
BoundObjectFrame, Image, ListBox, |
|||
|
ObjectFrame, OptionButton, |
|||
|
OptionGroup, Page, Section, SubForm, |
|||
|
TogleButton |
|||
FormatConditions |
Семейство |
Содержит объекты FormatCondition и |
||
|
представляет набор форматов по условию |
|||
|
для объекта TextBox или ComboBox |
|||
Forma tCondit ion |
Объект |
Представляет форматирование по условию, |
||
|
определенное для элемента управления |
|||
|
типа поле ввода (объект TextBox) или спи- |
|||
|
сок с полем ввода (объект ComboBox) |
|||
Объект
|
Тип |
Описание
|
||
AccessObjectProperties | Семейство |
Содержит настраиваемые объекты AccessObj ectProperty, описывающие свойства и однозначно характеризующие конкретный объект AccessObject, CodeData, CodeProject, CurrentData или CurrentProject |
||
AccessObject
|
Объект |
Ссылается на реальный объект Microsoft Access в любом из семейств:
AllForms, AllReports, AllMacros, AllModules, AllDataAccessPages, AllTables, AllQueries, AllViews, AllStoredProcedures, All Functions, AllDatabaseDiagrams. В зависимости от того, к какому семейству он принадлежит, этот объект представляет собой любой из объектов Access: таблицу (Table), запрос (Query), отчет (Report), форму (From), модуль (Module), макрос (Macro), страницу доступа к данным (Data access page), представление (view), хранимую процедуру (stored procedure) или схему базы данных (Database diagram). Объект AccessObject ссылается на существующий объект базы данных, нельзя создать новый или удалить существующий объект AccessObject |
||
AccessObjectProperty |
Объект |
Представляет встроенные или определенные пользователем характеристики (свойства) любого объекта AccessObject, CodeData, CodeProject, CurrentData или CurrentProject |
||
В Microsoft Access 2002 появились два новых семейства, содержащих новые объекты:
Семейство
|
Объект
|
Описание
|
||
Connections |
Connection |
Предоставляет информацию о соединении с источником данных ODBC (используется только в рабочей области ODBCDirect) |
||
Containers |
Container |
Хранилище информации об объекте предопределенного типа (используется только в рабочей области Microsoft Jet) |
||
Databases |
Database DBEngine |
Открытая база данных Главный объект ядра баз данных Microsoft Jet |
||
Documents |
Document |
Информация о сохраненном объекте предопределенного типа (используется только в рабочей области Microsoft Jet) |
||
Errors |
Error |
Информация об ошибках, ассоциированных с данным объектом |
||
Fields |
Field |
Представляет поле (столбец) таблицы, запроса, индекса, поле связи между таблицами или запросами или поле набора записей |
||
Groups |
Group |
Группа пользователей, определяющая права доступа к данным (используется только в рабочей области Microsoft Jet) |
||
Indexes |
Index |
Определяет порядок и уникальность значений в таблице (используется только в рабочей области Microsoft Jet) |
||
Parameters |
Parameter |
Параметр для параметризованного запроса |
||
Семейство
|
Объект
|
Описание
|
||
Properties |
Property |
Встроенная или определенная пользователем характеристика (свойство) |
||
QueryDef s |
QueryDef |
Описание хранимого в базе данных запроса |
||
Recordsets |
Recordset |
Набор записей в базовой таблице или запросе |
||
Relations |
Relation |
Связь между полями таблиц или запросов (используется только в рабочей области Microsoft Jet) |
||
TableDefs |
TableDef |
Описание хранимой в базе данных таблицы (используется только в рабочей области Microsoft Jet) |
||
Users |
User |
Бюджет пользователя, определяющий права доступа к данным (используется только в рабочей области Microsoft Jet) |
||
Workspases |
Workspace |
Сеанс работы с источником данных с помощью ядра баз данных Microsoft Jet |
||
Объект |
Тип |
Описание |
||
Connection |
Объект |
Открывает сеанс обмена данными |
||
Command |
Объект |
Представляет собой инструкцию SQL |
||
Parameter |
Объект |
Представляет собой параметр инструкции SQL |
||
Recordset |
Объект |
Представляет собой набор записей и позволяет осуществлять навигацию по записям и манипулировать с данными в нем |
||
Field |
Объект |
Представляет собой поле (столбец) в наборе записей
Recordset |
||
Error |
Объект |
Представляет собой информацию об ошибке, произошедшей во время сеанса связи |
||
Property |
Объект |
Представляет характеристику (свойство) любого объекта ADO |
||
Errors |
Семейство |
Все объекты Error в этом семействе создаются в ответ на одну ошибку, произошедшую во время сеанса связи |
||
Parameters |
Семейство |
Содержит все объекты Parameter, ассоциированные с объектом Command |
||
Fields |
Семейство |
Содержит все объекты Field, ассоциированные с набором записей Recordset |
||
Properties |
Семейство |
Содержит все объекты Property, ассоциированные с объектом Connection, Command, Recordset или Field |
||
Record |
Объект |
Представляет собой каталог или файл |
||
Stream |
Объект |
Представляет собой содержимое файла |
||
Объект
|
Тип
|
Описание
|
||
Catalog | Объект | Главный объект этой модели. Ссылается на источник данных и обеспечивает доступ ко всем объектам источника — таблицам, представлениям, процедурам, группам, пользователям | ||
Tables |
Семейство |
Семейство таблиц, содержащихся в источнике данных. Каждый объект Table этого семейства ссылается на одну таблицу |
||
Indexes |
Семейство |
Содержит все индексы таблицы. Каждый объект Index семейства ссылается на один из индексов |
||
Keys |
Семейство |
Содержит все ключи таблицы. Каждый объект Key семейства ссылается на один из ключей |
||
Columns |
Семейство |
Содержит объекты Column, которые ссылаются на столбцы в одном из объектов Table, Index, Key |
||
Groups |
Семейство |
Содержит все объекты Group каталога или пользователя. Каждый из объектов Group ссылается на бюджет группы в каталоге или пользователе |
||
Users |
Семейство |
Содержит объекты User, которые представляют собой бюджеты пользователей, имеющих права доступа к защищенной базе данных |
||
Procedures |
Семейство |
Содержит все хранимые процедуры в базе данных. Каждый объект Procedure семейства ссылается на одну из хранимых процедур |
||
Views |
Семейство |
Содержит все представления (view) в базе данных |
||
Иерархическая структура модели объектов ADOX представлена на рис. 13.6.
Объект
|
Тип
|
Описание
|
||
JetEngine |
Объект |
Обеспечивает доступ к двум сервисам ядра базы данных Jet: сжатие базы данных и выгрузка данных из кэша в файл базы данных MDB |
||
Replica | Объект | Представляет собой копию реплицированной базы данных | ||
Filters | Семейство | Содержит набор объектов Filter, каждый из которых представляет собой набор записей, которые должны реплицироваться |
Более подробное описание объектов JRO и их использования приведено
в гл. 18.
В случае разработки многоуровневого клиент-серверного приложения для доступа к данным используется еще одна объектная модель — RDS (служба удаленного доступа к данным). Она включает три объекта, краткое описание которых приведено в табл. 13.8.
Объект
|
Тип |
Описание
|
||
RDS .DataSpace |
Объект |
Этот объект содержит метод, позволяющий создать объект (так называемый бизнес-объект) промежуточного сервера передачи данных. В качестве промежуточного сервера может выступать процедура, указанная пользователем, встроенная процедура, используемая по умолчанию, или библиотека динамической компоновки DLL, исполняемая в локальной сети, в Интернете или сети интранет |
||
RDSServer. DataFactory | Объект | Представляет собой встроенную программу — сервер данных, которая выполняет обработку данных и возвращает результат обработки | ||
RDS.DataControl | Объект | Этот объект может использоваться для следующих целей: автоматическое выполнение функций объектов RDS. DataSpace и RDSServer .DataFactory, выполнение обработки данных или возвращение результата с помощью встроенных служб RDS, представление результата обработки данных в виде совокупности значений для визуальных элементов управления (в форме) |
Объект
|
Тип
|
Описание
|
||
AnswerWizard |
Объект |
Соответствует Мастеру ответов приложе- |
||
|
|
ния Microsoft Office. Все приложения се- |
||
|
мейства Microsoft Office имеют только |
|||
|
один Мастер ответов, поэтому все изме- |
|||
|
|
нения над этим объектом немедленно |
||
|
|
отразятся на активном приложении |
||
Assistant |
Обьект и |
Ссылается на объект, представляющий |
||
|
семейство |
активного в данный момент помощника |
||
|
|
Microsoft Office |
||
COMAddlns |
Семейство |
Содержит объекты COMAddln, соответст- |
||
|
|
вующие надстройкам СОМ, зарегистри- |
||
|
|
рованным в реестре Windows |
||
CoiranandBars |
Семейство |
Содержит объекты CommandBar, соот- |
||
|
|
ветствующие панелям команд приложе- |
||
|
|
ния-контейнера (это могут быть строки |
||
|
|
меню, панели инструментов, меню и кон- |
||
|
|
текстные меню) |
||
DocumentProperties |
Семейство |
Содержит объекты DocumentProperty, |
||
|
|
каждый из которых представляет собой |
||
|
|
набор встроенных или определенных |
||
|
|
пользователем характеристик (свойств) |
||
|
|
документа-контейнера |
||
FileDialog |
Новый |
Реализует диалоговое окно, аналогичное |
||
|
объект |
окнам Открыть (Open) и Сохранить |
||
|
|
(Save) Microsoft Office |
||
FileDialogFilters |
Новое се- |
Содержит объекты FileDialogFilter, |
||
|
мейство |
которые представляют собой фильтры, оп- |
||
|
|
ределяющие, какие файлы будут отобра- |
||
|
|
жаться в диалоговом окне FileDialog |
||
FileDialogSelectedl terns |
Новое се- |
Семейство строковых значений, пред- |
||
|
мейство |
ставляющих собой пути к файлам или |
||
|
папкам, выбранным в диалоговом окне |
|||
|
FileDialog |
|||
FileSearch |
Объект |
Реализует функциональность стандарт- |
||
|
|
ного диалогового окна открытия файла |
||
FileTypes |
Новое се- |
Семейство значений типов файлов, кото- |
||
|
мейство |
рые возвращаются методом Execute |
||
|
|
диалогового окна FileDialog |
||
HTMLProject |
Объект |
Представляет собой корень дерева проек- |
||
|
|
та Web-страницы, отображаемого в окне |
||
|
|
просмотра проекта Project Explorer ре- |
||
|
|
дактора сценариев Microsoft Script Editor. |
||
Объект
|
Тип
|
Описание
|
||
|
|
Этот объект содержит семейство |
||
|
|
HTMLProjectltems объектов |
||
|
|
HTMLProjectltem, ссылающихся на эле- |
||
|
|
менты иерархической структуры проекта. |
||
|
|
С помощью этого объекта можно управлять |
||
|
|
проектом Web-страницы, например открыть |
||
|
|
его в редакторе сценариев |
||
LanguageSet tings |
Объект |
Предоставляет информацию о языковых |
||
|
|
настройках приложения семейства Micro- |
||
|
|
soft Office |
||
MsoEnvelope |
Новый |
Обеспечивает возможность отправки до- |
||
|
объект |
кументов по электронной почте |
||
NewFile |
Новый |
Содержит список строковых значений, |
||
|
объект |
которые отображаются в группе Создание |
||
|
|
(New) на панели задач |
||
ODSOColumns |
Новое се- |
Объекты этого семейства представляют |
||
|
мейство |
собой поля в файле для слияния с доку- |
||
|
|
ментом Word |
||
ODSOFilters |
Новое се- |
Объекты этого семейства представляют |
||
|
мейство |
собой фильтры, которые применяются к |
||
|
|
файлу — источнику данных для документа |
||
|
|
слияния |
||
Off iceDataSourceObject |
Новый |
Представляет собой источник данных для |
||
|
объект |
операции слияния |
||
SearchFolders |
Новое се- |
Содержит набор объектов, представляю- |
||
|
мейство |
щих собой папки, в которых ведется поиск |
||
|
|
при использовании объекта FileSearch |
||
SignatureSet |
Новое се- |
Содержит набор объектов Signature, каж- |
||
|
мейство |
дый из которых представляет собой цифро- |
||
|
|
вую подпись, связанную с документом |
||
WebPageFonts |
Семейство |
Содержит набор объектов WebPageFont, |
||
|
|
каждый из которых соответствует одному из |
||
|
|
поддерживаемых национальных стандартов. |
||
|
|
Каждый объект определяет шрифты и их |
||
|
|
размеры, которые используются по умолча- |
||
|
|
нию при сохранении документа в формате |
||
|
|
Web-страницы |
||
Scripts |
Семейство |
Содержит объекты Script, соответствую- |
||
|
|
щие сценариям, определенным в документе |
||
|
|
Word, электронной таблице Excel или слай- |
||
|
|
де PowerPoint. С помощью этого объекта |
||
|
|
можно управлять сценариями документа, |
||
|
|
например создавать новые сценарии |
||
Команда
|
Назначение
|
||
Compile
(Компиляция) |
Компилирует все модули в текущей базе данных |
||
Step Into (Шаг с за ХОДОМ) |
Исполняет очередную строку кода с заходом в процедуры |
||
Step Over (Шаг с обходом) |
Исполняет очередную строку кода без захода
в
процедуры, т. е. функции и процедуры выполняются за один шаг |
||
Step Out (Шаг с выходом) |
Выполняет остаток текущей процедуры и останавливается в вызывающей программе на следующей строке после вызова этой процедуры |
||
Run to Cursor
(Запуск до курсора) |
Выполняются все строки кода от текущей строки до строки, в которой установлен курсор. Останавливается перед этой строкой |
||
Add Watch
(Добавление контрольного значения) |
Открывает окно Добавление контрольного значения |
||
Edit Watch
(Изменение контрольного значения) |
Открывает окно Изменение контрольного значения |
||
Quick Watch
(Быстрый просмотр) |
Выводит в специальном окне текущее значение выражения в точке останова |
||
Toggle Breakpoint
(Установка/сброс точек останова) |
Устанавливает/снимает точку останова на строку, в которой находится курсор |
||
Clear All Breakpoints
(Сброс всех точек останова) |
Снимает все точки останова, установленные в данном модуле |
||
Set Next Statement
(Установка следующего предложения) |
Устанавливает очередную выполняемую команду на строку, в которой находится курсор |
||
Show Next Statement
(Показ следующего предложения) |
Отображает в окне редактора очередную команду для выполнения |
||
Кнопки на инструментальной панели в основном повторяют описанные команды. Это видно из значков, находящихся рядом с командой и на кнопках. Кроме того, здесь существуют кнопки, соответствующие меню
Run:
Еще несколько кнопок инструментальной панели позволяют открыть специальные окна отладки.
Комбинация клавиш |
Назначение |
||
<F7> |
Открыть окно редактора кода |
||
<Ctrl>+<F> |
Найти |
||
<Ctrl>+<F> |
Заменить |
||
<F3> |
Найти далее |
||
<Shift>+<F3> |
Найти ранее |
||
<Ctrl>+<t> |
К следующей процедуре |
||
<Ctrl>+<n> |
К предыдущей процедуре |
||
<Ctrl>+<J> |
List Properties/Members |
||
<Ctrl>+<Shift>+<J> |
List Constant |
||
Комбинация клавиш |
Назначение |
|
<Ctrl>+<|> |
Quick Info |
|
<Ctrl>+<Shift>+<|> |
Parameter Info |
|
<СМ>+<Пробел> |
Закончить слово |
|
<F5> |
Продолжить |
|
<Shift>+<F5> |
Сброс |
|
<F8> |
Шаг с заходом |
|
<Shift>+<F8> |
Шаг с обходом |
|
<Ctrl>+<Shift>+<F8> |
Шаг с выходом |
|
<F9> |
Установка/сброс точки останова |
|
<Shift>+<F9> |
Вызов окна Quick Watch |
|
<Ctrl>+<Shift>+<F9> |
Сброс всех точек останова |
|
<F2> |
Вызов окна просмотра объектов Object Browser |
|
<Shift>+<F2> |
Definition |
|
<Ctrl>+<Shift>+<F2> |
Last Position |
|
<Ctrl>+<G> |
Вызов окна Immediate |
|
<Ctrl>+<L> |
Вызов окна Call Stack |
|
Событие
Текущая запись
(Current) происходит, когда очередная запись получает фокус или выполняется повторное обращение к источнику данных формы — таблице или запросу. Таким образом, оно возникает как при открытии формы, так и при переходе от одной записи к другой. Чаще всего это событие используется для синхронизации записей в связанных формах.
Событие
Удаление
(Delete) происходит, когда пользователь пытается удалить запись из формы. Оно происходит до того, как запись реально удаляется из базы данных. Процедура обработки этого события имеет параметр Cancel. Установка значения этого параметра в процедуре равным True позволит предотвратить удаление записи.
Событие
Уход с записи
(RecordExit) происходит всякий раз, когда пользователь пытается выйти (переместить фокус) с текущей записи: перейти к другой записи, закрыть форму, обновить данные в форме и т. д. Процедура обработки этого события может использоваться для проверки корректности данных в текущей записи. Процедура имеет один параметр: cancel. Если установить его значение равным True, то можно запретить пользователю покидать текущую запись.
Как и во всех других языках программирования, в VBA имеются различные управляющие конструкции, позволяющие изменять порядок выполнения программы. Если управляющие конструкции не используются, происходит последовательное выполнение операторов языка программирования, начиная с самого первого и кончая последним. Хотя в некоторых самых простых случаях этого и бывает достаточно, обычно все-таки требуется изменять порядок исполнения операторов при выполнении определенных условий, либо пропуская выполнение некоторых операторов, либо, наоборот, многократно повторяя их. Оказывается, для реализации любых алгоритмов достаточно иметь только два вида конструкций управления: ветвления и циклы.
При обращении к объекту из процедуры VBA вы можете получить сообщение об ошибке, которое может быть вызвано тем, что не подключена соответствующая библиотека. При установке Access по умолчанию подключаются следующие библиотеки:
Все остальные библиотеки при необходимости должны быть подключены вручную, для чего нужно установить ссылку на соответствующую библиотеку.
Откройте редактор VBA и выполните команду
Tools, References
(Сервис, Ссылки). В открывшемся диалоговом окне
References
(Ссылки) (рис. 13.24) найдите требуемую библиотеку и установите необходимый флажок.
Управляющие конструкции ветвления позволяют проверить некоторое условие и, в зависимости от результатов этой проверки, выполнить ту или иную группу операторов. Для организации ветвлений в VBA используются различные формы оператора ветвления If и-оператор выбора Select Case.
Простейшая, краткая форма оператора if используется для проверки одного условия, а затем либо выполнения, либо пропуска одного оператора или блока из не
скольких операторов. Краткая форма оператора ветвления if может иметь как однострочную, так и блочную форму. В одну строку краткая форма If может быть записана так:
If <условие> Then <оператор>
В блочной форме краткое ветвление выглядит следующим образом:
If <условие> Then
<оператор1>
<оператор2>
End If
В качестве условия можно использовать логическое выражение, возвращающее значение True или False, или любое арифметическое выражение. Если применяется арифметическое выражение, то нулевое значение этого выражения эквивалентно логическому значению False, а любое ненулевое выражение эквивалентно True. В том случае, когда условие возвращает значение False, оператор или блок операторов, заключенных между ключевыми словами Then и End if и составляющих тело краткого оператора ветвления, не будет выполняться.
Замечание
Обратите внимание, что при записи краткого оператора ветвления в одну строку ключевые слова End I f не используются.
Полная форма оператора if используется в тех случаях, когда имеются два различных блока операторов и по результатам проверки условия нужно выполнить один из них. Такая форма if не может записываться в одну строку и всегда имеет блочную форму записи:
If <условие> Then
<блокОператоров1> Else
<блокОператоров2>
End If
Если условие истинно, выполняется первый блок операторов, заключенный между ключевыми словами Then и Else, а в противном случае — второй блок, заключенный между ключевыми словами Else и End If.
Совет
Для того чтобы текст вашей процедуры был понятным и удобным для восприятия, рекомендуется делать отступы для групп операторов так, как это указано при описании их синтаксиса. В VBA предусмотрено удобное средство изменения отступов — нажатие на клавишу <Таb> увеличивает отступ вправо, нажатие комбинации клавиш <Shift>+<Tab> уменьшает этот отступ.
Иногда приходится делать выбор одного действия из целой группы действий на основе проверки нескольких различных условий. Для этого можно использовать цепочку операторов ветвления If. . .Then. . . Elseif:
If <условие1> Then
<блокОператоров!>
Elseif <условие2> Then
<блокОператоров2>
Elseif <условие3> Then
<блокОператоровЗ>
Elseif <условиеN> Then
<блокОператоровN> Else
<блокОператоров_Еlsе>
End If
Такие цепочки операторов If.. .Then. . .Elseif обладают большой гибкостью и позволяют решить все проблемы, однако если выбор одной из нескольких возможностей все время основан на различных значениях одного и того же выражения, гораздо удобнее использовать специально предназначенный для этого оператор выбора Select Case, имеющий следующий синтаксис:
Select Case <проверяемоеВыражение>
Case <списокЗначений1>
<блокОператоров1>
Case <списокЗначений2>
<блокОператоров2>
Case <списокЗначенийЗ>
<блокОператоровЗ>
Case Else
<блокОператоровЕlsе>
End Select
Проверяемое выражение вычисляется в начале работы оператора Select Case. Это выражение может возвращать значение любого типа, например логическое, числовое или строковое.
Список выражений представляет собой одно или несколько выражений, разделенных запятой. При выполнении оператора проверяется, соответствует ли хотя бы один из элементов этого списка проверяемому выражению.
Эти элементы списка выражений могут иметь одну из следующих форм:
<выражение> в данном случае проверяется, совпадает ли значение проверяемого выражения с этим выражением;Если хотя бы один из элементов списка соответствует проверяемому выражению, то выполняется соответствующая группа операторов и на этом выполнение оператора Select Case заканчивается, а остальные списки выражений не проверяются, т. е. отыскивается только первый подходящий элемент списков выражений. Если же ни один из элементов всех этих списков не соответствует значению проверяемого выражения, выполняются операторы группы Else, если таковая присутствует.
Событие
Вход
(Enter) происходит перед тем, как элемент управления в форме получает фокус от другого элемента управления в той же форме или когда при открытии формы получает фокус первый элемент управления. Его удобно использовать для вывода на экран каких-либо сведений об этом элементе. Оно происходит до события
Получение фокуса
(GetFocus), но после события
Текущая запись
(Current).
Событие
Включение
(Activate) возникает, когда форма или отчет получают фокус, становясь активной формой или отчетом. Это происходит, когда форма или отчет открываются, когда пользователь щелкает мышью на одном из элементов управления, перенося, таким образом, фокус, и когда в программе VBA выполняется метод SetFocus объекта. Форма при этом обязательно должна быть видима. Событие
Включение
(Activate) возникает до события
Получение фокуса
(GetFocus). Это событие удобно использовать для того, чтобы вывести на экран панель инструментов, связанную с формой.
Событие
Внесены изменения
(Dirty), так же как и
Изменение
(Change), возникает в следующих ситуациях:
Но в отличие от события
Изменение
(Change) оно относится к форме. Процедура имеет один параметр: Cancel. Если установить его значение равным True, то событие будет отменено. Отмена события будет вызывать откат всех изменений в записи, что эквивалентно нажатию клавиши <Esc>. Это событие удобно использовать для проверки, были ли изменения в записи.
Событие происходит, если при форматировании раздела требуется вернуться к разделу, который уже отформатирован. Оно происходит после события
Форматирование
(Format), но до события
Печать
(Print). Процедура обработки данного события позволяет изменить любое уже выполненное форматирование и обеспечить, таким образом, нужное расположение элементов отчета на странице.
Замечание
Событие
Возврат
(Retreat) не определено для верхних и нижних колонтитулов отчета.
Событие
Выгрузка
(Unload) происходит при закрытии формы до события и может быть отменено. Обычно это событие используется для проверки различных условий, которые определяют, можно ли закрывать форму. Процедура обработки этого события имеет один параметр — Cancel, при установке которого в значение True отменяется закрытие формы.
Замечание
Если вы используете процедуру обработки события
Выгрузка
(Unload), в которой параметру Cancel присваивается значение True, не забудьте явно присвоить ему значение False в случае выполнения всех условий для закрытия формы. Иначе после того как этот параметр будет установлен в True, форму нельзя будет закрыть никогда.
Событие
Выход
(Exit) происходит перед тем, как данный элемент управления передаст фокус другому элементу управления той же формы, но до события
Потеря фокуса
(LostFocus).
Замечание
События
Вход
(Enter) и
Выход
(Exit) не определены для флажков и переключателей в группах, они определены только для группы как целого. События
Вход
(Enter) и
Выход
(Exit) не происходят, если фокус переходит к элементу другой формы или отчета. Это отличает их от событий
Получение фокуса
(GetFocus) и
Потеря фокуса
(LostFocus).
Обычно выполнение процедуры заканчивается после выполнения ее последнего оператора, а выполнение цикла — после нескольких выполнений тела цикла, когда достигнуто условие завершения его работы. Однако в некоторых случаях бывает нужно прекратить выполнение процедуры или цикла досрочно, избежав выполнения лишних операторов процедуры или лишних повторений цикла. Например, если при выполнении процедуры произошла ошибка, которая делает продолжение ее работы бессмысленным, можно выполнить команду немедленного выхода из процедуры. Другой пример: если цикл For. . .Next используется для поиска нужного значения в массиве, то после того, как нужный элемент массива найден, нет смысла продолжать дальнейший перебор элементов массива. Досрочный выход из управляющей конструкции можно осуществить с помощью одного из операторов Exit. Для досрочного выхода из циклов Do. . .Loop используется оператор Exit Do, a для выхода из циклов For — оператор Exit For. Для досрочного выхода из процедур и функций применяются операторы Exit Sub и Exit Function соответственно. Следует, однако, отметить, что хотя использование оператора Exit может быть вполне оправданным, необходимо избегать излишнего употребления этого оператора, прибегая к нему только в крайних случаях. Излишне частое употребление данного оператора затрудняет понимание написанного текста программы и его отладку.
Например, в следующем цикле поиска For. . .Next используется оператор Exit For:
ub = Ubound(dArray)
fFound = False
For i=LBound(dArray) To ub
If dArray(i) = searchValue Then
fFound = True
Exit For
End If Next
Однако такого применения оператора Exit вполне можно избежать. Вот пример подобного же цикла поиска, но без использования Exit:
i = Lbound(dArray)
ub = Ubound(dArray)
fFound = False Do
If dArray(i) = searchValue
Then fFound = True
i = i + 1
Loop Until (i > ub) Or fFound
На этом мы заканчиваем краткое знакомство с основными понятиями языка VBA. Если читателю требуется более подробное и строгое изложение синтаксиса языка, то лучше обратиться к специальным книгам, посвященным этому языку. В других разделах настоящей главы, а также в последующих главах мы покажем, как VBA используется при разработке приложений, и познакомим с теми его особенностями, которые специфичны именно для Access. Это касается в первую очередь объектов Access и объектов данных.
Следующие ниже подразделы данного раздела описывают синтаксис языка программирования VBA.
Событие
Загрузка
(Load) происходит сразу после события
Открытие
(Open), но в отличие от него не может быть отменено. Обычно его используют для динамического изменения свойств формы или элементов управления перед тем, как форма будет выведена на экран.
Событие
Закрытие
(Close) является последним перед тем, как форма будет удалена с экрана. Обычно его используют для открытия другой формы. Для отчета событие происходит, когда закрывается режим Предварительного просмотра или заканчивается печать отчета. Как и в случае с формой, его можно использовать для определения дальнейших действий пользователя.