Рис. 3.4.
Ну, теперь все ясно. Даже примеры приведены, — и очень похожие на наш макрос. Посмотрим тогда ссылку «Properties» вверху окна справки — список свойств шрифта, которые можно задать в программе (рис. 3.5).
Рис. 3.5.
Это, кстати, такой же список, как и тот, что выпадает в качестве контекстной подсказки, если при наборе текста программы вручную поставить после слова «Font» точку. Видно, что там есть все свойства шрифта, задаваемые в макросе: и «Name», и «Size», и «ColorIndex». Можно при желании почитать про каждое свойство подробно, но, наверное, лучше разобраться с командой «With», которая встречается и в нашем макросе, и в справке по слову «Font». Ставим на нее курсор и нажимаем F1 (рис. 3.6).
Рис. 3.6.
Даже на русском (некоторые разделы справки VBA переведены на русский язык). Ну и прекрасно — прочтя справку, узнаем, что 'Инструкция With позволяет выполнить последовательность инструкций над указанным объектом, не повторяя задание имени объекта.' То есть она позволяет сократить обьем кода и облегчить ориентировку программиста в нем, — иначе, без этой функции, рассматриваемый фрагмент кода нашего макроса имел бы вид
Selection.Font.Name = 'Times New Roman'
Selection.Font.Size = 12
Selection.Font.ColorIndex = wdBlack
что и выглядит некрасиво, и места больше требует. Примем к сведению.
Идем дальше:
With Selection.ParagraphFormat
LeftIndent = CentimetersToPoints(0)
RightIndent = CentimetersToPoints(0)
SpaceBefore = 0
SpaceAfter = 0
LineSpacingRule = wdLineSpaceSingle
FirstLineIndent = CentimetersToPoints(1.27)
End With
Это — команда установки параметров выделенных абзацев: отступов, межстрочного интервала, красной строки. Нетрудно получить эту информацию из справки или просто догадаться, — ведь «Paragraph» означает «абзац».
Впрочем, проверим — так ли это. Откроем какой-либо документ и запишем новый макрос — выделив пару абзацев, включим запись макроса и поставим этим двум абзацам отступы сверху, снизу, справа и слева по одному сантиметру, а межстрочный интервал — полуторный. Вот что получилось:
Sub Макрос2()
' Макрос записан 26.01.00
With Selection.ParagraphFormat
LeftIndent = CentimetersToPoints(1)
RightIndent = CentimetersToPoints(1)
SpaceBefore = 1
SpaceAfter = 1
LineSpacingRule = wdLineSpace1pt5
Alignment = wdAlignParagraphJustify
WidowControl = True
KeepWithNext = False
KeepTogether = False
PageBreakBefore = False
NoLineNumber = False
Hyphenation = True
FirstLineIndent = CentimetersToPoints(1)
OutlineLevel = wdOutlineLevelBodyText
End With
End Sub
Что-то не то! Код какой-то большой и много новых команд, которых не было записано в первый раз! Какие-то'.WidowControl', '.KeepWithNext'… Впрочем, ясно, что это свойства абзаца — наверное, 'Контроль висячих строк', 'Не отрывать от следующего'. Но почему же в первый раз записанный код был гораздо меньше, и все было 'по делу'?
Сравним оба случая. В прошлый раз все абзацы в документе были оформлены по-разному, а в этот раз оформление обоих абзацев было одинаковым. Может, в этом дело? И действительно, поэкспериментировав еще (уж не буду здесь приводить все тексты), позаписывав макросы при оформлении разнооформленных абзацев и одинаково оформленных, можно прийти к выводу, что в текст записанного макроса попадают те свойства, которые после установки параметров абзацев через диалоговое окно 'Формат'-'Абзац' оказываются одинаковыми у всех обрабатываемых абзацев! И неважно, были ли эти свойства установлены такими именно сейчас, или когда-то ранее.
Небольшое отступление
Средство записи макросов VBA отслеживает не столько действия пользователя, сколько изменения параметров текста. Поэтому при задании свойств абзаца с помощью соответствующего диалогового окна 'Формат'-'Абзац' оно скрупулезно записывает в макрос все параметры этого диалогового окна, которые в нем были заданы при нажатии кнопки Ok. Если абзацы имели разное оформление, которое не было изменено в данный момент на единообразное, то те пункты данного диалогового окна, которые остались различными у разных абзацев в выделении, будут иметь неопределенное значение, и средство записи макросов не сможет их поместить в текст записываемого макроса. В самом же диалоговом окне подобные неопределенные опции отображаются галочкой на сером фоне, а в полях указания размеров отступов не стоят их значения.
Если же все выделенные абзацы были оформлены единообразно, то все значения диалогового окна 'Формат'-'Абзац' будут определены, и все они попадут в текст макроса.
Лишние команды задания свойств, оказавшиеся в тексте макроса при его записи, рекомендуется удалить с целью сокращения размера программы и для исключения излишних заданий свойств — программа должна изменять лишь те свойства текста, для изменения которых она создавалась.