Эта команда эквивалентна ручному подключению шаблона с макросами через меню Word 'Сервис — Шаблоны и надстройки'. Однако если она будет выполнена сразу же после программного копирования шаблона в папку автозагружаемых файлов, то может возникнуть ошибка вследствие того, что при таком копировании Word должен зарегистрировать этот шаблон как доступный для подключения (после регистрации он появится в диалоговом окне 'Сервис-Шаблоны и надстройки', но не будет отмечен как загруженный). На это уходит пара секунд, и если в этот момент вызвать команду подключения шаблона, то Word может ответить программе, что такого шаблона в папке автозагрузки нет, что вызовет ошибку.
Предотвратить подобную ситуацию можно, например, с помощью следующей конструкции, — разместите ее после команды копирования шаблона 'FileCopy':
a='Имя шаблона в папке автозагрузки с полным указанием пути'
On Error Resume Next
Do
If AddIns(a). Installed Then Exit Do
AddIns(a). Installed = True
Loop[13]
При использовании команды подключения шаблона он может находиться и не в папке автозагружаемых файлов, но все же надежнее использовать именно папку автозагрузки.
· Для удаления шаблона без выгрузки Word можно использовать такой же код:
a='Имя шаблона в папке автозагрузки с указанием пути'
On Error Resume Next
Do
If Not AddIns(a). Installed Then Exit Do
AddIns(a). Installed = False
Loop
AddIns (a). Delete
Kill (a)
· Команда 'Kill' выполняет удаление файла.
Команда 'On Error Resume Next', встречающаяся в обоих вышеприведенных фрагментах кода — это обработчик ошибок. В случае возникновения ошибки в коде после него (скажем, связанной с обращением к несуществующему объекту) он продолжит выполнение программы с команды, следующей за вызвавшей ошибку. Обработчик ошибок может также иметь вид 'On Error GoTo метка', и тогда при ошибке в коде после него произойдет переход к указанной в обработчике метке и выполнение программы продолжится именно с нее.
· Если вы, работая в Word 97, часто сохраняете документы в формате HTML, и вам мешает постоянно появляющийся диалог о выборе кодировки файла (рис. 5.2), то отключите его, установив в системном реестре строковый параметр 'HKEY_LOCAL_ MACHINESoftwareMicrosoftShared Tools Text Converters ExportHTMLOptionsShow EncodingDialog' как «No». Установить этот параметр реестра можно и программно с помощью команды 'System.PrivateProfileString('', 'HKEY_LOCAL_MACHINESoftware MicrosoftShared ToolsText Converters ExportHTMLOptions', 'ShowEncodingDialog') = 'No''
Рис. 5.2.
· Если Вы закрыли исходный код Вашей программы на VBA от просмотра паролем, а потом благополучно его забыли — не огорчайтесь: в Интернете, по адресу www.passwords.ru есть программа AVPR, позволяющая восстановить забытый Вами пароль. Ее английская версия требует оплаты и регистрации, а русская — бесплатная. К сожалению, бесплатная версия работает только с файлами, созданными в Word и Excel из Microsoft Office 97.
Чтобы ускорить работу программы, работающей с текстом, поставьте в ее начале команду 'Application.ScreenUpdating = False', а в ее конец — команду 'Application.ScreenUpdating = True', если
· только в процессе работы программы не требуется визуальный контроль происходящих изменений. Эта команда позволяет системе не тратить время и силы на постоянное обновление экрана и отображение изменений. Для того, чтобы все же обновить экран после отключения обновления экрана, используйте команду 'Application.ScreenRefresh'.
· Для получения от пользователя определенных данных, кроме создания форм, можно использовать встроенные диалоги VBA — диалоговое окно 'Открытие файла', 'Свойства документа' и др. Они вызываются командой Dialogs('Название диалога'). Show (показывает диалог и выполняет соответствующие ему действия), Dialogs('Название диалога'). Display (только показывает диалог и позволяет записать в переменные введенные изменения, но не выполняет никаких действий и ничего не изменяет: очень полезно для использования встроенных диалоговых окон в своих целях), Dialogs('Название диалога'). Execute (ничего не отображает на экране, но применяет все те изменения, которые были сделаны ранее с помощью команды With Dialogs('Название диалога') … End With). Для вывода списка возможных диалогов наберите 'Dialogs(', и Вам будет выдан их список. К сожалению, описания конкретных диалогов нет в справке — придется просто попробовать отобразить каждый, хотя список возможных параметров каждого диалога в справке есть.
В Microsoft Excel набора встроенных диалогов нет, однако отобразить на экране окна открытия и сохранения файлов все же можно. Для этого служат команды 'Application.GetOpenFilename' и 'Application.GetSaveAsFilename'. В результате выполнения команды 'file = Application.GetOpenFilename' будет отображено окно открытия файла, а после выбора имя файла поместится в переменную (здесь — 'file'). Команда же 'rez = Application.GetSaveAsFilename' отобразит окно сохранения файла, в переменную же (здесь — rez) будет помещено True — если сохранение успешно, и False — если нет. Обе команды докускают указание параметров (например, меняющих заголовки окна и других).
Иногда возникает необходимость вызвать из макроса какое-либо диалоговое окно, но так, чтобы такой вызов ничем не отличался от «ручного», производимого через пункты меню Word. А возможно это не всегда: так, команда 'Dialogs(wdDialogEditFind). Show' действительно вызывает окно поиска, но при этом в случае ввода в него фрагмента, которого в тексте нет, не отображается сообщение о безрезультатности поиска.
Тем не менее вызвать из макроса данное окно так, чтобы оно работало точь-в-точь так же, как и «обычное», можно — для этого следует использовать имеющуюся в VBA функцию SendKeys, которая передает активному окну нажатия клавиш — как если бы они были нажаты на клавиатуре. Подробнее об этой функции вы можете прочитать в Справке по VBA, а использовать ее для вызова диалогового окна можно, к примеру, так:
Sub prog()
SendKeys '^f'
End Sub
предполагая, что комбинация клавиш Ctrl+f вызывает окно «Найти», как, впрочем, устанавливается по умолчанию. Список кодов функциональных клавиш — в Справке.
Если Вы используете функцию 'SendKeys', то вызванное ею окно будет вести себя абсолютно так же, как при ручном вызове. Однако помните, что если пользователь переопределит