Тема 2.10 Интеграция с внешними приложениями
Автоматизация, ранее известная как OLE-автоматизация, - это технология, позволяющая включать функциональные средства любого Windows-приложения в другое приложение посредством программного кода. Другими словами, автоматизация - это процесс управления одним приложением посредством другого. Использование другого приложения как источника новых средств и инструментов значительно расширяет возможности вызывающего приложения, причем это даже не всегда требует написания соответствующих процедур VBA. Можно, например, организовать показ слайдов с музыкальным сопровождением (используя средства PowerPoint), которые будут отображать данные рабочей книги Excel.
Для того чтобы использовать автоматизацию, необходимо располагать инсталлированным приложением, средствами которого вы хотите воспользоваться, и это приложения должно поддерживать технологию автоматизации. Большинство приложений, работающих под Windows, полностью поддерживают автоматизацию. В этом случае говорят, что они открыты , т.е. доступны все коллекции их объектов, свойств, методов и событий. Возможность использовать открытые объекты - это то же самое, что и возможность использовать средства приложения.
Основы автоматизации
При работе со средствами автоматизации надо хорошо понимать роль и назначение каждого участвующего приложения: различают управляющее приложение, или приложение-клиент, и приложение-сервер. Приложение-клиент управляет приложением-сервером. Visual Basic - прекрасный пример управляющего приложения. Приложение-сервер открывает свои объекты, которые может использовать другое приложение. В рамках этой книги Excel является приложением-клиентом. Стандарт DDE (Dynamic Data Exchange -динамический обмен данными) и метод SendKeys позволяют работать с приложениями, которые не поддерживают технологию OLE-автоматизации.
Ссылка на библиотеку объектов приложения-сервера
Многие приложения, которые поддерживают технологию автоматизации, имеют библиотеки объектов. Библиотека объектов содержит информацию, необходимую приложению-клиенту для управления объектами приложения-сервера. Для получений доступа к этой библиотеке надо создать на нее ссылку из управляющего приложения, такого как Excel. Рассмотрим, как Excel будет управлять приложением Microsoft Word, т. е. Word будет приложением-сервером, и надо создать ссылку на библиотеку его объектов. Для этого, находясь в редакторе Visual Basic, выполните команду Tools>References (Сервис>Ссылки). Откроется диалоговое окно References, показанное на рис. 9. Установите флажок Microsoft Word 9.0 Object Library (Библиотека объектов Microsoft Word 9.0) и щелкните на кнопке ОК. В текущий проект будет добавлена ссылка на эту библиотеку.

Рис.9. Список доступных ссылок на серверы автоматизации
Просмотр библиотеки объектов
Окно просмотра объектов Object Browser позволяет просматривать все библиотеки объектов, на которые установлены ссылки. Здесь приведены списки всех доступных объектов и их свойств, событий и методов. Для просмотра библиотеки объектов Microsoft Word сначала выполните команду View > Object Browser (Вид > Просмотр объектов), которая открывает окно Object Browser. Выберите Word из списка проектов и библиотек (самый верхний раскрывающийся список в окне Object Browser), отобразится содержимое библиотеки объектов Word (рис. 10). Здесь можно выбрать любой объект этой библиотеки и просмотреть все его свойства и методы.
Рис. 10. Окно просмотра объектов
Создание экземпляра приложения-сервера
Задание ссылки на соответствующую библиотеку объектов - это необходимое, но недостаточное условие для использования объектов этой библиотеки. Нужно также с помощью процедуры создать экземпляр приложения-сервера. Для этого используется оператор CreateObject (Создать объект). Только после создания экземпляра приложения-сервера можно использовать все открытые объекты этого приложения, а также их свойства и методы. В листинге 32 приведен код, создающий экземпляр Word.
Листинг 32. Создание экземпляра Word
Dim у As Word.Application
Set у = CreateObject("Word.Application")
После создания экземпляра приложения-сервера, можно использовать его объекты, свойства и методы точно так же, как и объекты, свойства и методы Excel. Из этого следует, что можно записать макрос в Word, а затем полученный код вставить в процедуру Excel. Далее в код при необходимости можно внести изменения, или как-нибудь еще использовать этот код.
Использование объектов Microsoft Word
Рассмотрим простое приложение, вставляющее диапазон ячеек рабочего листа Excel в письмо, созданное в Word. В программе Word создадим документ следующего содержания:
Менеджеру по продажам Посылаю Вам таблицу с итоговыми данными по объемам продаж. Если у Вас есть вопросы, то свяжитесь со мной. С уважением, Босс
Сохраните этот текст в файле letter.doc. Теперь вставим в письмо две закладки. Закладка - это поименованное место в документе Word. Для вставки закладок выполните следующие действия.
- Установите курсор в начало фразы Менеджеру по продажам.
- Выполните команду Вставка > Закладка, откроется диалоговое окно Закладка.
- Введите Регион в качестве имени закладки и щелкните на кнопке Добавить.
- Добавьте пустую строку перед С уважением. Установите курсор в эту пустую строку и вставьте закладку Данные.
- Сохраните и затем закройте документ.
Перейдите в Excel и создайте таблицу с данными, подобную приведенной на рис. 11. Эта таблица далее будет скопирована и вставлена в документ letter.doc. Вернитесь в Word и начните запись макроса с именем Данные_продажи, предварительно открыв новый документ. Для начала записи макроса в Word необходимо выполнить те же действия, что и в Excel. Прежде всего выполните команду Сервис > Макрос > Начать запись.

