
- •Предисловие
- •1. Основы программирования в Microsoft Office
- •1.2. Что такое язык VBA
- •1.3. Макрорекордер: быстрое создание макросов
- •1.4. Четыре способа запуска макроса
- •2.1. Общие сведения
- •2.3.1. Как открыть редактор кода и как он устроен
- •2.3.2. Список объектов и список событий
- •2.3.3. Закладки и разделение окна редактирования
- •2.3.4. Как редактор помогает писать код
- •2.4. Работа со справкой
- •3. Синтаксис и программные конструкции VBA
- •3.1. Основы синтаксиса
- •3.2. Операторы
- •3.3. Переменные и типы данных
- •3.4. Константы
- •3.5. Операторы условного и безусловного перехода
- •3.5.2. Оператор Select Case
- •3.5.3. Оператор GoTo
- •3.6. Работа с циклами
- •3.7. Массивы
- •3.8. Процедуры и функции
- •3.8.1. Виды процедур
- •3.8.2. Область видимости процедур
- •3.8.3. Объявление процедур
- •3.8.4. Передача параметров
- •3.8.5. Вызов и завершение работы процедур
- •3.9. Встроенные функции языка VBA
- •3.9.1. Что такое встроенные функции
- •3.9.2. Функции преобразования и проверки типов данных
- •3.9.3. Строковые функции
- •3.9.4. Функции для работы с числовыми значениями
- •3.9.5. Функции для работы с датой и временем
- •3.9.6. Функции для форматирования данных
- •3.9.7. Функции для организации взаимодействия с пользователем
- •3.9.9. Функции для работы с массивами
- •3.9.10. Функции для работы с файловой системой
- •3.9.11. Другие функции VBA
- •4. Работа с объектами и объектные модели
- •4.1. Что такое классы и объекты
- •4.2. Создание и удаление объектов
- •4.3. Методы объекта
- •4.4. Свойства объекта
- •4.6. Просмотр объектов
- •4.7. Объектные модели
- •5. Формы, элементы управления и события
- •5.1. Для чего нужны формы
- •5.2. Создание форм и самые важные свойства и методы форм
- •5.3. Элементы управления
- •5.3.1. Что такое элемент управления
- •5.3.2. Элемент управления Label
- •5.3.3. Элемент управления TextBox
- •5.3.4. Элемент управления ComboBox
- •5.3.5. Элемент управления ListBox
- •5.3.7. Элементы управления OptionButton и Frame
- •5.3.8. Элемент управления CommandButton
- •5.3.9. Элементы управления ScrollBar и SpinButton
- •5.3.10. Элементы управления TabStrip и MultiPage
- •5.3.11. Элемент управления Image
- •5.3.12. Применение дополнительных элементов управления
- •6. Отладка и обработка ошибок в программе
- •6.1. Типы ошибок
- •6.2.1. Тестирование
- •6.2.2. Переход в режим паузы
- •6.2.3. Действия в режиме паузы
- •6.2.4. Окно Immediate
- •6.2.5. Окно Locals
- •6.2.6. Окно Watches
- •6.3. Перехват и обработка ошибок времени выполнения
- •7. Работа с помощником
- •8. Работа с панелями инструментов и меню
- •9.1. Зачем нужно работать с базами данных
- •9.2. Что такое ADO
- •9.3. Объект Connection и коллекция Errors
- •9.4. Подключение к таблице на листе Excel
- •9.5. Объект Recordset и коллекция Fields
- •9.5.1. Открытие Recordset
- •9.5.3. Перемещение по Recordset
- •9.5.4. Коллекция Fields и объекты Field
- •9.5.5. Сортировка и фильтрация данных
- •9.5.6. Изменение записей на источнике при помощи объекта Recordset
- •9.5.7. Прочие свойства и методы объекта Recordset
- •10. Программирование в Word
- •10.1. Зачем программировать в Word
- •10.3. Объект Application
- •10.3.1. Как работать с объектом Application
- •10.3.2. Свойства, методы и события объекта Application
- •10.4. Коллекция Documents и объекты Document
- •10.4.1. Как работать с коллекцией Documents
- •10.4.2. Свойства и методы коллекции Documents
- •10.4.3. Работа с объектом Document, его свойства и методы
- •10.5. Объекты Selection, Range и Bookmark
- •10.5.1. Работа с объектом Selection
- •10.5.2. Свойства и методы объекта Selection
- •10.5.3. Работа с объектом Range, его свойства и методы
- •10.5.4. Объект Bookmark
- •10.6. Другие объекты Word
- •10.6.1. Коллекция AddIns и объекты AddIn
- •10.6.2. Объект AutoCorrect
- •10.6.3. Коллекция Languages и объект Language
- •10.6.4. Объект Options
- •10.6.5. Объекты Find и Replacement
- •10.6.6. Объекты Font и ParagraphFormat
- •10.6.7. Объект PageSetup
- •10.6.8. Объекты Table, Column, Row и Cell
- •10.6.9. Объект System
- •10.6.10. Коллекция Tasks и объект Task
- •10.6.11. Коллекция Windows и объект Window
- •11. Программирование в Excel
- •11.1. Зачем программировать в Excel
- •11.2. Объект Application
- •11.3. Свойства и методы объекта Application
- •11.4. Коллекция Workbooks и объект Workbook, их свойства и методы
- •11.5. Коллекция Sheets и объект Worksheet, их свойства и методы
- •11.6. Объект Range, его свойства и методы
- •11.7. Коллекция QueryTables и объект QueryTable
- •11.9. Работа с диаграммами (объект Chart)
- •11.10. Другие объекты Excel
- •12. Программирование в Access
- •12.1. отличительные особенности создания приложений в Access
- •12.2. Основные этапы создания приложений в Access
- •12.4. Макрокоманды и объект DoCmd
- •12.5. Работа с формами Access из VBA (объект Form)
- •12.6. Свойства, методы и события форм
- •12.7. Работа с отчетами (объект Report)
- •13. Программирование в Outlook
- •13.1. Зачем программировать в Outlook
- •13.2. Некоторые особенности программирования в Outlook
- •13.4. Объект Namespace
- •13.5. Коллекция Folders и объект MAPIFolder
- •13.7. Другие объекты Outlook
- •14. Программирование в PowerPoint
- •15. Программирование в Project
- •15.1. Основы программирования в Project Professional. Объект Application

