Введение в технологию OLE Automation. Урок 1. Основные понятия
Многие авторы хотели бы использовать непосредственно из Access доступ к другим приложениям офиса, но не догадываются, как это сделать правильнее. Как вариант - средство Automation одно из наиболее важных средств технологии ActiveX, позволяющее программно управлять объектами из других приложений. Само собой, что при связи приложений существует "Источник» (объектами которого управляют) И приемник (контролер) - управляющее объектами приложения.
При программном управлении чем либо надо
1. Подключить библиотеку управляемых объектов необходимого приложения.(в случае раннего связывания см. ниже. Рекомендуется это делать сразу, тогда повышается производительность приложения.) 2. Создать переменную, представляющую собой объект управляемого приложения 3. Для доступа к объектам приложения - источника надо использовать эту переменную. 4. После окончания работы с приложением надо освободить переменную, присвоив ей значение Nothing (Set obj = Nothing) Ниже приведен неполный список типов и классов объектов Automation, которые будут использованы нами для доступа к различным приложениям офиса.
Приложение
Объект
ProgID
Комментарий
Excel
Application
Excel.Application
Excel.Application.9
Workbook
Excel.Sheet
Книга с 1 листом
Excel.Sheet.8
Excel.Chart
Книга с 2 листами - диаграмма и данные
Excel. Chart.8
Access
Application
Access.Application
Access.Application.9
CurrentData
Access.CodeData
Access.CurrentData
CurrentProject
Access.CodeProject
Access.CurrentProject
Word
Application
Word. Application
Word. Application.9
Document
Word.Document
Word.Document.9
Word.Template.8
PoverPoint
Application
PoverPoint. Application
PoverPoint. Application.9
Outlook
Application
Outlook.Application
Outlook.Application.9
Указанный ProgID в общем случае таков: Applic_name.ObjectType , где Applic_name - имя источника объектов (библиотеки объектов), но не факт что это имя приложения. ObjectType - тип или класс объектов.
Пример - при управлении мною Outlook express 5.0 был указан ProgID Msoeobj.Messagelist или при работе с файловой системой Scripting.FileSystemObject В принципе, нужный progID можно получить используя Браузер доступных объектов в окне редактора VBA. (F2 вызывает его окно) Если использовать ProgId без указания версии, то будет создан объект на основе самой последней установленной версии.
Для доступа к объектам automation используются всего две функции
Createobject (class,[servername]) - возвращает и создает ссылку на объект activeX Class - имя объекта Automation Servername - параметр используется только в сетевых приложениях, при создании объекта Automation в сети и устанавливает имя сервера - источника объекта Automation.
Getobject([path_name],[class]) - возвращает и создает ссылку на объект ActiveX, сохраненный в файле. Pathname - Полное имя файла. Если параметр опущен, то надо указать параметр Class обязательно Class - имя объекта Automation
В этих двух функциях есть подобие, но есть и различие между ними. Функцию Getobject используют не только для доступа к существующим документам, но и для доступа к любому уже запущенному приложению Office. Для этого запускаем Getobject без первого параметра. Когда нет необходимости запускать еще один экземпляр приложения, что происходит при работе с Createobject.
Для примера приведем несколько кодов иллюстрирующих работу с этими функциями.
Public Sub open_object() 'Объявляем переменные 'При объявлении переменной Variant программа 'резервирует большой кусок памяти Dim word_applic_create As Variant 'Самый общий случай.
'Более частный случай. Мы точно знаем, что это будет объект. ' уже лучше. Dim word_applic_get As Object
Set word_applic_create = CreateObject("word.application.9") 'Создали объект Ворд
Set word_applic_get = GetObject(, "word.application.9") ' создали еще одну переменную обращающуюся к тому же самому ' приложению, а не запустили еще одно. ' далее следует нужный вам код ' закрываем объекты. Не путайте очередность, иначе ' обращение к word_applic_get после закрытия приложения ' созданного word_applic_create - приведет к ошибке Set word_applic_get = Nothing ' Освободили переменную 'не надо забывать закрывать приложение перед освобождением переменной 'иначе оно останется открытым (по умолчанию) word_applic_create.Quit ' закроется только то приложение, что было создано. 'Если открыты еще несколько, то это им не повредит. Set word_applic_create = Nothing ' уничтожили все следы работы с объектом activeX End Sub
Однако существует способ проверить, запущено приложение office или нет используя только метод getobject. В следующем примере проверяется, запущено ли приложение excel, и если нет, то оно запускается.
Public Sub get_or_open() Dim Excel_applic_create As Object ' обьявили переменную On Error Resume Next 'включили переход по ошибке на следующую команду ' наугад вызвали открытый объект Excel Set Excel_applic_create = GetObject(, "Excel.Sheet.8") ' Если приложение закрыто - это вызовет ошибку 429 ' если это именно 429 ошибка, тогда откроем приложение, иначе обработаем ошибку If Err = 429 Then Set Excel_applic_create = CreateObject("Excel.Sheet.8") _ Else: MsgBox (Err & vbCrLf & Err.Description & vbCrLf & Err.Source) ' сообщение об ошибке On Error GoTo 0 ' Очистили ошибку, и восстановили стандартный обработчик ошибок Excel_applic_create.Application.Visible = True 'Показали всем приложение Excel_applic_create.Application.Quit 'Закрыли его Set Excel_applic_create = Nothing 'Освободили переменную End Sub
Позднее и раннее связывание. Различие в позднем и раннем связывании очень незаметное на первый взгляд, но достаточно важное, что бы не обратить внимание. Итак. При Позднем связывании переменная Automation объявляется как Object (Variant). Такая чрезмерная общность позволяет создать объекты любой природы, но снижает производительность приложения. - Dim word_applic_create As Variant 'Самый общий случай. Dim word_applic_get As Object 'Более частный случай. 'Мы точно знаем, что это будет объект. - Однако в силу позднего связывания в программе будет доступна только объектная модель приложения (в данном случае Word), но не ее константы. И их придется объявлять явно.
Раннее связывание как второй подход - происходит на этапе компиляции. При этом необходимо сослаться на библиотеку объектов необходимого приложения. Либо через меню tools/references редактора VBA Либо программно: Set объект = References.AddFromFile(ИмяФайла) 'Полное имя подключаемой библиотеки
Тогда для достижения наилучшей производительности необходимо определить конкретный тип переменной. Например Dim access_create_object As Access.application.
Или можно перейти к заданию нового объекта Automation, при помощи ключевого слова New. Dim outlook_applic_create As New Outlook.Application
Подытожим повествование: Объектами других приложений управлять можно (и нужно) Как вариант программного управления - это средство Automation технологии ActiveX. Связывание на разных этапах дает разный результат.
MAKC.
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
http://mytraffic.narod.ru
При написании этой статьи использовалась литература издательства BHV г. Санкт - Петербург. Серия "Мастер".