Рис. 11. Таблица данных, которую надо вставить в письмо
Во время записи макроса выполните следующие действия.
- Выберите команду Файл > Открыть и откройте документ letter.doc.
- Выполните команду Правка > Перейти. В диалоговом окне Найти и заменить на вкладке Перейти в списке Объект перехода выберите пункт Закладка, а затем в раскрывающемся списке Введите имя закладки выберите Регион. Щелкните на кнопке Перейти.
- Теперь выберите закладку Данные и щелкните на кнопке Перейти.
- Щелкните на кнопке Закрыть для удаления диалогового окна Найти и заменить.
- Остановите запись макроса.
Листинг 33. "Остаток" процедуры Данные продажи
Sub Данные_продажи()
Documents.Open FileName:="Письмо.doc"
Selection.GoTo What:=wdGoToBookmark, Name:="Регион"
Selection.GoTo What:=wdGoToBookmark, Name:="Данные"
End Sub
Этот код будет основой процедуры, которую мы создаем в Excel. Скопируйте эту процедуру в буфер обмена. Закройте Word, вернитесь в Excel и откройте редактор Visual Basic. Добавьте модуль в текущую рабочую книгу и вставьте в него скопированную процедуру. Теперь надо создать экземпляр Word, а также перед каждой строчкой процедуры поставить имя переменной, соответствующей экземпляру Word. Самый простой способ сделать это - применить оператор With. Код измененной процедуры показан в листинге 34.
Листинг 34. Процедура Данные продажи с экземпляром Word
Sub Данные_продажи()
Dim y As Word.Application
Set y = CreateObject("Word.Application")
With y
.Documents.Open FileName:="Письмо.doc"
.Selection.GoTo What:=wdGoToBookmark, Name:="Регион"
.Selection.GoTo What:=wdGoToBookmark, Name:="Данные"
End With
End Sub
Осталось добавить код, копирующий таблицу данных в Excel и вставляющий ее в документ Word. Полный код процедуры приведен в листинге 35.
Листинг 35. Законченная процедура Данные продажи '
Sub Данные_продажи()
Dim y As Word.Application
Set y = CreateObject("Word.Application")
With y
.Visible = True
.Documents.OpenFileName:="C:\Мои документы\letter.doc"
Worksheets("Лист1").Range("B1").Copy
.Selection.GoTo What:=wdGoToBookmark, Name:="Регион"
.Selection.Paste
Application.CutCopyMode = False
Worksheets("Лист1").Range("A3:D11).Select
.Selection.Copy
.Selection.GoTo What:=wdGoToBookmark, Name:="Данные"
.Selection.Paste Application.CutCopyMode = False
End With
End Sub
Первый оператор .Visible = True устанавливает свойство Word Visible (Видимый) как True, тем самым открывая окно программы Word и выводя его на передний план. Далее открывается документ Письмо. Затем копируется содержимое ячейки В1, содержащей название региона, осуществляется переход к закладке Регион и вставляется содержимое ячейки В1. Установка свойства Excel cutCopyMode (Режим вырезания и копирования) как False снимает выделение с ячейки В1:
.Documents. OpenFileName:="C:\Мои документы\letter.dос"
Worksheets("Лист1").Range("B1").Copy
.Selection.GoTo What:=wdGoToBookrnark, Name:="Регион"
.Selection.Paste
Application.CutCopyMode = False
Затем аналогичная процедура копирования и вставки выполняется для диапазона А3:D11. Результат работы программы приведен на рис. 12.

Рис. 12. Документ Word со вставленными данными Excel
В заключение перечислим этапы выполнения этого примера.
- Создание файла в приложении-сервере.
- Создание таблицы данных в Excel (приложении-клиенте).
- Запись макроса в приложении-сервере.
- Копирование кода записанного макроса и вставка его в процедуру, создаваемую в Excel.
- Изменение процедуры Excel для создания экземпляра приложения-сервера.
Как видно из примера, использование технологии автоматизации позволяет внедрять и использовать объекты других приложений в проектах VBA.
CC-BY-CA Анатольев А.Г., 22.04.2014