трудоемким процессом, зачастую затраты времени и сил на создание приемлемого графического интерфейса программы превосходили затраты на реализацию собственного алгоритма программы, ради которого она и создавалась. Недаром были очень распространены так называемые «консольные» приложения, то есть программы, работающие только из командной строки, без интерфейса, — ввод данных происходил в той же командной строке или производился из указанного в ней файла, а вывод результатов шел в простом текстовом режиме.
С появлением операционной системы Windows каторжный труд программистов по разработке внешнего вида программы и удобных способов ввода и вывода информации резко облегчился, — уже в Windows 3.0 использовались функции API. Теперь программист, если он, например, желал создать окно ввода текста или полосу прокрутки, должен был всего лишь написать вызов функции отображения такого окна с необходимыми ему параметрами, так же, как и любой другой функции языка, на котором он писал свою программу, а не вводить огромные обьемы кода ради создания программы, заново рисующей такое окно или полосу (сознавая при этом, что при разработке следующей программы, в которой тоже будут использоваться такие объекты, ему придется вновь разрабатывать такой код или пытаться частично использовать старый, приспосабливая его к нуждам этой новой программы). Поэтому появление API совершило революционный прорыв в технологии программирования, позволяя создавать нужные программы с привычным удобным интерфейсом гораздо быстрее, не заботясь о таких рутинных деталях, как программирование стандартных объектов интерфейса для ввода и вывода информации.
В языке Visual Basic for Applications (VBA) многие функции и процедуры API вызываются сами при выполнении программы интерпретатором, так что использовать их для отображения окон ввода и вывода текста, рисования на экране геометрических фигур и других простых действий совершенно нет необходимости, — их VBA вызывает по мере надобности, а программе на нем достаточно использовать соответствующие функции этого языка. Однако иногда возникает необходимость в некоторых действиях, для которых либо нет аналогов во встроенных функциях VBA, либо они работают нерационально или слишком медленно. Например, окно выбора папки с изображением дерева каталогов (рис. 5.1) или программа поиска файлов (аналог на функциях VBA — объект 'Application.FileSearch' — работает слишком медленно при больших количествах файлов). Для таких случаев в VBA предусмотрена возможность вызова функций API.
Рис. 5.1.
К сожалению, использование функций API в VBA не документировано в справке, вследствие чего для изучения способов их применения приходится либо искать книги или источники в Интернете по офисному программированию, либо анализировать код программ, в которых имеются вызовы функций API. О некоторых из таких программ рассказано в следующей главе.
В подавляющем большинстве случаев при программировании для Office можно обойтись без использования API, но иногда только вызов API-функции может привести к достижению нужного результата. Скажем, вам надо обеспечить вызов разных макросов при простом нажатии мышью кнопки на какой-либо панели инструментов Word и в случае одновременного нажатия этой кнопки и клавиши Shift или Control. Вот фрагмент кода, делающего это:
Declare Function GetAsyncKeyState Lib 'user32.dll' (ByVal kState As Long) As Integer
Sub Program()
GetAsyncKeyState (vbKeyShift Or vbKeyControl)
If GetAsyncKeyState(vbKeyShift) Then
Call macro1: Exit Sub
ElseIf GetAsyncKeyState(vbKeyControl) Then
Call macro2: Exit Sub
End If
Call macro3
End Sub
Первая строчка — это как бы «резервирование» функции API для использования в программе на VBA. Видно, что вызывается функция GetAsyncKeyState из библиотеки (файла, содержащего программы, предназначенные только для использования другими программами) user32.dll, причем в эту функцию передается номер клавиши, а возвращает она целое число (а именно — 0, если клавиша с соответствующим номером не нажата, и -32767 или 1, если нажата). Любую функцию или процедуру, вызываемую из библиотек, не относящихся к VBA, необходимо так резервировать с помощью команды Declare.
Фраза vbKeyShift в команде — это заменитель кода клавиши Shift (его значение — 16), а vbKeyControl, как нетрудно понять — заменитель кода клавиши Control. Структура инструкций 'If…Then', думается, ясна,[9] а если нет — посмотрите в справке VBA. Команда Call перед именем макроса, как вы помните, означает его запуск.
В Интернете есть русские сайты, посвященные API.[10] Посетите их, чтобы узнать больше об этом наборе функций.
Настройка вызова программы. Последние штрихи
Когда программа написана и отлажена, необходимо придать ей 'товарный вид', — убрать лишние команды и модули, сделать способ вызова программы — кнопку или пункт меню, может быть, создать панель инструментов для кнопок. Без этого даже с очень хорошо написанной программой сможет работать лишь ее создатель, да и то не всегда. К тому же красивая обложка всегда радует глаз.
Для начала нужно просмотреть весь код и выкинуть все лишнее — закомментированные ненужные команды, излишние комментарии. Потом следует определить, какие модули и формы являются компонентами готовой программы, а какие, возможно, были написаны для других программ или в качестве экспериментальных и запомнить их названия.
Далее надо решить, в каком формате программу стоит оформить — как шаблон Word, как автозагружаемый шаблон Word или как простой документ? Если программа предназначена для одномоментных нечасто используемых расчетов и не работает с текстом документа, то ее проще всего поместить в документ Word. При необходимости его можно будет открыть и выполнить программу. Если программа как-то оформляет текст особого документа, который надо создавать отдельно от всех (к примеру, программа для красивого форматирования поздравительных открыток), то ее лучше оформить как шаблон и создавать на его основе документы, а потом уже эти документы заполнять содержанием с помощью программы. Ну, а если программа выполняет какие-нибудь серьезные операции с текстом, постоянно требуется или работает с многими документами сразу, то тогда ей прямая дорога в папку автозагружаемых файлов Word.
Потом необходимо создать документ с программой. Для этого создается пустой документ необходимого формата — шаблон или простой файл Word, а затем с помощью диалогового окна Word «Организатор» ('Сервис — Макрос — Макросы — Организатор' или 'Сервис — Шаблоны и надстройки- Организатор') в него копируются все готовые компоненты программы из шаблона или документа, где велась разработка. Документ сохраняется под каким-нибудь красивым именем.
И, наконец, делается способ вызова программы. Можно с помощью диалогового окна 'Сервис — Настройка — Команды — Макросы' назначить макросу пункт меню или кнопку на стандартной панели путем простого перетаскивания. Можно там же назначить ему комбинацию клавиш для вызова. А можно, что считается лучшим вариантом, создать новую панель инструментов и уже на ней поместить кнопки для вызова макросов. Надо только сохранить все изменения именно в документе с макросами, а не в своем Normal.dot или где-нибудь еще.
В окне 'Сервис — Настройка — Команды — Макросы' название каждого макроса отображается так: сначала пишется имя проекта (его можно посмотреть и изменить в Окне свойств редактора VBA, выделив