Если при вызове диалогового окна параметров текста или шрифта во время записи макроса в документе ничего не было выделено, то будут определены все параметры диалогового окна, и в макрос попадут все свойства, могущие быть указанными в окне. Установленные параметры будут использоваться для вновь набираемого текста.
Параметры таких диалоговых окон, как 'Файл'-'Параметры страницы' или 'Файл'-'Печать' определены полностью всегда, и поэтому при записи макроса в его текст будут записываться все возможные параметры этих диалоговых окон, вне зависимости от того, были ли изменены они все или изменению подверглись лишь некоторые.
Идем дальше.
Selection.Find.ClearFormatting
Selection.Find.ParagraphFormat.Alignment = wdAlignParagraphLeft
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify
With Selection.Find
Text = ''
Replacement.Text = ''
Forward = True
Wrap = wdFindContinue
Format = True
MatchCase = False
MatchWholeWord = False
MatchWildcards = False
MatchSoundsLike = False
MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Насколько помнится, при записи макроса мы вызывали функцию замены Word для изменения всего выравнивания абзацев по левому краю на выравнивание по ширине. И вот перед нами эта функция, вызов которой записан на языке VBA. По всей видимости, строчка 'Selection.Find.ClearFormatting' означает очищение параметров форматирования в окне замены — эквивалент нажатию кнопки 'Снять форматирование', а фразы 'Selection.Find.ParagraphFormat.Alignment = wdAlign ParagraphLeft' и 'Selection.Find.Replacement.Paragraph Format.Alignment = wdAlignParagraphJustify' — установка параметров того, что надо искать — выравнивания «Left» (то есть по левому краю) и того, на что надо заменять — выравнивания «Justify» (по ширине). Нетрудно было догадаться — просто переведя с английского языка значения слов, входящих в команды: «Selection» — выделение, 'Find.Replacement' — найти и заменить, «ParagraphFormat» — формат абзаца, «Alignment» — выравнивание, 'AlignParagraphJustify' — «РавнятьАбзацПоШирине». Что ж, ясно. Оператор «With» нам уже знаком — в следующим за разобранными нами строчками фрагменте речь пойдет об окне 'Найти и заменить'.
Легко сообразить, что все параметры обьекта 'Selection.Find' (то есть поиска в выделенной части текста или во всем тексте) соответствуют параметрам окна 'Найти и заменить': '.MatchWholeWord' — 'искать целое слово', '.MatchCase' — 'учитывать регистр'.'.Text' — здесь, наверное, надо указать заменяемый текст, а'.Replacement.Text' — здесь то, на что заменить. В нашем случае заменять надо не текст, а форматирование, поэтому эти строчки пусты.
Заметив повторения слов 'Selection.Find' в первых четырех строчках, можно посчитать, что и их содержимое можно включить в блок оператора «With». Проверим-ка это. Чуть ниже последнего записанного нами макроса напишем строчку: 'Sub experience1()' (имя после «Sub» может быть любым, важно лишь, чтобы оно не совпадало с какой-либо командой VBA). Нажмем Ввод — парой строчек ниже редактор VBA напишет: 'End Sub'. С помощью команд «Копировать» и «Вставить» скопируем из нашей программы в текст нового макроса блок 'With Selection.Find'. А затем переместим все строчки, относящиеся к отражению в макросе работы окна 'Найти и заменить' в блок 'With Selection.Find', убрав слова 'Selection.Find':
Sub experience1()
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
MatchAllWordForms = False
Execute Replace:=wdReplaceAll
End With
End Sub
Попробуем программу в деле. Откроем еще один документ из общего набора и запустим клавишей F5 новый макрос на выполнение (курсор должен стоять внутри текста запускаемого макроса). Все прекрасно! Замена произошла так, как необходимо. Значит, ясно — так сокращать текст программы можно.
Осталось еще несколько интересных строчек, конкретное значение которых может вызвать вопросы — '.Forward = True', '.Wrap = wdFindContinue', '.Execute Replace:=wdReplaceAll'. Ну, первая — это направление поиска — вперед или назад (тогда бы там было значение 'False'). Но что значит вторая? А запишем-ка для выяснения еще макрос с такой же заменой выравнивания влево на выравнивание по ширине, но с разными параметрами направления поиска. Вот что получилось:
Видно, что наличие или отсутствие согласия на продолжение поиска не влияет на записываемый текст. А как же тогда отказаться от запроса на продолжение? Откроем текст макроса и поставим после команды'.Wrap' еще один знак '=' (рис. 3.7).
Ну вот, все и ясно — для отказа от продолжения замены после достижения конца документа нужно поставить значение параметра'.Wrap' как «wdFindStop». То есть вышеприведенная таблица должна иметь вид
Осталось разобраться со строчкой'.Execute Replace:= wdReplaceAll'. По логике вещей, это должна быть команда запуска поиска, тем более что и слово «Execute» означает «Запустить». Посмотрим в справке