- •Основы офисного программирования и язык 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
- •Наследование интерфейсов
- •Полиморфизм семейства классов
- •Проект "Люди и Машины"
Активные объекты и метод Activate
Объект Selection является примером косвенной адресации. Он задает некоторую выделенную область, и его свойства и методы позволяют изменять состояние этой области. Другой пример косвенной адресации - активные элементы. Как в подокне может быть только один выделенный элемент, так и активный элемент может быть единственным в своем классе - одно активное окно, один активный документ или рабочий лист. Обычно активный элемент находится в фокусе клавиатуры, именно ему направлен ввод пользователя. Сделав активным новый элемент, мы отменяем, деактивируем элемент, ранее находившийся в фокусе клавиатуры.
Метод Activate делает активным элемент, его вызвавший. Этим методом обладают элементы верхних уровней иерархии: Application, Window, Pane, Document, WorkBook, Worksheet, Chart и др. В приложениях Word и PowerPoint эти объекты обладают также булевым свойством Active, имеющим статус "только для чтения". При активизации объекта свойство Active получает значение True, при деактивации - False. Значение свойства позволяет понять, в каком состоянии находится тот или иной объект этих приложений.
Чтобы обратиться к выделенному объекту, достаточно иметь одно глобальное свойство Selection, поскольку в каждый текущий момент существует только один выделенный элемент. Активных элементов одновременно существует несколько, по одному в каждом классе. Поэтому для обращения к активному элементу надо указывать его класс. Поэтому для каждого класса имеется свое глобальное свойство. Чтобы обратиться к активному элементу некоторого класса Z, нужно вызвать соответствующее глобальное свойство ActiveZ, например ActiveDocument или ActiveWindow. В наших примерах мы неоднократно уже использовали обращение к активному документу - ActiveDocument. Рассмотрим еще один пример, в котором пользователь в приложении Excel выбирает рабочий лист. В зависимости от его выбора активизируется указанный лист, и в двух первых ячейках появляется приветствие, текст которого также зависит от выбора пользователя:
Public Sub Actis()
Dim Answer As Integer
Answer = InputBox(Prompt:="Выберите номер страницы для Вашей работы(1/2/3)", _ Default:=1)
'Активизирует рабочий лист, выбранный пользователем
ActiveWorkbook.Sheets(Answer).Activate
'Работа с активным листом
ActiveSheet.Cells(1, 1) = "Привет,"
Select Case Answer
Case 1: ActiveSheet.Cells(1, 2) = "Михаил!"
Case 2: ActiveSheet.Cells(1, 2) = "Владимир!"
Case Else: ActiveSheet.Cells(1, 2) = "Люди!"
End Select
End Sub
На этом мы заканчиваем первое знакомство с общеупотребительными объектами Office 2000. В заключение мы хотим рассказать уже не о каких-либо конкретных объектах, а об удивительном программном средстве, позволяющем работать с ними. Речь пойдет о Macrorecorder.
Macrorecorder
Ничего удивительного в Macrorecorder нет. Его появление - естественное следствие объектно-ориентированного, событийно-управляемого и визуального программирования. Интерфейс большинства приложений теперь строится так, чтобы дать конечному пользователю как можно больше свободы выбора по управлению работой этого приложения. Пользователь "видит" объекты приложения (их образы). Он может выбирать в меню команды, может щелкнуть ту или иную кнопку, перемещать по экрану объекты, менять их размеры и другие характеристики, открывать и закрывать окна - да мало ли что может теперь делать пользователь! Его действия являются причиной событий в мире объектов. Возникает событие, - объектам посылается сообщение, - в ответ вызывается метод, обрабатывающий это сообщение.
Так возникает двойственность. Одни и те же вещи можно сделать и визуально, и программно - эффект будет один. Большинство приложений Office 2000, и в первую очередь Word и Excel, рассчитаны на визуальный способ работы с ними. Но программистов не обманешь - они-то знают, что всякий раз, когда пользователь визуально инициирует действие, вызывается программа, выполняющая это действие. Дело в том, что система следит за действиями пользователя, анализирует их и запускает программы, соответствующие этим действиям. Иначе говоря, происходит трансляция с языка действий в язык программирования. Поскольку этот язык объектный, то можно говорить, что действия пользователя (события) интерпретируются и приводят к вызову методов и изменению свойств в мире объектов. Поскольку есть интепретатор действий, то можно построить и транслятор.
Macrorecorder - это и есть транслятор. Всякий раз, когда пользователь запускает Macrorecorder, создается программа (макрос) на языке VBA, которая является результатом трансляции действий пользователя с момента запуска Macrorecorder до момента окончания записи макроса. Пользователь оперирует с образами объектов на экране, программа - с объектами Office 2000. Заметьте: одного и того же эффекта, пользователь иногда может достичь разными путями - он может вызвать команду меню или щелкнуть соответствующую кнопку или нажать комбинацию "горячих" клавиш. С этими разными событиями может связываться одна и та же процедура обработки. Поэтому созданная Macrorecorder программа в таких случаях будет одинаковой, не зависящей от того, как пользователь добился нужного ему эффекта.
На сегодня Macrorecorder не очень "интеллектуален" - он слепо копирует действия пользователя и не занимается оптимизацией созданной им программы. Так, если пользователь записал в ячейку А1 число 15, в А2 - 17, а потом передумал и решил вернуться к ячейке А1 и заменить 15 на 21, то Macrorecorder в программе повторит все его действия. "Любимый" объект Macrorecorder - Selection, и это понятно: всякий раз, когда пользователь выбирает новый объект, Macrorecorder создает новый объект Selection. Сегодня типична ситуация, когда программист использует макрос, созданный Macrorecorder, как заготовку, оптимизируя код вручную. Думается, интеллект Macrorecorder повысится в следующих версиях. Но и сейчас это крайне полезное средство. Office 2000 позволяет чрезвычайно просто решить вручную массу задач (в этом вся его суть). Вместе с тем необходимость в решении таких задач может возникать неоднократно, и потому полезно иметь соответствующую программу. Так что технология такова: один раз задача решается вручную, Macrorecorder создает макрос, транслируя наши действия, затем макрос, если надо, оптимизируется и запускается всякий раз, когда возникает необходимость решения данной задачи.
Завершим описание примером. Наиболее удобен для демонстрации Excel, - именно здесь вручную можно решать очень необычные задачи. Поэтому и Macrorecorder интенсивнее всего используется в Excel. Хотя, привыкнув, Вы будете применять его и в других приложениях Office 2000. Рассмотрим написание в Excel программы, создающей последовательность первых N чисел Фибоначчи, - типичная задача для студентов первого курса, изучающих программирование. В ней есть рекуррентные соотношения, цикл, она требует понимания понятия "переменная". Рекуррентные соотношения для получения чисел Фибоначчи таковы:
A1 = 1; A2 = 2; A k= A k-1 + A k-2; k = 3…N;
увеличить изображение Рис. 1.11.
Вот как мы решали эту задачу вручную ( рис. 1.11). Вначале вызвали Macrorecorder, выбрав в меню Tools пункт Macro, затем - Record New Macro (проще щелкнуть кнопку начала записи макроса, если она есть на панели). В появившемся диалоговом окне задали имя макроса - Fibonachi. Заметьте: появляется кнопка окончания записи макроса, если ее не было на соответствующей панели. Теперь наши дальнейшие действия будут транслироваться в соответствующую программу. В ячейку А1 мы записали текст "Числа Фибоначчи", в ячейки А2 и А3 - числа 1 и 2, в ячейку А4 - формулу "= А2+А3", а затем скопировали эту формулу до ячейки А20 включительно. По ходу копирования формула пересчитывалась, и в ячейках появлялись значения, соответствующих чисел Фибоначчи. Затем мы, щелкнув кнопку, выключили запись макроса. Результаты действий - на рис. 1.7. Созданный Macrorecorder макрос Fibonachi теперь доступен, и его можно вызывать в любой момент. Вот его текст:
Sub Fibonachi()
'
' Fibonachi Macro
' Macro recorded 28.02.1999 by Vladimir Billig
Selection.Font.Bold = True
ActiveCell.FormulaR1C1 = "Числа Фибоначчи"
Range("A2").Select
ActiveCell.FormulaR1C1 = "1"
Range("A3").Select
ActiveCell.FormulaR1C1 = "2"
Range("A4").Select
ActiveCell.FormulaR1C1 = "=R[-2]C+R[-1]C"
Selection.AutoFill Destination:=Range("A4:A20"), Type:=xlFillDefault
Range("A4:A20").Select
End Sub
В созданном макросе используются уже известные нам объекты: Range, Selection, ActiveCell и метод Select объекта Range. В комментариях нуждается свойство ячеек Excel - FormulaR1C1, - позволяющее связать с ячейкой значение или формулу (для ячейки А4), заданную в относительных координатах R (Row - строка) и C (Column - столбец). Отсчет координат ведется от активной ячейки, поэтому для ячейки А4 формула "=А2 +А3" в этих координатах принимает вид: "=R[-2]C+R[-1]C ". Основная операция копирования не потребовала организации цикла в программе. Этот цикл реализован внутри метода AutoFill, вызванного для объекта Selection. Два параметра этого метода Destination и Type задают область и тип копирования. В оптимизации этот макрос не нуждается
Ранее мы говорили, что браузер объектов - это Ваш неизменный спутник и помощник в процессе программистской работы. Другим таким же полезным помощником является Macrorecoder!
Дело даже не в том, чтобы получить макрос для многократного использования, - Вы и сами его можете написать. Но часто возникает ситуация, когда Macrorecoder запускается для того, чтобы понять, какие объекты и какие методы следует использовать для решения той или иной задачи. Например, Вы могли бы не знать, как скопировать формулу в соседние ячейки, чтобы она корректно изменилась при копировании. Макрос Fibonachi подсказал бы Вам, что для этого следует использовать метод AutoFill. Заодно Вы бы поняли, что в область копирования (destination) должен быть включен и источник копирования. Так что не забывайте Macrorecoder - это Ваше подручное средство.
На этом мы заканчиваем предварительное знакомство с объектами Office 2000 и переходим к систематическому изучению самого языка программирования VBA.
Программный код большинства примеров данной лекции можно найти в проектах, доступных для просмотра: BookOne, BookTwo, BookThree, DocOne, DocFour.