Полезные советы
·
Настройки программы можно сохранять в системном реестре Windows. Для этого служит команда "SaveSetting", с помощью которой можно поместить в системный реестр строку или число. Она имеет формат "SaveSetting "Имя приложения","Имя раздела", "Ключ", "Значение"". Имя приложения, имя раздела и ключ - указатели места, в котором сохраняется Значение. Получить значения из реестра можно командой "GetSetting" с синтаксисом "GetSetting "Имя приложения","Имя раздела", "Ключ", "То значение, которое следует вернуть, если такого ключа, как указанный в предыдущем параметре, в реестре нет"", а удалить - командой "DeleteSetting "Имя приложения","Имя раздела", "Ключ"". Например:
SaveSetting "Макросы", "Макрос1", "Имя папки", "C:\MyPapka"
papka = GetSetting "Макросы", "Макрос1", "Имя папки", "C:\Docs"
· Записать список всех установленных в системе шрифтов в массив можно таким способом:
ReDim shrifti(FontNames.Count) As String
For r = 1 To FontNames.Count
shrifti(r) = FontNames(r)
Next r
WordBasic.SortArray shrifti()
(В массив "shrifti()" размером в количество шрифтов в системе помещается список имен всех установленных в системе шрифтов. Команда "WordBasic.SortArray" сортирует его по алфавиту.)
· Условие "If Selection.Type = wdSelectionIP Then …" выполнится, только если в документе не выделен фрагмент текста.
· Если вы решили хранить какую-нибудь информацию, нужную при работе программы, в отдельном файле, не стоит экспериментировать с командами чтения и открытия файла типа "open", "write" и др. Просто открывайте файл в Word как текстовый с помощью команды "Documents.Open …" и пишите в него обычными средствами записи текста: "Selection.Text = "Мой текст"".
· Посмотрите повнимательнее свойства, объекты и методы таких объектов, как "Application" и "System" (для этого достаточно набрать название объекта и поставить после него точку, - список возможных продолжений отобразится сам). Среди них можно найти немало весьма интересных и полезных, вроде средства задания и получения значений ширины и высоты окна Word, информации о языке данной версии Office, метод чтения данных из произвольного места реестра и многое другое.
· С помощью фрагмента кода
Set MyData = New DataObject
MyData.SetText "Мой текст"
MyData.PutInClipboard
можно поместить текст в буфер обмена, не используя активный документ.
· С помощью команды "Options.DefaultFilePath("константа названия папки")" можно получить пути и имена папок, перечисленных в диалоговом окне Word "Сервис" - "Параметры" - "Расположение". Все константы перечислены в справке VBA по слову "DefaultFilePath", а об их значении можно легко догадаться, переведя название константы с английского.
· Если у одного из элементов формы установить свойство Cancel в True, то нажатие кнопки Esc будет эквивалентно клику мыши на этом элементе.
· Если вы пишете инсталлятор для ваших программ, который помещает шаблоны с макросами в папку автозагружаемых файлов Word[12], то совсем необязательно требовать перезагрузки редактора, чтобы макросы из помещенного в эту папку шаблона стали доступны. VBA позволяет активизировать такие шаблоны без перезагрузки Microsoft Word - для этого существует специальная команда
AddIns.Add("полное имя шаблона, включая путь к нему и расширение").Installed = True
Эта команда эквивалентна ручному подключению шаблона с макросами через меню 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_ MACHINE\Software\Microsoft\Shared Tools\ Text Converters\Export\HTML\Options\Show EncodingDialog" как "No". Установить этот параметр реестра можно и программно с помощью команды "System.PrivateProfileString("", "HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\Text Converters\ Export\HTML\Options", "ShowEncodingDialog") = "No""
· Если Вы закрыли исходный код Вашей программы на 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", то вызванное ею окно будет вести себя абсолютно так же, как при ручном вызове. Однако помните, что если пользователь переопределит заложенную Вами в макрос комбинацию клавиш, то Ваша программа начнет работать некорректно.
· Помимо привычных кнопок и выпадающих меню в Word существует еще несколько типов элементов вызова команд и программ - поля ввода и выпадающие меню выбора. К примеру, элемент "Выпадающее меню с полем ввода" используется для указания масштаба просмотра документа на панели "Стандартная" или для ввода вопроса к справочной системе в OfficeXP.
Создать такое поле можно только программно - через окно настройки это сделать нельзя (как, впрочем, и удалить их впоследствии). Для этого следует в окне отладки или в отдельном модуле выполнить команду
CommandBars(x).Controls.Add Type:=y
где "х" - номер панели (можно узнать, просто перебрав их все с помощью команды "MsgBox CommandBars(номер).Name" и выяснив, какой номер имеет панель инструментов с нужным названием), а "y" - одна из констант: "msoControlEdit", "msoControlDropdown", "msoControlComboBox", создающие соответственно поле ввода текста, выпадающее меню и выпадающее меню с возможностью ввода текста.
Управлять созданными полями, добавляя, к примеру, в них текст, можно стандартными командами работы с панелями инструментов. Так, чтобы поместить какой-либо текст в поле ввода, следует использовать команду
CommandBars(x).Controls(y).Text = "текст в поле ввода"
где "х" - номер панели, "y" - номер по счету слева направо данного поля среди кнопок этой панели. Таким образом можно использовать эти элементы для отображения нужной пользователю информации. Точно так же - командой "a=CommandBars(x).Controls(y).Text" можно считать информацию из данного поля и использовать ее в работе программы.
Следует лишь внимательно следить за соответствием номеров кнопок их реальному расположению, - при изменении порядка кнопок программа может работать неверно. Назначить макрос кнопке, меню или полю ввода можно командой "CommandBars(x). Controls(y).OnAction = "Имя модуля.Имя программы"".
· Для работы из одного приложения Office с другим можно использовать технологию ActiveX. Она основана на имеющейся в Office возможности представлять одну программу в другой как некий объект, с которым можно работать теми же командами, что используются при непосредственной работе с этой программой. Так, чтобы можно было из Word'овского макроса работать с Excel'ем, следует создать объект "Excel.Sheet":
·
Dim es As Object
Set es = CreateObject("Excel.Sheet")
Здесь "es" - простое наименование переменной, может быть любым.
(Если надо сразу открыть какой-либо файл Excel'а, то можно использовать команду "GetObject":
Set es= GetObject("Путь к файлу Excel'а"))
При желании можно сделать созданный объект Excel видимым:
es.Application.Visible = True
Теперь можно этому объекту es (т.е. просто запущенному Excel'у) посылать команды такие же, как и в макросах Excel'а (предваряя текстом "es.Application." те из команд, которые не требуют прямого указания объекта, - так как надо дать понять программе, что работа идет именно с Excel'ем). Так, чтобы открыть файл Excel'а, можно также дать команду
es.Application.Workbooks.Open FileName:="Путь к документу Excel'а"
а чтобы, например, поместить в первую ячейку открытой книги текст, используйте команду
es.Cells(1, 1).Value = "Это столбец A, строка 1"
Закрыть Excel можно командой
es.Application.Quit
Set es = Nothing
Можно даже вызвать на исполнение макрос, содержащийся в книге Excel.Для этого следует использовать команду
es.Application.Run "имя макроса"
Так что есть простор для творчества.