ГЛАВА 4
Работа с объектами и объектные модели
В предыдущей главе вы познакомились с синтаксическими конструкциями и встроенными функциями языка VBA, но с одними встроенными функциями много не сделаешь. Вся функциональность программ VBA, работающих в приложениях Microsoft Office, полностью построена на работе с классами и объектами.
Объектно-ориентированное программирование — это отдельная очень большая тема, которой посвящено множество книг. В этой главе будут рассмотрены только те моменты, которые важны с точки зрения практической работы при программировании в среде Microsoft Office.
4.1. Что такое классы и объекты
Классы формально определяются как блоки функциональности, которые можно использовать в программах. Для наших целей их можно считать "чертежами" для создания объектов. На основе этих "чертежей" создаются экземпляры классов — объекты. Для простоты можно представить себе, что в оперативной памяти компьютера по чертежу построили дом — объект, с которым можно что-то делать.
Наборы чертежей (в терминологии программирования — коллекции классов) обычно называются библиотеками типов. В Windows они "упаковываются" в файлы DLL или OCX (иногда и в файлы других типов, например, EXE или TLB). Такие библиотеки типов откомпилированы — чертежи из них можно использовать, но просмотреть их (т. е. просмотреть исходный код класса) нельзя, для такой ситуации существует специальный термин — технология "черного ящика".
Чаще всего в программе VBA создается объект определенного класса (поанглийски это называется instantiation, создание экземпляра — instance), и
Работа с объектами и объектные модели |
89 |
далее работа производится с этим объектом. В одной программе вполне можно использовать несколько разных объектов одного и того же класса.
В этой книге рассказывается только про использование в программах объектов, созданных на основе уже готовых чертежей (которые приготовили для вас разработчики Microsoft Office). Создание своих собственных классов — это отдельная большая тема, которая выходит за рамки данной книги.
4.2. Создание и удаление объектов
Создание объекта в VBA может производиться разными способами. Самый простой способ выглядит так:
Dim oApp As Object
Set oApp = CreateObject("Word.Application")
MsgBox oApp.UserName
Это так называемое позднее связывание (late binding). Вначале мы объявляем переменную oApp с возможностью ссылаться на любой объект, а затем присваиваем ей ссылку на создаваемый нами объект Word.Application. Такое позднее связывание хуже с точки зрения производительности и расхода оперативной памяти, кроме того, редактор Visual Basic отказывается нам подсказывать, какие свойства и методы есть у этого объекта. Поэтому позднее связывание имеет смысл использовать только тогда, когда вы собираетесь хранить в этой переменной, согласно логике вашей программы, объекты разных типов. В остальных ситуациях предпочтительнее использовать раннее связы-
вание (early binding):
Dim oApp As Word.Application
Set oApp = CreateObject("Word.Application")
MsgBox oApp.UserName
В этом случае мы сразу присваиваем переменной oApp тип Word.Application, а потом присваиваем ей ссылку на создаваемый нами объект. Можно обойтись и без второй строки:
Dim oApp As New Word.Application
MsgBox oApp.UserName
Однако ключевое слово New не может использоваться при создании зависимых объектов, с ключевым словом WithEvents и при создании переменных встроенных типов (String, Integer и т. п.), поэтому иногда необходимо использовать только объявление с Set. Кроме того, в языке VBScript синтаксической конструкции New нет, поэтому если вы собираетесь использовать оба языка, лучше сразу привыкать к конструкции CreateObject(). Но поскольку

