Интернет-журнал "Домашняя лаборатория", 2007 №7
Шрифт:
Рис. 5.33. Справка по инструкции Goto в Microsoft OfficeXP.
Выбрав из перечня разделов, содержащих данное ключевое слово, раздел GoTo Statement, можно получить всю ту информацию, которая была приведена на рис. 5.32.)
Итак, поставим метку в начало нашей программы:
Sub Макрос1
' Макрос1 Макрос
' Макрос записан 27.01.00
'
metka:
Selection.WholeStory
With Selection.Font
Name = "Times New Roman"
……
а
……
ActiveDocument.SaveAs Filename:= Left (ActiveDocument. FullName,
Len (ActiveDocument. FullName) -4), FileFormat:=*dFormatRTFActiveKindov. Close
Goto metka
End Sub
(Не стоит поддаваться мнению, что "использование оператора Goto — дурной тон". Это не так. Каждый оператор выполняет свою функцию, и если какая-либо проблема может быть лучше всего решена применением именно этого оператора, то его и надо использовать. Дурной тон — делать сложно там, где можно сделать просто.)
Готово. Теперь наша программа обработает все открытые документы. Но… обработать-то обработала, но в конце выдала сообщение об ошибке. Можно, конечно, оставить и так, но программа, заканчивающая свою работу ошибкой, пусть и после выполнения всех необходимых действий, выглядит некрасиво. Поэтому нужно обеспечить остановку выполнения программы после того, как будут обработаны все документы. Итак, алгоритм действий программы должен быть таков:
1. Выполнить обработку активного документа, сохранить его и закрыть.
2. Посмотреть, есть ли еще открытые документы.
3. Если есть, то перейти к пункту 1, если нет, то завершить работу.
"Если" — по-английски "If". Поищем по этому слову в Предметном указателе Справочной системы по VBA (из Microsoft Office 97). Получаем строчку:
"Инструкция If", выбрав которую, получаем окно из различных сочетаний слов If, Then, Else и др. (рис. 5.34).
Рис. 5.34. Выберем нужную справку…
Выберем "Инструкция If…Then…Else" — вроде первое слово понятнее. Получаем справку, из которой узнаем синтаксис команды:
If условие Then [инструкции] [Else инструкции_еlsе]
(К сожалению, в Справочной системе по VBA из Microsoft Office 2000/ХР подобный поиск произвести не представляется возможным — на слово "If" ни Предметный указатель, ни Мастер ответов не реагируют. Подобные ситуации встречаются в этой Справочной системе нередко — вот почему для начального обучения программированию на Visual Basic for Applications я рекомендую использовать именно Microsoft Office 97, несмотря на то, что эта версия офисного пакета считается несколько устаревшей.)
Какое же условие должно быть у нас? Наверное, подсчет количества открытых документов — если не 0, то продолжать работу, а если 0, то остановиться. А как можно подсчитать количество открытых документов? Посмотрим, нет ли в Visual Basic for Applications команды для такого подсчета? Напишем в тексте программы: "Documents", поставим точку и просмотрим выпавший список (рис. 5.35).
Рис. 5.35. Как же подсчитать открытые документы?
Есть ли что-нибудь, что может пригодиться?
Так и есть — в списке имеется метод "Count": скорее всего, это функция подсчета. Выберем ее из списка и посмотрим по ней справку и пример — да, эта команда считает открытые документы. То есть условие должно выглядеть как "If Documents. Count > 0 Then…". Ну, а инструкции — переход к метке — нами уже написаны.
Часть команды "Else…" можно опустить, а просто написать нужные инструкции после команды "If…" — ведь все равно к их выполнению программа не перейдет до тех пор, пока останутся открытые документы. А поместить там, наверное, стоит вызов сообщения, желательно со звуковым сигналом, — чтобы можно было поставить документы на обработку и отойти. Используем функцию MsgBox (о ее синтаксисе подробно написано в Справочной системе по VBA, в русской версии Microsoft Office 97 — даже по-русски):
signal = MsgBox ("Обработка закончена", vbln formation, "Обработка текстов")
Ну, вот и все. Итак, наша программа теперь выглядит так:
Sub Макрос1
'
' Макрос1 Макрос
' Макрос записан 13.01.02 metka:
'
Selection.WholeStory
With Selection.Font
Name = "Times New Roman"
Size = 12
Colorlndex = wdBlack
End With
With Selection.ParagraphFormat
LeftIndent = CentimetersToPoints(0)
Rightlndent = CentimetersToPoints(0)
SpaceBefore = 0. SpaceAfter = 0
LineSpacingRule = wdLineSpaceSingle
FirstLineIndent = CentimetersToPoints(1.27)
End With
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
MatchAHWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
ActiveDocument.Save
ActiveDocument.SaveAs FileName:= Left (ActiveDocument.FullName, Len(ActiveDocument.FullName) -4), FileFormat:=wdFormatRTFActiveWindow.Close
ActiveWindow.Close
If Documents.Count > 0 Then GoTo metka
signal = MsgBox ("Обработка закончена", vblnformation, "Обработка текстов")
End Sub
Итак, программа готова. Можно с помощью диалогового окна "Настройка"
назначить ей кнопку, пункт меню или сочетание клавиш, и запускать ее при необходимости.
Однако попробуем ее еще улучшить. Сделаем так, чтобы все обработанные документы сохранялись не в своих папках, а в отдельной, задаваемой пользователем, и чтобы пользователь мог выбрать эту папку из стандартного диалогового окна, похожего на Проводник.
Опять воспользуемся Справкой.
В Предметном указателе Справочной системы по VBA из Microsoft Office 97 зададим слова "dialog boxes", выберем эту же строчку из списка тем (рис. 5.36).