52953.fb2 VBA для чайников - читать онлайн бесплатно полную версию книги . Страница 102

VBA для чайников - читать онлайн бесплатно полную версию книги . Страница 102

Если метол Execute нашел необходимый текст, исходный диапазон или выделенная область переопределяются таким образом, чтобы содержать найденный текст. Это очень важный момент, поскольку это означает, что вы можете работать с найденным текстом посредством свойств и методов исходного объекта. В следующем примере, представляющем собой расширенный вариант первого фрагмента кода из настоящего раздела, инструкция .Parent. Italic = True обращается к родительскому объекту по отношению к объекту Find, т.е. диапазону OpenRange. При выполнении этой инструкции диапазон OpenRange теперь содержит только найденный фрагмент текста, так как только в нем предусмотрено форматирование курсивом:

With OpenRange.Find

.СlearFormatting

.Text = "pogosticks"

If .Found = True Then

.Parent.Italic = True

Else

MsgBox "No pogosticks found."

End If

End with

Объект Reolacement принадлежит (а значит, является его свойством) объекту Find. При написании кода для операции поиска и замены вам следует задать свойства и выполнить методы объекта Replacement.

Следующий фрагмент кода заменяет все экземпляры фразы pogosticks словом skateboards. Выделенная область изменяется при выполнении критерия поиска, поскольку доступ к объекту Find осуществляется через объект Selection:

With ActiveDocument.Content.Find

.ClearFormatting

.Text = "pogosticks"

With .Replacement

.ClearFormatting

.Text == "skateboards"

End With

.Execute Replace := wdReplaceAll

End With

Обратите внимание на то, что метод Execute может использовать аргумент Replace, предназначенный для контроля за тем, будут ли заменены все обнаруженные экземпляры обнаруженного фрагмента текста, или только первый.

Поиск и замена форматирования

Для поиска текста с определенным форматированием используйте свойства объекта Find, касающиеся форматирования. Они идентичны свойствам, используемым при работе с форматированием диапазона или выделенной области, как я уже отмечал в разделе "Форматирование текста", раньше в настоящей главе. Вы можете использовать те же свойства объекта Replacement, если хотите указать форматирование для замещающего текста.

Для поиска любого текста с определенным форматированием задайте соответствующие свойства объекта Find, а также задайте свойство Text равным пустой строке, используя пару кавычек. Для изменения форматирования найденного текста без влияния на сам текст, используйте пустую строку в качестве значения свойства Text объекта Replacement.

Приведенный ниже код проводит поиск абзацев, которым в данный момент назначен стиль 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