Основы офисного программирования и язык VBA

         

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.


Содержание раздела