- •Основы офисного программирования и язык vba
- •Офисное программирование
- •Состав Office 2000
- •Инсталляция Office 2000
- •Содержимое диска "Resource Kit"
- •Документ Issues
- •Документ ork9
- •Папка Tools
- •Содержимое диска "Language Pack"
- •Об этой книге и ...
- •Моя благодарность
- •Vba и объекты. Обзор
- •Библиотека объектов Office 2000 - каркас приложений
- •Встраивание вместо наследования
- •Построение каркаса документа
- •Библиотека объектов Office 2000 и Object Browser
- •Объекты Application
- •Свойства-участники
- •Вторая группа терминальных свойств
- •Методы объектов Application
- •События объектов Application
- •Совместная работа приложений. Создание объектов Application. Раннее и позднее связывание
- •Коллекции в Office 2000
- •Коллекции объектов Office 2000
- •Коллекции Excel: Workbooks, Sheets
- •Коллекция Workbooks
- •Коллекция Sheets
- •Коллекции Word: Documents, Paragraphs и другие
- •Коллекция Documents
- •Коллекция Paragraphs
- •Коллекция Sections
- •Коллекции Characters, Words, Sentences
- •Коллекции и конструкция For Each … Next
- •Объекты Range
- •Что определяет объект Range?
- •Метод Range
- •Объекты Selection
- •Метод Select и свойство Selection
- •Активные объекты и метод Activate
- •Проектирование документов
- •Документ и его программный проект
- •Модули - обработчики событий
- •Стандартные модули
- •Модули классов
- •Модуль макросов
- •Структура модуля. Окно проекта и Окно кода
- •Окно проекта
- •Свойства проекта
- •Имя проекта
- •Защита проекта
- •Окно кода
- •Еще раз о "переиспользовании" модулей
- •Проект и область видимости
- •Система документов и ее проект
- •Организация системы документов
- •Как организуются ссылки между проектами
- •Обмен информацией между документами
- •Система документов One - Two - Three
- •Типы данных
- •Простые типы данных.
- •Объявление переменных и констант простых типов
- •Синтаксис объявления простых переменных
- •Объявления по умолчанию
- •Константы
- •Массивы
- •Динамические массивы
- •Записи и тип, определенный программистом
- •Что можно делать с записями?
- •Раздел объявлений
- •Раздел опций
- •Разделы констант, типов и переменных
- •Раздел Declare
- •Правила именования
- •Типы и классы Еще раз о понятии "класс"
- •Что нового в классах "Office 2000"
- •Создание класса "Личность"
- •Объекты и переменные
- •Объекты, класс которых определен пользователем.
- •Объекты "родного" приложения
- •ActiveX-объекты
- •Модуль класса Свойства
- •Сокрытие свойств
- •Конструкторы и деструкторы. Стандартные события
- •Стандартные события Initialize и Terminate
- •Два конструктора класса Rational
- •Процедуры - свойства
- •Как создаются процедуры- свойства
- •Синтаксис Let, Get и Set
- •Классы, как упаковка
- •Семейство классов и процедуры - свойства
- •Friend методы
- •События
- •Классы, объекты With Events и обработчики событий
- •Модуль класса с объектом WithEvents
- •Объект WithEvents
- •События собственных классов
- •Как создать класс с событиями
- •Как зажигаются события
- •Где и как следует создавать обработчики событий для экземпляров класса
- •Связывание объектов
- •Реальные объекты и инициирование событий
- •Семейство классов и реализация интерфейсов
- •Наследование
- •Виртуальные методы и полиморфизм
- •Абстрактные классы
- •Наследование и полиморфизм в Office 2000
- •Наследование интерфейсов
- •Полиморфизм семейства классов
- •Проект "Люди и Машины"
События объектов Application
У объекта Access.Application событий нет. Все события вынесены на более низкий уровень иерархии и возникают при работе с документами Access - отчетами, формами и т.д.
Объекты Application приложений Word, Excel и Power Point имеют примерно одинаковый набор событий. Фактически эти события возникают при работе с объектами нижних уровней иерархии - окнами, документами Word, рабочими книгами и страницами (Sheets) Excel, презентациями и слайдами Power Point. Всякий раз, когда окно или тот или иной документ создается, открывается, изменяется, закрывается, - возникает соответствующее событие, которое можно обработать. Обработчик события можно связывать непосредственно с самим объектом, при работе с которым событие возникло. Но иногда удобнее вынести обработчик на верхний уровень приложения и связать его с объектом Application. Это особенно полезно, если один и тот же обработчик применяется ко всем документам приложения.
Совместная работа приложений. Создание объектов Application. Раннее и позднее связывание
Мы уже не раз говорили, что эффективность работы в среде Office 2000 во многом определяется возможностью совместной работы его приложений. С программистской точки зрения это означает, что в документе одновременно определены несколько объектов Application, задающих совместно работающие приложения. Давайте рассмотрим, как обеспечивается такая возможность. При открытии какого - либо из приложений, например, документа Word по умолчанию считается определенным соответствующий объект Application, а следовательно и все объекты, в него вложенные. Более того, определены и все объекты, входящие в каркас документа, построенный по умолчанию.
Если мы хотим обеспечить совместную работу приложений, например, Word, Excel и Access, то можно начинать работу с открытия документа любого из этих приложений, и тогда корневой объект Application этого приложения будет доступен автоматически. Остальные объекты Application необходимо подключить к уже открытому документу. Пусть для определенности мы открыли документ Word и хотим подключить Excel и Access. Вот, что для этого нужно сделать:
-
Расширить каркас документа Word, установив ссылки на библиотеки, содержащие приложения Excel и Access . Напомним, что это делается в редакторе VBE в окне References меню Tools.
-
Объявить объекты (указатели на объекты) соответствующего класса.
-
Создать объекты и связать указатели с вновь созданными объектами.
Когда корневой объект Application создан и доступен, то автоматически становятся доступными все вложенные в него объекты, так что теперь с приложением можно работать в обычном режиме, вызывая свойства и методы его объектов. При объявлении объектов возможны варианты. При этом следует помнить, что объекты в VBA задаются с помощью указателей. Рассмотрим три возможных варианта объявления:
-
Dim MyXlApp As Object, MyAcApp As Object Этот вариант задает так называемое позднее связывание. На этапе объявления известно, что MyApp переменные являются объектами, а точнее, указателями на объекты, но еще не известно с объектами какого класса они будут связаны. Это станет известно динамически, в ходе выполнения программы, когда реально будет создан объект - экземпляр соответствующего класса и наш указатель получит на него ссылку. Для программиста эти переменные являются нетипизированными указателями.
-
Dim MyXlApp As Excel.Application, MyAcApp As Access.Application Это объявление задает раннее связывание. Наши переменные теперь представляют собой типизированные указатели. И уже на этапе объявления известно, что в дальнейшем они будут связаны с объектами соответствующего класса. Чтобы при этом объявлении не возникло конфликтов, конечно же, необходимо предварительно подключить соответствующую библиотеку. Важно также понимать, что на этапе объявления память выделена только указателям. Сами объекты еще не созданы, и потому значения указателей не определены. Объекты еще предстоит создать по ходу выполнения программы и указатели должны быть связаны с ними.
-
Dim MyXlApp As New Excel.Application, MyAcApp As New Access.Application В этом случае раннее связывание реализуется в полном объеме. Создается указатель, благодаря спецификатору New создается сам объект, и указатель получает ссылку на вновь созданный объект.
Эти три варианта характерны не только при работе с объектами Application, а во всех случаях работы с объектами. Конечно же, в большинстве случаев предпочтительнее третья конструкция, когда создание объекта и указателя совмещаются в одном операторе. В Office 2000 такая конструкция является допустимой для объектов Application и ее разумно использовать.
Заметьте, что не все приложения допускают конструкцию New для создания Active X объектов, каковыми являются объекты Application. В ряде случаев для создания Active X объектов, хранящихся в отдельных файлах, следует использовать метод CreateObject, первый параметр которого задает имя класса объекта. Этот метод следует выполнить в нужный момент, связав заодно указатель с вновь созданным объектом. Конечно, и в Office 2000 допустимо создать объекты Application следующим образом:
Set MyXlApp = CreateObject("Excel.Application ")
Set MyAcApp = CreateObject("Access.Application ")
Теперь еще несколько общих слов о раннем и позднем связывании. Раннее связывание предпочтительнее по двум важным причинам: оно обеспечивает более быструю работу приложения и интеллектуальную поддержку при работе с объектом. Последнее означает, что появляется список доступных свойств и методов, как только ставится точка после имени объекта. При позднем связывании такая поддержка отсутствует, так как класс объекта не известен на этапе трансляции до начала выполнения программы. Следует заметить, что VBA не является чисто интерпретируемым языком. На этапе трансляции до выполнения программы проверяется наличие ошибок в программе, проводится распределение памяти и обеспечивается интеллектуальная поддержка объявленным переменным.
В заключение рассмотрим пример, иллюстрирующий работу трех приложений: Word, Excel и Access:
Public Sub WorkWithExcel()
'НЕ забудьте включить ссылку на Excel в меню References
'Объявление и создание объектов Excel.Application
Dim MyXlApp As New Excel.Application
'Работа с приложением Excel
With MyXlApp
.Visible = True
'Excel появился на линейке и его можно раскрыть
'Добавить новую книгу
.Workbooks.Add
'Теперь можно работать и с ячейками данной книги
.Range("A1") = "Hello!"
'Идет работа с книгой
.Range("B1") = "By-By"
.Workbooks(1).Activate
'Закрываем открытую книгу
MsgBox ("Закрываем рабочую книгу Excel?")
.Workbooks(1).Close
'Будет задан вопрос о необходимости сохранения книги
'Закрываем приложение
.Quit
End With
End Sub
Public Sub WorkWithAccess()
'НЕ забудьте включить ссылку на Access и Dao 3.6 в меню References
'Приложение Access и его компоненты:
'База данных, форма и путь к базе
Dim MyAc As New Access.Application
Dim MFDb As Database
Dim FormPoetAges As Form
Dim PathDb As String
'Открываем базу данных Access
PathDb = "E:\O2000\CD2000\Ch1\AgeOfPoet.mdb"
MyAc.OpenCurrentDatabase (PathDb)
Set MFDb = MyAc.CurrentDb
'Открываем форму
MyAc.DoCmd.OpenForm ("AgeOfPoets")
Set FormPoetAges = MyAc.Forms("AgeOfPoets")
MyAc.Visible = True
FormPoetAges.SetFocus
'Закрываем базу данных
MsgBox ("Закрываем базу данных Access?")
MyAc.Quit
End Sub
Пример 1.2. (html, txt)
Макросы WorkWithExcel и WorkWithAccess могут быть вызваны из приложения Word. В наших тестовых примерах мы вызывали их в ответ на щелчок соответствующих командных кнопок. Заметьте, второй пример довольно содержателен. Здесь показано, как, не выходя из документа Word, просматривать и редактировать данные формы, созданной в приложении Access для работы с базой данных.
На этом мы прервем знакомство с корневыми объектами Application. Помните, явно или неявно они всегда будут присутствовать в наших примерах.