Выбрать главу

Приведенный ниже код проводит поиск абзацев, которым в данный момент назначен стиль Drab, после чего назначает им стиль Frilly:

With Selection.Find

.ClearFormatting

.Style = "Drab"

.Text = ""

With .Replacement

ClearFormatting

.Style •= "Drilly"

.Text = ""

End With

.Execute Replace := wdReplaceAll

.ClearFormatting

.Replacement.ClearFormatting

End With

Включение двух инструкций ля "очистки формата" в вашу процедуру после метода Execute - очень неплохая идея. В противном случае, когда пользователь в следующий раз прибегнет к диалоговому окну Найти и заменить, ему придется сбрасывать все параметры форматирования вручную.

Использование переменных документа

Отличаясь от остальных приложений Office, Word позволяет определять в вашем коде специальные переменные документа, которые сохраняются вместе с документом. Переменные документа позволяют сохранять используемые процедурой значения между сеансами редактирования.

Переменные документа создаются и используются как члены коллекции Variables в данном документе. Как и обычные документы, переменные документа характеризуются именами. Приведенная ниже инструкция присваивает значение переменной Henry обычной переменной FriendOf Anais;

FriendOfAnais = _

ActiveDocument.Variable("Henry").Value

Для создания новой переменной документа используется метод Add коллекции Variables, как показано ниже:

Documents("Documentl").Variables.Add _

Name := "TimeThisMacroHasRun", Value := 0

Вы получите сообщение об ошибке, если попытаетесь добавить уже существующую переменную документа, поэтому я рекомендую вам проверить существование соответствующего имени, прежде чем создавать новую переменную. Если это так, вы сможете получить текущее значение переменной; если нет, вы можете создать переменную и назначить ее исходное значение. Этот прием проиллюстрирован следующим примером:

For Each DocVar In ActiveDocument.Variables

If DocVar.Name = "Last Caption" _

Then Doclndex = DocVar.Index

Next DocVar

If DocEndex = 0 Then

ActiveDocument.Variables.Add _

Name := "Last Caption", Value := 1

CaptionCounter = 1

Else

CaptionCounter = _

ActiveDocument.Variables(DocIndex).Value

End If

Несмотря на то, что объектные модели других приложений Office не позволяет явно создавать переменные документа, вы можете создавать пользовательские свойства документа для решения определенных задач. Подробные сведения об использовании пользовательских свойств в качестве переменных документа изложены в главе 14.

Глава 16. VBA-программирование в Excel.

В этой главе ...

~ Что такое объектная модель Excel

~ Управление ячейками с использованием объектов диапазонов

~ Создание собственных функций для использования в формулах рабочих листов

~ Использование встроенных функций Excel в VBA-коле

~ Работа с событиями Excel

Каждого, кто когда-либо писал формулы рабочих листов, можно считать в некотором роде программистом; поэтому не следует относиться к VBA, как к чему-то запредельному. Скорее всего, после некоторой работы с редактором Visual Basic вы обнаружите, что писать VBA-код, на самом деле, удобнее, чем составлять формулы непосредственно в рабочем листе; VBA предоставляет больший простор для деятельности в окне редактирования кода и позволяет вносить комментарии, что бывает очень полезным.

Кроме того, VBA может служить мощным инструментом для создания настраиваемых приложений, базирующихся на таблицах, способных выполнять вычисления и форматирования, которые без них просто не реальны. Но прежде чем стать профессионалом в использовании кодов Excel, чему способствует представленный ниже материал, следует ознакомиться с основами VBA, которые даются в первых трех разделах.

Знакомство с объектной моделью Excel

Прежде чем приступить к написанию VBA-кода для Excel, необходимо составить представление об иерархии объектов Excel и о том. как определять их в написанном коде. В самом верху иерархии находится объект Application (Приложение), отвечающий за функционирование всей программы Excel.

Для увеличения скорости работы многих VBA-программ следует отключить обновление экрана. По умолчанию Excel отображает каждое изменение в рабочей книге, сделанное в ходе выполнения VBA-кода. Это приводит к существенному снижению быстродействия. Для отключения такого режима работы Excel необходимо воспользоваться функцией ScreenUpdating (Обновление экрана) объекта Application:

Application . ScreenUpriatirig = False

Не забудьте в конце процедуры восстановить значение True для свойства ScreenUpdating, в противном случае пользователь не сможет увидеть на экране полученный результат.

При использовании свойства Screer.Upcating необходимо явно указывать имя объекта Application. Однако в большинстве случаев свойства объекта Application можно использовать напрямую. Например, свойство ActiveSheet объекта Application относится к рабочему листу или диаграмме, активной в текущий момент (безусловно, в книге, активной сейчас). Для обращения в коде к такому листу вместо записи Application .ActiveSheet можно использовать просто ActiveSheet. Коллекция Workbooks объекта Application содержит все рабочие книги, открытые в данный момент.

Для идентификации определенной рабочей книги используйте ее имя, заключенное в кавычки. Вот пример активизации отдельной рабочей книги:

Workbooks("Сводная статистика продаж.xls").Activate

Конечно же, рабочие листы также являются полноправными объектами. Они принадлежат коллекции Worksheets, и их идентификация должна проводиться таким же образом. Выражение Worksheets ( "ЛистЗ" ) указывает на лист с именем ЛистЗ. Аналогично, отдельный объект Chart для диаграммы, находящейся на отдельном листе, является членом коллекции Charts. Обращение к ней выполняется с помощью выражения вроде Charts ("Parts Chart") . Приемы работы с диаграммами, внедренными в рабочий лист, несколько отличаются, и приемы написания кода для них являются объектом рассмотрения данной книги.

Отображение рабочих книг можно изменить с помощью объектов Window (Окно). Объекты Window, которые иногда используются и для изменения содержимого рабочей книги, являются членами коллекции Windows объекта Application. Ссылка на окно осуществляется указанием в качестве индекса в коллекции Windows имени файла, содержащего рабочую книгу:

Windows("Кривая продаж игрушек.xls")

Если для одной рабочей книги открыто несколько окон, необходимо после имени рабочей книги через двоеточие указать номер окна, например: Windows ("Кривая продаж иг ру ше к.x l s:2").

Использование в коде объектов Range для работы с ячейками

Весьма неожиданно, что в Excel нет объекта Cell (Ячейка). Поэтому при написании кода следует руководствоваться следующим подходом: для указания ячейки в VBA-коде используется объект Range. В Excel объект Range может заключать в себе одну или больше ячеек и даже несколько не непрерывных областей листа.

Объект Range в Excel во многом подобен аналогичным объектам в Word, но вместе с тем имеет и существенные отличия. Как и в Word, VBA-программа может ссылаться на любое необходимое число объектов Range. Как в Excel, так и Word, действие программы не ограничивается видимым выделением пользователя, и для воздействия на какую-либо область ее выделять не требуется.

Определение объекта Range

В Excel имеется несколько возможных методов идентификации диапазона из одной или нескольких ячеек, на который должен воздействовать написанный код. Для достижения данной цели используются следующие.

Стандартная ссылка на ячейку. Так называемый А1-стиль ссылки на ячейку является, пожалуй, самым простым способом работы с объектами Range. Для определения диапазона необходимо ссылку заключить в кавычки и скобки после ключевого слова Range, как показано в следующем примере: