Интернет-журнал "Домашняя лаборатория", 2007 №7 - Глуховский
Шрифт:
Интервал:
Закладка:
ActiveDocument.SaveAs FileName:=ActiveDocument.Path + "" +
Left (ActiveDocument. Name, Len (ActiveDocument. Name) — 4),
FileForma t: =wdForma tRTF
Иначе Word будет сохранять документы в той папке, где последний раз был сохранен или открыт како-нибудь документ с помощью диалоговых окон "Сохранить как…" и "Открыть…". А это все же не всегда будет той же самой папкой, где находятся обрабатываемые документы, — к тому же документы для обработки можно открывать в Word и путем перетаскивания иконки файла в окно редактора, а при таком способе открытия папка сохранения документов не меняется.
В Visual Basic for Applications у объекта ActiveDocument есть также параметр FullName, который представляет из себя полный путь к документу, включающий и иерархию папок. Подробнее об этом параметре можно узнать в Справочной системе VBA. Иными словами, последнюю команду можно переписать как
ActiveDocument.SaveAs FileName:= Left(ActiveDocument.FullName,
Len(ActiveDocument.FullName) -4), FileFormat:=wdFormatRTF
Она будет давать точно такой же результат, что и приведенная выше.
И, наконец, последняя строчка:
ActiveWindow.Close
End Sub
Вот и конец программы — закрытие активного окна с документом.
Ну, а теперь надо добиться того, чтобы программа могла обрабатывать не один документ, а сразу множество. Можно пойти двумя путями: либо обрабатывать все нужные документы в одной папке, либо обработать все открытые документы, предварительно открыв нужные. Лично я предпочел второй вариант: ведь тогда можно открыть для обработки все действительно необходимые документы, несмотря на их исходное расположение — пусть даже и не в одной папке[234].
Как это сделать? Заметим, что готовый документ закрывается после обработки, и в окне Word активизируется следующий документ из всех открытых в редакторе. Следовательно, во-первых, надо обеспечить выполнение макроса над всеми документами, то есть его повторение — после окончания работы макроса он должен быть выполнен сначала. Можно считать, что в момент обработки в окне Word будут открыты лишь те документы, которые обработать надо — лишние всегда можно закрыть (а в Microsoft Word 97 ничего не мешает открыть для обработки файлов новое окно Word, если остальные открытые документы так уж необходимо оставить именно открытыми). Для выполнения макроса сначала нужно заставить Visual Basic for Applications перейти в начало программы. Поищем в справке Visual Basic for Applications, в Предметном указателе по слову "переход" — есть ли какая команда для этого (рис. 5.31)? Получаем список — "безусловные", "при ошибке", "условные".
Рис. 5.31. Поиск в предметном указателе по слову "переход" в Microsoft Office 97.
Выберем "Безусловные" — ведь в нашей программе надо обязательно перейти к обработке следующего документа. Получаем выбор из двух функций — выберем вторую, название короче — наверняка ее использование проще.
Рис. 5.32. Справка по инструкции Goto в Microsoft Office 97.
Из справки и примера узнаем, что инструкция (то есть встроенная функция, которая не возвращает никаких значений) "Goto" указывает на необходимость перехода к строке, на которой находится установленная нами метка.
(К сожалению, из-за того, что в более старших, чем 97-я, версиях Microsoft Office — 2000-й и ХР Справочная система по VBA не русифицирована, провести в ней такой же поиск, как описан выше, не представляется возможным. Однако, введя в окне Справки в качестве ключевого слова фразу "go to" — в переводе "пойти на…", "перейти на…", можно получить довольно большое число разделов Справки, содержащих его (рис. 5.33).
Рис. 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"
……
а в ее конец — инструкцию "Goto":
……
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": скорее всего,