Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Статьи об Excel

МЕНЮ САЙТА
  • 1
  • 2
  • 3

КАТЕГОРИИ РАЗДЕЛА
Циклы [4]
Циклы VBA
Операторы ветвления [2]
Модули классов [2]
Создание, поля, свойства, события, когда использовать
Работа с приложениями и библиотеками [2]
Создание надстроек для ексель на .net, вызов компонентов .net

ОПРОСЫ
Какой версией Excel Вы пользуетесь?
Всего ответов: 35789
Главная » Статьи » Программирование на VBA » Работа с приложениями и библиотеками

Автоматизация в Excel. Начало
     При работе с Excel иногда приходиться налаживать взаимодействие программного кода с другими приложениями офисного пакета или вне него, например с Internet Explorer. Так сказать связывать. Для примера возьмем Word, хотя и IE вставим немного.

     Начнем с понятия о позднем и раннем связывании (привязке).

     Управлять Word из других приложений позволяет сервер автоматизации Word. Такой же сервер есть и у других офисных приложений (и не только офисных). В данном случае, сервером будет считаться Word, а клиентом Excel. Из него будут посылаться запросы на выполнение некоторого кода, а сервер автоматизации Word будет обрабатывать эти запросы. Это теоретически означает возможность написания программного кода в Excel, который будет выполняться в Word и использовать встроенные функции Word. Для использования такой возможности необходимо указать ссылку на библиотеку, функционал которой собираемся использовать. В данном случае Word. Это можно сделать двумя путями: указать библиотеку явно, до исполнения программного кода и во время исполнения программного кода.

     Первый способ называется раннее связывание. В меню Tools-References редактора vba выберите Microsoft Word12.0 Object Library. В других версиях офисных пакетов, как вы понимаете, цифры другие.

Это ссылка на файл WSWORD.OLB с библиотекой.
Теперь в браузере объектов доступен объект Word во всей красе своей объектной модели.

При раннем связывании новый экземпляр класса Word будет создаваться так:
Dim WApp As Word.Application
Set WApp = New Word.Application
     Второй способ называется позднее связывание. При этом нет необходимости указывать ссылку на библиотеку. Создается экземпляр класса (объект) и возвращается ссылка на него используя функцию CreateObject.

Синтаксис CreateObject:
CreateObject(класс,[имясервера])

класс - обязательный параметр. Тип данных Variant(String). Имя приложения и класс, на основе которого создается объект. Имеет синтаксис имяприложения.названиекласса
имясервера - необязательный параметр. Имя компьютера в сети, где объект будет создан. Если параметр не указан (пустая строка), объект будет создан на локальной машине.

Примеры создания объекта при позднем связывании:

Создает новый объект Word.Application
Dim WApp As Object
Set WApp = CreateObject("Word.Application")


Создает новый объект Word.Application и делает его видимым.
Dim WApp As Object
Set WApp = CreateObject("Word.Application")
WApp.Visible = True


Создает объект на удаленной машине. Для этой операции необходимо иметь соответствующие права доступа.
Dim WApp As Object
Set WApp = CreateObject("Word.Application", "192.168.1.4")


При наличии нескольких установленных офисных продуктов различных версий в системе, можно указать, на основе какой версии создать объект. Однако если указанной версии на компьютере не окажется, произойдет ошибка.
Dim WApp As Object
Set WApp = CreateObject("Word.Application.12")
Замечания: создаваемый объект Word.Application невидимый. Это ускоряет работу с ним, но в случае возникновения ошибки, он остается в памяти. Используйте WApp.Visible = True в обработчике ошибок. Каждый раз при использовании функции CreateObject будет создан новый объект.

Если объект приложения уже создан, то использовать функцию CreateObject не стоит. Вместо нее целесообразно применять функции GetObject, которая просто возвращает ссылку на объект.

Синтаксис GetObject:
GetObject([путь][,класс])


путь - необязательный параметр. Тип данных Variant(String). Полный путь к файлу, связанному с объектом.
класс - Не обязательный параметр. Тип данных Variant(String). Строка, указывающая, на какой тип объекта будет сделана ссылка. Если параметр путь не указан, тот параметр обязателен.

Примеры ссылки на объект при позднем связывании:

Передает ссылку на существующий объект Word.Application и возвращает количество открытых там документов.
Dim WApp As Object
 Set WApp = GetObject(, "Word.Application")
Debug.Print WApp.Documents.Count


Создает ссылку на открытый в word файл Pacienti.txt и подсчитывает количество строк в нем, однако если документ не открыт, будет ошибка.
Dim WDoc As Object
Set WDoc = GetObject(ThisWorkbook.Path & "\Pacienti.txt")
Debug.Print WDoc.Sentences.Count


Вот пример с перехватом ошибки отсутствия открытого файла:
Dim WDoc As Object
 On Error GoTo cvv_Error
 Set WDoc = GetObject(ThisWorkbook.Path & "\Pacienti.txt")
 Debug.Print WDoc.Sentences.Count
 On Error GoTo 0
 Exit Sub
cvv_Error:
 If Err.Number = 432 Then MsgBox "Файл " & ThisWorkbook.Path & "\Pacienti.txt" & " не открыт..."


Вот пример позднего связывания с Internet Explorer:
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
 IE.Visible = True
Ну а для раннего связывания с этим браузером, необходимо дать ссылку на библиотеку Microsoft Internet Controls. Ну а если планируется работать с интернет страницами (разбор структуры и данных), то и Microsoft HTML Object Library.

     У позднего связывания только одно преимущество: ссылка на библиотеку не слетит никогда (если приложение зарегистрировано в системе). Используйте этот способ, если не уверены, что у конечного пользователя версия офисного пакета совпадет с вашей. В любом другом случае лучше использовать раннее связывание, и на это две причины:
1.    Объектная модель приложения доступна в браузере объектов Excel.
2.    Быстродействие не страдает, и работают все функции.

Вместо послесловия:
     В этой маленькой статье я рассказал о способах подключения к объектной модели приложения. Как ее использовать – огромная, требующая отдельных статей тема. Конечно, использовать приложения не зная их объектной модели не получится. Используйте автоматизацию с умом, без лишних выдумок. Видел я как-то приложение в Excel, которое, чтобы вставить данные из таблицы Access на лист, создавало экземпляр Access, открывало файл базы данных, затем из этого экземпляра  копировало таблицу на лист, затем закрывало экземпляр. Хотя проще и быстрее было использовать доступ к данным при помощи ADO или даже DAO…



Категория: Работа с приложениями и библиотеками | Добавил: ratboy (23.05.2012)
Просмотров: 8109 | Комментарии: 2 | Рейтинг: 5.0/1


Всего комментариев: 2
0   Спам
1    imort   (04.12.2013 11:50)
   Если бы я не понимал, что такое "Раннее и позднее связывание", - смысл статьи я бы не понял.
PS: ADO универсальнее для продуктов MS.

0   Спам
2    svetacrazy   (13.07.2015 18:33)
   Что такое ранее и позднее связывание?) Желательно простым языком)

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!