— по слову «Execute». Так, четыре ссылки: 'For information about the Execute method, click one of the following object names: Dialog, Find, KeyBinding, MailMerge'. Нас интересует вторая — «Find», так как мы работаем именно с этим обьектом. Открываем…
Так и есть — команда'.Execute' запускает команду поиска и замены на выполнение: 'Runs the specified find operation. Returns True if the find operation is successful.'. Из текста справки также узнаем, что все параметры поиска и замены можно было бы задать и в скобках, а, кроме того, результат выполнения команды можно записать в переменную — успешен ли был поиск или нет (то есть были ли найдены в данном сеансе работы команды 'Найти и заменить' искомые элементы). Сейчас данная возможность не требуется, однако запомнить ее стоит — мало ли когда пригодится.
Продолжаем изучать записанную макрокоманду.
ActiveDocument.Save
Вопросов не вызывает — это команда сохранения активного документа.
ActiveDocument.SaveAs FileName:='Доклад1.rtf', FileFormat:=wdFormatRTF, LockComments:=False, Password:='', AddToRecentFiles:=True, WritePassword:='', ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= False
А вот здесь уже понадобится редактирование. Это команда 'Сохранить Как…' — поскольку соответствующая команда Word представляет собой диалоговое окно, то в текст макроса помещаются все возможные параметры, как соответствующие установленным по умолчанию, так и нет: «AddToRecentFiles» — добавлять ли ярлык в папку «Recent», «EmbedTrueTypeFonts» — внедрять ли шрифты TrueType. Наиболее интересны элементы 'FileName:='Доклад1.rtf'' и 'FileFormat:=wdFormatRTF' — имя файла, под которым сохраняется активный документ, и тип сохраняемого файла. Тип нас устраивает — формат Rtf. А вот как быть с именем? Ведь у каждого файла должно быть свое, уникальное имя. Попробуем для начала просто исключить строчку с указанием имени из текста данной команды. Создадим еще один модуль, скопируем туда всю команду 'ActiveDocument.SaveAs' со всеми параметрами и удалим строчку 'FileName:='Доклад1.rtf''. Запустим программу… ничего не произошло. Но ведь программа что-то делала: и жесткий диск работал, и система была недоступна пару секунд, и сообщений об ошибках не было… Что же все же сработало? А откроем-ка в «Блокноте» или другом редакторе простого текста файл, который сохранялся — у меня это был файл 'Доклад2.doc', предварительно выгрузив его из Word (рис. 3.8).
Рис. 3.8.
Так вот в чем дело — файл был сохранен в формате Rtf, но под прежним именем и с расширением'.doc'! Но нас это не устраивает — имя пусть будет то же, а вот расширение должно быть именно'.rtf'.
Интересно, а что будет, если запустить эту программу при активном ни разу не сохранявшемся документе? Запускаем… Активный документ приобрел имя 'Doc1.doc' (ну, или 'Doc2.doc', 'Doc3.doc' — у кого как). Но где он сохранился? Ищем по F3 в Explorere — так, сохранен он в папке, где произошло последнее ручное сохранение какого-либо файла или в папке для документов Word по умолчанию.[3]
Следовательно, при программном сохранении ранее несохранявшегося документа без задания ему имени и места сохранения (место сохранения можно задать, включив в имя документа в пункте «FileName» полный путь к его новому местоположению) происходит сохранение активного документа в папке по умолчанию (или в папке, где был последний раз сохранен вручную какой-нибудь документ) и с именем по умолчанию. Примем к сведению.
Но как же нам быть с нашей программой? Нам ведь надо, чтобы все обрабатываемые файлы сохранялись под своим именем и в формате и с расширением Rtf! А попробуем-ка каким-нибудь способом получить программно имя активного документа. Создадим еще один макрос, и напишем там «ActiveDocument», ставим точку (рис. 3.9) и видим, что среди возможных продолжений команды есть свойство 'Name'.
Рис. 3.9.
Похоже, это и есть то, что нам надо. Проверим. Модифицируем экспериментальную процедуру следующим образом:
Sub experience2()
MsgBox ActiveDocument.Name
End Su
Это позволит нам вызвать окно сообщения с значением функции 'ActiveDocument.Name'. Можно было бы написать 'Debug.Print ActiveDocument.Name', что отобразило бы значение этой функции в специальном Окне отладки (вызывается из меню редактора VBA 'Вид'-'Окно отладки'). Но использовать окно сообщения как-то привычнее. Итак, нажимаем F5… получаем окно с сообщением: 'Доклад1.doc'.
Но нам ведь нужно одно только имя, без расширения! Как же его получить? Наверное, проще всего убрать последние четыре символа — '.doc'. Но как?
Воспользуемся справкой. Нажмем F1 в редакторе VBA, в открывшемся окне нажмем кнопку «Разделы», а там — 'Предметный указатель', — в нем все разделы справки классифицированы по смыслу, в то время как в разделе «Поиск» лишь составлена база данных по всем словам, входящим в справочную систему VBA.
Наберем в строке поиска слово «строка». Из списка разделов справочной системы VBA выберем то, что нам надо — строчку 'крайние левые символы' (ведь нам нужно получить из имени документа с расширением только его имя, то есть левую часть строки без четырех правых символов, то есть крайние слева символы). Получаем справку по функции «Left» (рис. 3.10).
Превосходно — функция «Left» является именно той функцией, которая нам требовалась. Но она требует значение количества символов во всей строке — как это узнать? Да так, как описано в данном справочном окне в разделе 'Дополнительные сведения' — через функцию «Len». Нажмем ссылку 'См. также', выберем из списка строчку 'Функция Len' и изучим появившуюся информацию.[4]
Немного подумав и использовав данные о синтаксисе обеих команд в справке, можно написать команду, которая возвращает строку без последних четырех символов:
imyadoc = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4)
Можно проверить. Создадим еще один модуль: