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

Заметив повторения слов ''''Selection. Find" в первых четырех строчках, можно посчитать, что и их содержимое можно включить в блок оператора "With". Проверим-ка это. Чуть ниже последнего записанного нами макроса напишем строчку: "Sub experiencel()" (имя после "Sub" может быть любым, важно лишь, чтобы оно не совпадало с какой-либо командой Visual Basic for Application). Нажмем Ввод — парой строчек ниже редактор Visual Basic for Applications напишет: "End Sub". С помощью команд "Копировать" и "Вставить" скопируем из нашей программы в текст нового макроса блок "With Selection.Find". А затем переместим все строчки, относящиеся к отражению в макросе работы окна "Найти и заменить" в блок "With Selection.Find", убрав слова "Selection.Find":

Sub experiencel()

With Selection.Find

ClearFormatting

ParagraphFormat.Alignment = wdAlignParagraphLeft

Replacement.ClearFormatting

Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify.Text = ””

Replacement.Text = ””

Forward = True

Wrap = wdFindContinue

Format = True

MatchCase = False

MatchWholeWord = False

MatchWildcards = False

MatchSoundsLike = False

MatchAHWordForms = False

Execute Replace:=wdReplaceAll

End With

End Sub

Попробуем программу в деле. Откроем еще один документ из общего набора и запустим клавишей F5 новый макрос на выполнение (курсор должен стоять внутри текста запускаемого макроса)…

Все прекрасно! Замена произошла так, как необходимо. Значит, ясно — так сокращать текст программы можно.

Осталось еще несколько интересных строчек, конкретное значение которых может вызвать вопросы — ".Forward = True", ".Wrap = wdFindContinue", ".Execute Replace:=wdReplaceAll". Ну, первая — это направление поиска вперед или назад (в последнем случае там было бы значение "False" — то есть "не вперед"). Но что значит вторая? А запишем-ка для выяснения еще макрос с такой же заменой выравнивания влево на выравнивание по ширине, но с разными параметрами направления поиска. Просто в режиме записи макроса вызовем несколько раз диалог поиска и замены, указывая каждый раз в нем разные параметры.

Вот что получилось:

Параметры поиска ∙ Записанный фрагмент кода

Вперед, с согласием на продолжение поиска

Forward = True

Wrap = wdFindAsk

Назад, с согласием на продолжение поиска

Forward = False

Wrap = wdFindAsk

Вперед, без согласия на продолжение поиска

Forward = True

Wrap = wdFindAsk

Назад, без согласия на продолжение поиска

Forward = False

Wrap = wdFindAsk

Везде

Forward = True

Wrap = wdFindContinue

Видно, что наличие или отсутствие согласия на продолжение поиска, даваемое в выскакивающем запросе, не влияет на записываемый текст. А как же тогда отказаться от этого запроса на продолжение — ведь в готовой программе он явно неуместен? Откроем текст макроса и поставим после команды".Wrap" еще один знак "=" (рис. 5.15). Выпал список возможных продолжений.

Рис. 5.15. Вот так можно определить возможные значения параметра…

Ну вот, все и ясно — так как значения".wdFindAsk" и".wdFindContinue" мы уже перебирали, то для отказа от продолжения замены после достижения конца документа нужно поставить значение параметра".Wrap" как "wdFindStop". То есть вышеприведенная таблица должна иметь вид

Параметры поиска ∙ Необходимый фрагмент кода

Вперед, с согласием на продолжение поиска

Forward = True

Wrap = wdFindAsk

Назад, с согласием на продолжение поиска

Forward = False

Wrap = wdFindAsk

Вперед, без согласия на продолжение поиска

Forward = True

Wrap = wdFindStop

Назад, без согласия на продолжение поиска

Forward = False

Wrap = wdFindStop

Везде

Forward = True

Wrap = wdFindContinue

Осталось разобраться со строчкой".Execute Replace:=wdReplaceAll". По логике вещей, это должна быть команда запуска поиска, тем более что и слово "Execute" означает "Запустить". Посмотрим в справке — по слову "Execute" (рис. 5.16).

Рис. 5.16. Справка по слову Execute.

Так, получаем четыре ссылки: "For information about the Execute method, click one of the following object names: Dialog, Find, KeyBinding, MailMerge". В Microsoft Office 2000/XP это окно Справочной системы VBA несколько красивее, но перечень объектов, к котором может быть применен метод Execute, в нем такой же, разве что отдельно приводятся ссылки на примеры кода. Нас интересует вторая ссылка — "Find", так как мы работаем именно с этим объектом. Открываем (рис. 5.17)…

Рис. 5.17. Справка по команде Execute объекта Find

Так и есть — команда".Execute" запускает команду поиска и замены на выполнение: "Runs the specified find operation. Returns True if the find operation is successful.". Из текста справки также узнаем, что все параметры поиска и замены можно было бы задать и в скобках, а, кроме того, результат выполнения команды можно записать в переменную — успешен ли был поиск или нет (то есть были ли найдены в данном сеансе работы команды "Найти и заменить" искомые элементы), принимающую значения соответственно "True" или "False". Сейчас данная возможность не требуется, однако запомнить ее стоит — мало ли когда пригодится.

Продолжаем изучать записанную макрокоманду.

ActiveDocument.Save

Вопросов не вызывает — это команда сохранения активного документа.

ActiveDocument.SaveAs FileName:="Доклад!.rtf", FileFormat:=wdFormatRTF, LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= False

А вот здесь уже понадобится редактирование. Это команда "Сохранить Как…" — поскольку соответствующая команда Word представляет собой диалоговое окно, то в текст макроса помещаются все возможные параметры, как соответствующие установленным по умолчанию, так и нет: ''''AddToRecentFiles" — добавлять ли ярлык в папку "Recent", ''''EmbedTrueTypeFonts" — внедрять ли шрифты TrueType.

Наиболее интересны элементы команды "FileName:=”Доклад!.rtf"" и "FileFormat:=wdFormatRTF" — имя файла, под которым сохраняется активный документ, и тип сохраняемого файла. Тип нас устраивает — формат Rtf. А вот как быть с именем? Ведь у каждого файла должно быть свое, уникальное имя. А тут получается, что все файлы, обрабатываемые данным макросом, станут сохраняться под одним и тем же именем, что, ясное дело, вызовет их запись друг на друга и тем самым потерю данных во всех них, кроме обработанного последним. Что же делать?

Попробуем для начала просто исключить строчку с указанием имени из текста данной команды. Создадим еще один модуль, скопируем туда всю команду "ActiveDocument.SaveAs" со всеми параметрами и удалим строчку "FileName: = ”Доклад!. rtf"". Запустим программу… ничего не произошло. Но ведь программа что-то делала: и жесткий диск работал, и система была недоступна пару секунд, и сообщений об ошибках не было… Что же все же сработало? А откроем-ка в "Блокноте" или другом редакторе простого текста исходный файл, который обрабатывался и сохранялся после обработки — у меня это был файл "Доклад2.doc" (рис. 5.18), предварительно выгрузив его из Word — чтобы "Блокнот" мог его открыть.