Лекция 16: Программирование на языке VBA Вопрос 1. Объекты и семейства VBA Язык VBA является объектно-ориентированным языком программирования. Стандартные объекты VВА представляют собой основные средства манипуляции с данными Microsoft Access и других приложений семейства Microsoft Office. Знание технологии объектно-ориентированного программирования и состава объектных моделей VBA позволяет разрабатывать профессиональные приложения, выполняющие всю необходимую обработку данных. Объект — абстракция, которой оперирует в объектно-ориентированных языках программирования. Объект обладает собственными характерными признаками, отличающими его от ДРУГИХ объектов: кроме того, объект имеет свое поведение. Класс - описание совокупности однотипных объектов. Класс можно сравнить с типом данных, где переменной является объект. В этом случае говорят, что объект представляет собой экземпляр определенного класса. Метод — отдельная характеристика объекта или класса. Свойство объекта может принимать определенное значение. Метод — процедура (или функция) объекта или класса. У объекта или класса может быть определенное количество методов и свойств. Методы определяют поведение объекта. В объектно-ориентированных языках программирования поведение приложения определяется поведением созданных в нем объектов. Объект может реагировать на определенное событие (event), происходящее в процессе работы приложения и влияющее на объект. Совокупность событий, на которые объект способен реагировать, определяется создателем класса, экземпляром которого является данный объект. Реакцией объекта на произошедшее событие может быть выполнение им некоторых заданных действий — специальной процедуры, которая называется процедурой обработки события. Любому событию объекта может быть назначена некоторая процедура его обработки. Семейство (collection) — упорядоченный набор однотипных объектов, т.е. экземпляров одного класса. Семейство тоже является объектом, и одним из методов этого объекта является процедура, возвращающая ссылку на конкретный объект в семействе. Одним из свойств семейства является число объектов, хранящихся в нем. Объектная модель (object model) — совокупность взаимосвязанных объектов, описывающих программную систему. В VBA определены специальные объектные модели для каждого компонента семейства Microsoft Office и объектные модели, общие для всех компонентов Microsoft Office. С помощью объектных моделей, определенных в VВА осуществляется управление приложениями Microsoft Office. В базе данных Microsoft Access могут храниться такие объекты, как таблицы, запросы, формы, отчеты, макросы и модули, а также ссылки на объекты — страницы доступа к данным. В проекте Microsoft Access могут храниться такие объекты, как формы, отчеты, макросы и модули, ссылки на страницы доступа к данным, а также ссылки на объекты, хранящиеся в базе данных на SQL-сервере (таблицы, представления, диаграммы базы данных и хранимые процедуры). Страница доступа к данным представляет собой Webстраницу, хранящуюся отдельно от БД или проекта Microsoft Access . В базе данных или проекте хранится только ссылка на страницу доступа к данным в виде ярлыка (подобного ярлыку файла Windows). Доступ к объектам, хранящимся в приложении Microsoft Access, осуществляется с помощью окна базы данных или проекта. К постоянным объектам (содержащимся в базе данных или проекте Access) относятся подчиненные объекты, например элементы управления в форме, отчете, на странице доступа к данным. Кроме постоянных объектов бывают временные объекты, т.е. объекты ВА, которые существуют только в период времени выполнения приложения. Создание объектов в Microsoft Access осуществляется интерактивно или программно. Чтобы изменить свойства объекта, достаточно щелкнуть правой кнопкой мыши по нему; (например, по таблице в окне базы данных или проекта Access и выбрать в контекстном меню команду Свойства (Properties). Появится окно свойств объекта, представленное на рис.16.1. Рис. 16.1. Окно свойств объекта приложения Access Окно свойств объекта элемента управления тоже открывается с помощью команды контекстного Свойства. Чтобы отобразить контекстное меню элемента управления, достаточно открыть форму (отчет или страницу доступа к данным) в режиме конструктора и щелкнуть правой кнопкой мыши по элементу управления. Другие свойства объектов можно изменить только программно, т.е. с помощью макроса или процедуры VBA. Программный доступ к постоянным (хранимым в приложении Access) и временным объектам (осуществляется с помощью объектных моделей VBA. Объектная модель Microsoft Access реализована в виде набора объектов собранных в библиотеке Access (рис.). Основным элементом в иерархии объектов библиотеки Access является объект Application, который содержит ссылки на все объекты и семейства объектов Microsoft Access. Каждый объект из библиотеки Access имеет в качестве свойства объект Application, который ссылается на активное приложение Microsoft Access. Каждый объект может содержать набор свойств, часть из которых может являться ссылками на другие объекты. Рис. 16.2. Окно просмотра объектов В каждый новый уровень иерархии входят объекты, ссылки на которые хранятся в объектах, расположенных на предыдущем уровне. Если свойство объекта представляет собой ссылку на объект, определенный в другой библиотеке (не в библиотеке Access), для него приводится название этой библиотеки. Для доступа к некоторым объектам можно использовать сокращенную ссылку, содержащую только имя объекта. Дело в том, что определенные объекты, свойства и методы считаются глобальными. Ссылки на них хранятся в специальном объекте с именем Global. Узнать, какие свойства и методы являются глобальными, позволяет окно просмотра объектов (рис. 16.2). Чтобы отобразить список глобальных компонентов объектной модели, следует выбрать элемент globals в списке Classes в окне просмотра объектов. Например, объект DoCmd является глобальным. Для доступа к нему можно использовать сокращенную ссылку вида DoCmd вместо полной ссылки вида Application. DoCmd В табл. 16.1 приведено описание объектов Microsoft Access, определенных в библиотеке Access (если не указана другая библиотека объектов). В Microsoft Access 97 для программного доступа к базе данных используется объект Database из библиотеки ОАО (объекты доступа к данным). Ссылку на этот объект возвращают, например, методы CurrentDb и CodeDb объекта Application, отличающиеся друг от друга. Первый метод возвращает ссылку на объект Database, который представляет собой текущую базу данных Microsoft Access, а второй метод возвращает ссылку на объект Database, представляющий собой ту базу данных, в которой выполняется код VBA, содержащий вызов метода CodeDb. Метод CodeDb целесообразно ис пользовать в процедурах библиотек Access, так как вызовом такой процедуры можно получить доступ к библиотечной базе данных. В Microsoft Access 2000 у объекта Application появились новые свойства: CurrentProject, CurrentData, CodeProject и CodeData, позволяющие манипулировать объектами базы данных. Теперь вместо объекта Database из библиотеки DAO для работы с базой данных или проектом Access можно использовать объекты CurrentProject^ CurrentData, CodeProject и CodeData из библиотеки Access. Пары объектов CurrentProject, CodeProject и CurrentData, CodeData имеют одинаковые свойства и методы. Отличие объектов CurrentProject и CurrentData от CodeProject и CodeData подобно отличию друг от друга объектов, возвращаемых методами CurrentDb и CodeDb. Объекты CurrentProject и CurrentData соответствуют текущей базе данных, а объекты CodeProject и CodeData — базе данных, в которой выполняется (и содержится) код VBA, содержащий ссылки на эти объекты. Таблица 16.1 Описание составляющих объектной модели Microsoft Access Объект Тип Application Объект Описание Ссылается на активное приложение Microsoft Access. Используется для управления приложением. Этот объект является СОМкомпонентом и -может быть использован другим приложением, которое поддерживает Automation Forms Семейство Содержит объекты Form, соответствующие всем открытым в данный момент формам в БД Access Form Объект Ссылается на конкретную форму Access, описывает свойства формы, элементы управления и модуль, содержащий процедуры формы. Каждый объект Form содержит в качестве свойства по умолчанию семейство Controls, представляющее собой элементы управления данной формы. Следовательно, доступ к элементам управления формы может осуществляться двумя способами — явно (как к элементу семейства Controls) и неявно (как к элемент) объекта Form): 1. Forms!Заказы.Соntrols!НомерЗаказа Reports Семейство Report Объект Modules Семейство Module Объект References Семейство Reference Объект DataAccessPages Новое 2. Forms!Заказы!НомерЗаказа Содержит объекты Report, соответствующие всем открытым в данный момент отчетам в БД Access Ссылается на конкретный отчет Access, описывает свойства отчета, элементы управления и модуль, содержащий процедуры отчета. Доступ к элементам управления отчета осуществляется с помощью семейства Controls (свойства по умолчанию) двумя способами — явно и неявно. Содержит объекты Module, соответствующие всем открытым в данный момент стандартным модулям и модулям объектов в БД Access Ссылается на конкретный стандартный модуль или модуль класса Access, описывает содержимое модуля в строках кода. Приложение Microsoft Access кроме стандартных модулей, не привязанных к объектам, модулей форм и отчетов, привязанных соответственно к форме или отчету, может иметь модули классов, не зависящие от других объектов приложения и определяющие новый класс. Тип модуля можно узнать с помощью свойства Туресобой установленные Содержит объекты Reference, представляющие ссылки в приложении Access. С помощью данного семейства в приложении можно динамически устанавливать или удалять ссылки на внешние библиотеки Соответствует ссылке, установленной на библиотеку объектов или типов, содержит информацию о ссылке, включающую в себя имя библиотеки и путь к соответствующему файлу Содержит объекты DataAccessPages, соответствующие открытым в данный момент страницам доступа к данным в БД или проекте Access семейство DataAccessPage Новый объект Ссылается на конкретные страницу доступа к данным Access. Описывает свойства страницы Screen Объект Ссылается на конкретные форму, отчет или элемент управления, которые в данный момент имеют фокус DoCmd Объект Позволяет выполнить макрос или встроенную инструкцию Access с помощью процедуры на VBA Предоставляет доступ к функциональным средствам нового редактора VBE Новый объект из библиотеки VBIDE DefaultWebOptions Новый объект Предоставляет доступ к атрибутам приложения, используемым в Access по умолчанию при открытии и сохранении Web-страниц WebOptions Предоставляет доступ к атрибутам конкретной страницы доступа к данным, используемым в Access при открытии и сохранении Webстраниц. Эти атрибуты имеют более высокий приоритет, чем соответствующие атрибуты приложения. Если установлены атрибуты страницы доступа к данным, то соответствующие атрибуты приложения для работы с Web-страницами игнорируются. Новый объект Если атрибуты страницы доступа к данным изменяются, то автоматически такие же значения получают атрибуты приложения. Следовательно, полезно сохранять текущие атрибуты приложения, чтобы восстанавливать их после изменения атрибутов страницы доступа к данным DBEngine CurrentProject CurrentProject Объект из библиотек и DAO Является объектом самого верхнего уровня в объектной модели DAO. Новый объект Ссылается на программный проект (представляющий собой совокупность всех программных модулей, включая стандартные модули и модули классов) текущей базы данных или проекта Microsoft Access. Новый объект Этот объект содержит семейства объектов AccessObjects, соответствующих реальным объектам базы данных или проекта: AllForms, AUReports, AUMacros, AllModules, AllDataAccessPages. Перечисленные семейства содержат все реальные объекты БД независимо от того, открыты они или закрыты в данный момент Позволяет использовать объекты доступа к данным в приложении Access CurrentData Новый объект Ссылается на объекты, сохраненные приложением — источником данных (ядром Jet или SQL-сервером) в текущей базе данных. Содержит семейства объектов AccessObject: AllTables, AllQueries, AllViews, AllSto-redProcedures, AllDatabaseDiagrams. Перечисленные семейства содержат все реальные объекты БД, независимо от того, открыты они или закрыты в данный момент CodeData Новый объект Controls Семейство AllTables, AllQueries, AllViews, AllStoredProcedures, AllDatabase-Diagrams. Перечисленные семейства содержат все реальные объекты базы данных независимо от того, открыты они или закрыты в данный момент Содержит объекты Control, представляющие собой все элементы управления в конкретных форме, отчете или секции. Это семейство является свойством объектов Form, Report, Section и Control Control Объект Format Conditions Новое семейство Format Condition Новый объект All Forms Новое семейство AllReports Новое семейство AllDataAccessPag Новое es семейство Представляет собой любой конкретный элемент управления в форме, отчете или секции. Может ссылаться на один из объектов, характеризующих элемент управления определенного типа: CheckBox, TextBox, Combo Box, Command Button, CustomControl, BoundObjectFrame, Image, ListBox, ObjectFrame, OptionButton, Option-Group, Page, Section, SubForm, TogleButton Содержит объекты FormatCondition и представляет собой набор форматов по условию для объектов Text-Box и ComboBox Представляет собой форматирование по условию, определенное для элемента управления типа поле ввода (объект TextBox) или список с полем ввода (объект ComboBox) Содержит объекты AccessObject и представляет собой все формы в объектах CurrentProject и Code Project Содержит объекты AccessObject и представляет собой все отчеты в объектах CurrentProject и CodeProject доступа к данным в объектах Cur-rentProject и CodeProject All Macros Новое семейство Содержит объекты AccessObject и представляет собой все макросы в объектах CurrentProject и CodeProject All Modules Новое семейство Содержит объекты AccessObject и представляет собой все профаммные модули в объектах Current-Project и CodeProject AllTables Новое Содержит объекты AccessObject и представляет собой все таблицы в объектах CurrentData и Code Data семейство AllQueries Новое семейство All Views Новое семейство Содержит объекты AccessObject и представляет собой все запросы в объектах CurrentData и Code Data. При этом количество запросов в проекте Access должно равняться нулю Содержит объекты AccessObject и характеризует все представления в объектах CurrentData и Code Data. При этом количество представлений в базе данных Access должно равняться нулю AllStoredProcedu Новое res семейство AllDatabaseDiagr Новое ams семейство AccessObject Новый объект AccessObject Новый объект AccessObjectPro- Новое perty семейство Содержит объекты AccessObject и представляет собой все хранимые процедуры в объектах CurrentData и Code Data. При этом количество хранимых процедур в базе данных Access должно равняться нулю Содержит объекты AccessObject и представляет собой все схемы базы данных в объектах CurrentData и CodeData. При этом количество схем базы данных в БД Access должно равняться нулю Ссылается на реальный объект Wicrosoft Access в любом из следуюцих семейств: AllForms, AllReports, \llMacros, AllModules, AllDataAccessPages, AllTables. AllViews, All Stored Procedures, All-DatabaseDiagrams. В зависимости от того, к какому семейству он принадлежит, представляет собой любой из объектов Access — таблицу (Table), запрос (Query), отчет (Report), форму (From), модуль (Module), макрос (Macro), страницу доступа к данным (Dataaccess page), объекты представление (View), хранимую процедуру Содержит настраиваемые (Stored procedure) или схему базы данных (Database diagram). семейства AccessObjectProperty, описывающие свойства и однозначно Объект AccessObject ссылается объекты: на существующий объект базы данных. характеризующие конкретные AccessObject, Code-Data, При этом нельзя создать или новый или удалить существующий объект CodeProject, CurrentData CurrentProject AccessObject