(Журнал "UPGRADE", #5 2002г.)
С помощью макросов удобно разнообразить меню редактора Word. Когда много работаешь, то среди трех сотен его инструментов все равно не оказывается именно такого, который нужен. Приходится «изготавливать» его самостоятельно. Вот несколько образцов. Sub Italic_Word() ' Выделение одного слова курсивом Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Font.Italic = wdToggle Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Font.Italic = wdToggle Selection.MoveRight Unit:=wdCharacter, Count:=1 End Sub Для того чтобы включить в состав редактора этот макрос, сделайте следующее: Макрос 2. Аналогично можно ввести в состав Word и макрос для форматирования слова полужирным: Sub Bold_Word() ' Выделение одного слова полужирным Selection.MoveLeft Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Font.Bold = wdToggle Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend Selection.Font.Bold = wdToggle Selection.MoveRight Unit:=wdCharacter, Count:=1 End Sub Макрос 3. Потеря времени возникает при импортировании в Word документов в формате «текста MS DOS» из-за того, что каждая строка такого текста оказывается (после импорта) в отдельном абзаце. Программа, естественно, не может автоматически объединить строки в абзацы, потому что для этого нужно, как минимум, понимать смысл текста. Эту операцию потом приходится выполнять вручную. Но для ускорения процесса полезно обзавестись кое-какими инструментами. Sub Delete_Last() ' Удаление последнего символа в строке Selection.EndKey Unit:=wdLine Selection.Delete Unit:=wdCharacter, Count:=1 End Sub Рисунок для кнопки предлагаю сделать такой: Selection.TypeText Text:=" " Работать с этим макросом нужно в режиме, который показывает символы абзацев. Перед запуском макроса курсор достаточно установить в любом месте нужной строки. Я обычно сдвигаю курсор клавишей стрелка вниз, а мышью щелкаю на кнопке макроса, и дело идет довольно споро. Макрос 4. Более сложный макрос позволяет объединить несколько выделенных абзацев в один: Sub Only_1_Paragraph() 'Объединение нескольких абзацев в один p = 0 n = Selection.Characters.Count For i = n To 1 Step -1 If Asc(Selection.Characters(i)) = 13 Then p = p + 1 If p > 1 Then Selection.Characters(i).Delete End If End If Next i End Sub Рисунок для его кнопки может быть таким: И тут во время работы с макросом нужно видеть символы абзацев. Выделяя несколько абзацев, следите, чтобы символ конца последнего абзаца тоже был выделен! Макрос 5. Часто при работе с документом возникает проблема выбора языка, на котором набран текст. В Word 2000 существует режим автоматического выбора языков, но он не дает гарантии правильной расстановки этого параметра, а в Word 97 и этого не было, поэтому во многих текстах сложно проверять правописание. Если документ большой, то в нем очень трудно проконтролировать верность установки языка. Например, легко проглядеть, что для части текста задан режим «без проверки», а это может привести к тому, что в этой части останутся ошибки правописания. Поэтому перед проверкой целесообразно запустить макрос, приведенный ниже. Он устанавливает для всего документа параметр языка «русский», а для слов, начинающихся с латинской буквы – «английский». Разумеется, можно придумать массу подобных алгоритмов определения языков, но этот вариант годится для многих задач. Чтобы пользователь не скучал во время выполнения макроса, организован сдвиг курсора от начала до конца документа (прокрутка). Sub Select_Language() 'Выбор языка для проверки правописания Selection.WholeStory Selection.LanguageID = wdRussian Selection.NoProofing = False Selection.HomeKey Unit:=wdStory n1 = 0 w1 = "a" se1 = Selection.End se2 = -1 Do While se1 <> se2 w1 = Left(Trim(Selection.Words(1)), 1) If w1 <> "" Then n1 = Asc(w1) If (n1 >= 65 And n1 <= 90) Or (n1 >= 97 And n1 <= 122) Then Selection.Words(1).LanguageID = wdEnglishUS Selection.Words(1).NoProofing = False End If End If Selection.MoveRight Unit:=wdWord, Count:=1 se2 = se1 se1 = Selection.End Loop Application.CheckLanguage = True If se1 = se2 Then MsgBox "Конец документа" End Sub Поскольку макрос начинает проверку с первого слова документа, не имеет значения, где находится курсор в момент запуска этого макроса. Макрос 6. Иногда требуется скопировать или переместить несколько фрагментов текста из одного документа в другой. Например, отобрать в списке почтовых адресов только те, которые нужны для рассылки. При такой работе очень надоедает постоянное переключение между окнами документов. Выводить на экран одновременно два окна и перетаскивать текст – тоже не лучший выход. Следующий макрос позволяет свести к минимуму количество действий. Пользователю требуется только выделить нужный фрагмент в тексте и запустить макрос, который:
Пользователь в этом случае работает только с одним документом и не отвлекается на рутинные операции. Текст макроса таков: Sub To_2() ' Копирование в другой документ n = 0 If Windows.Count >= 2 Then If Windows(1).Active = True Then n = 1 m = 2 End If If Windows(2).Active = True Then n = 2 m = 1 End If If n = 1 Or n = 2 Then Selection.Copy Windows(m).Activate Selection.Paste Selection.TypeParagraph Windows(n).Activate Else MsgBox "Выберите 1-й или 2-ой документ в меню 'Окно'" End If Else MsgBox "Надо открыть два документа" End If End Sub Для того чтобы этот макрос мог работать, необходимо открыть два документа. Они должны идти под номерами 1 и 2 в меню Окно (они там отсортированы по алфавиту). С документами под номерами 3, 4, 5… макрос работать не будет. Проще всего, конечно, когда открыты только два файла. В том документе (неважно, первый он или второй), куда вы хотите копировать текст, установите курсор на пустой абзац. Перейдите в окно документа, из которого будете копировать текст, выделите фрагмент и запустите макрос. Потом выделите другой фрагмент, снова щелкните кнопку макроса и так далее. Макрос 7. Еще одна задача. Случается так, что у пользователя оказываются два варианта одного и того же текста, и требуется найти, чем они отличаются. Открывать два окна, и сравнивать текст «на глаз» – задача не из приятных, особенно если документ большой. В редакторе есть команда «Сравнить версии», но ее использование не всегда удобно. Почему? Во-первых, результат сравнения записывается в документе в виде исправлений. Если в нем уже существуют отмеченные исправления, разобраться потом что есть что очень сложно. Во-вторых, эта команда обрабатывает весь документ и не может работать с его частью. В общем, нужен другой инструмент. Приведенный ниже макрос сравнивает текст по словам, с того места, которое укажет пользователь. Как только будет найдено первое слово, на котором тексты различаются, программа останавливается и отображает результат поиска. Курсоры в обоих документах перемещаются к найденным словам. Sub Compare_Words() 'Сравнение слов в двух документах If Windows.Count >= 2 Then se1 = Windows(1).Selection.End se2 = -1 se3 = Windows(2).Selection.End se4 = -1 w1 = "a" w2 = "a" Do While se1 <> se2 And se3 <> se4 And w1 = w2 Windows(1).Selection.MoveRight Unit:=wdWord, Count:=1 Windows(2).Selection.MoveRight Unit:=wdWord, Count:=1 w1 = Trim(Windows(1).Selection.Words(1)) w2 = Trim(Windows(2).Selection.Words(1)) se2 = se1 se1 = Windows(1).Selection.End se4 = se3 se3 = Windows(2).Selection.End If w1 <> w2 Then MsgBox "Документ 1: " & w1 & " Документ 2: " & w2 End If Loop If se1 = se2 Then MsgBox "Конец документа 1" If se3 = se4 Then MsgBox "Конец документа 2" Else MsgBox "Надо открыть два документа" End If End Sub Так же как и предыдущий, этот макрос работает с двумя документами, которые занимают первое и второе места в списке меню Окно. Поскольку в этом списке документы сортируются по алфавиту, лучше открыть только два документа. Полезно также использовать команду Окно > Упорядочить все. Курсоры в обоих документах необходимо установить перед соответствующими (одинаковыми) словами в том месте, с которого требуется начать проверку. Макросы эти работают в Word 97, Word 2000 и Word XP. Если вы используете Word с «прибамбасами», то храните отдельно резервную копию файла Normal.dot. При переустановке MS Office этот файл автоматически заменяется новым, и если вы не сохраните старый, все нестандартные инструменты придется изготавливать заново. 2002 г. Алексей Гончаров * Авторский вариант статьи |