90 Глава 4
конструкция с New короче, в VBA традиционно чаще используется именно она.
Еще одна возможность создания объекта — воспользоваться методом другого объекта, который создаст нужный нам объект и возвратит ссылку на него напрямую или через коллекцию:
Dim oApp As New Word.Application oApp.Documents.Add
Dim oDoc As Word.Document Set oDoc = oApp.Documents(1) oDoc.SaveAs "C:\docvba1.doc"
В этом примере мы вначале создаем объект Word.Application, затем при помощи метода Add() коллекции Documents создаем в этой коллекции новый документ, потом получаем на него ссылку для переменной oDoc, а потом вызываем метод SaveAs() созданного нами объекта документа.
Удаление объектов производится очень просто:
Set Объектная_переменная = Nothing
например:
Set oDoc = Nothing
В принципе, объект можно и не удалять — он будет удален автоматически после того, как последняя объектная переменная, которая на него ссылается, уйдет за область видимости (обычно когда закончит работу процедура, в которой он используется). Однако явное удаление объектов — это "правило хорошего тона", которое позволит вам при создании серьезных приложений избежать конфликтов имен и перерасходования ресурсов.
Еще один момент, связанный с удалением объектов. Не все объекты можно удалить при помощи синтаксической конструкции Nothing. Некоторые объекты требуют, чтобы их удаляли из памяти специальным способом. Например, для удаления из памяти объекта приложения Word, который мы создавали в нашем примере, нужно обязательно вызвать его метод Quit(), иначе он выдаст сообщение об ошибке.
4.3. Методы объекта
Как правило, объект нам нужен для того, чтобы воспользоваться его методами, свойствами или событиями.
Метод — это именованный набор действий, которые может выполнять данный объект. Он может выполнять какие-либо операции, принимать и возвращать значения.
Работа с объектами и объектные модели |
91 |
Существует три способа вызова метода. Самый простой способ выглядит так:
Объект.Метод
например:
oDoc.Activate
При этом не возвращаются и не принимаются никакие параметры. Второй способ:
Объект.Метод параметр1 [, параметр2, ... , параметрN]
Параметры передаются путем перечисления через запятую. Например:
oDoc.SaveAs "C:\doc12.doc"
В этом случае мы игнорируем то, что возвращает метод и поэтому круглые скобки не нужны.
Третий способ:
Переменная = Объект.Метод(параметр1 [, параметр2, ... , параметрN])
например:
Dim nCent
nCent = oApp.CentimetersToPoints(10) MsgBox nCent
В этом случае значение, которое возвращает метод, присваивается переменной. При этом использовать круглые скобки для передаваемых параметров обязательно. Даже если никакие параметры не передаются, круглые скобки все равно обязательны:
Переменная = Объект.Метод()
4.4. Свойства объекта
Свойства объекта — это возможность получения доступа к информации, которая хранится в этом объекте. Через свойства можно получить эту информацию или изменить ее.
Извлечь информацию можно при помощи синтаксиса:
Переменная = Объект.Свойство
например:
sName = oApp.UserName
92 |
Глава 4 |
Изменить информацию в объекте при помощи свойства можно так:
Объект.Свойство = Значение
например:
oApp.ActivePrinter = "HP LaserJet 4"
Значение может быть:
обычной константой (10 или "HP LaserJet 4"); простым выражением (10 + 5); свойством другого объекта:
Объект1.Свойство = Объект2.Свойство
возвращаемым значением какого-либо метода:
Объект1.Свойство = Объект2.Метод()
Конечно, значения не всех свойств можно изменять. Некоторые свойства доступны только для чтения, другие — для чтения и записи, третьи (очень редко) — только для записи.
4.5. События объекта
и объявление WithEvents
Событие — это действие, распознаваемое объектом, для которого можно запрограммировать отклик. Например, в качестве события можно использовать открытие или закрытие документа, щелчок мыши, нажатие клавиши. События запрятаны в глубь объектов и настоятельно рекомендуется их использовать уже рассмотренным нами способом — через выбор нужного объекта и его события в окне редактора кода Visual Basic. Однако в некоторых ситуациях события для объектов не появляются в окне редактора кода (например, это справедливо для очень важного объекта Application). В этом случае необходимо явно объявить этот объект с событиями — при помощи ключевого слова WithEvents, например, так:
Public WithEvents App As Word.Application
Делается это в области объявлений модуля. После этого в редакторе кода Visual Basic появляется новый объект App со всеми необходимыми событиями.
Подробно работу с событиями мы рассмотрим в следующей гл. 5, которая будет посвящена работе с формами и графическими элементами управления: кнопками, флажками, переключателями и т. п. Нам достаточно выбрать в списке объектов (левый верхний список в окне редактора кода) нужный гра-