Познавательное

Позднее связывание VBA

  

Позднее связывание предполагает создание объектов Word до установки ссылки на соответствующую объектную библиотеку. Это позволяет использовать любую версию библиотеки Word, содержащую требуемые объекты, методы и свойства. К тому же, версию библиотеки Word можно определить в коде макроса и создавать экземпляры только содержащихся в ней объектов. Недостаток позднего связывания заключается в полной неосведомленности Excel об обращении к объектной модели Word. Помимо невозможности отображения динамических подсказок, Excel не позволяет использовать встроенные константы Word и не может проверить корректность создаваемых ссылок. В результате этого все ошибки, связанные с использованием библиотеки Word, обнаруживаются во время выполнения программного кода. Следующий макрос открывает существующий документ Word и выводит его на экран.

Sub WordLateBinding()
э  Позднее связывание.
Dim wdApp As Object, wdDoc As Object
Set wdApp = CreateObject("Word.Application")
Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & _
"Автоматизация Word.doc")
wdApp.Visible = True
Set wdApp = Nothing
Set wdDoc = Nothing
End Sub

Переменная wdApp содержит ссылку на объект приложения (CreateObject ("Word. Application")) и используется при создании переменной wdDoc, ссылающейся на объект библиотеки Word.
На заметку
Необходимость использования позднего связывания обусловлена выбором типа переменных wdApp и wdDoc (object). Макрос не может создать требуемые ссылки на объекты библиотеки Word до выполнения функции CreateObj ect.


Работа с объектами
В следующих разделах рассматривается создание новых объектов, а также обращение к уже существующим объектам.
Ключевое слово New
Ключевое слово New можно использовать для создания объекта приложения при раннем связывании (см. макрос WordEarlyBinding выше в этой главе). Аналогичного результата позволяет добиться также функция CreateObject, а вот функция GetObject предназначена для получения ссылки на уже существующий объект. Использовать ключевое слово New при позднем связывании нельзя.
Внимание
Если окно созданного экземпляра Word не отображается на экране, откройте приложение Диспетчер задач Windows (Windows Task Manager) и проверьте наличие в памяти компьютера процесса winword.exe. Если процесс запущен, выполните следующую строку кода с помощью окна Immediate (Быстрое выполнение) редактора Visual Basic:
Word.Application.Visible = True

При наличии в памяти компьютера нескольких экземпляров процесса winword.exe выполняйте приведенную выше строку до тех пор, пока не доберетесь
до нужной копии Word, попутно закрывая окна "лишних" экземпляров.

Функция CreateObject
Функцию CreateObject можно использовать для создания нового экземпляра объекта как при позднем (см. макрос WordLateBinding выше в этой главе), так и при раннем связывании. В качестве обязательного параметра функции CreateObject необходимо передать имя приложения и тип создаваемого объекта (например. Word. Application).
Функция GetObject
Функция GetObj ect возвращает ссылку на уже существующий экземпляр объекта. Если обнаружить указанный экземпляр объекта не удалось, генерируется сообщение об ошибке. Первый параметр функции GetObject определяет полный путь к файлу, содержащему требуемый объект. Второй параметр функции GetObject задает класс объекта. Несмотря на то что по отдельности каждый из параметров является необязательным, пропуск первого из них автоматически означает необходимость указания второго.
Sub UseGetObject()
Dim wdDoc As Object
Set wdDoc = GetObject(ThisWorkbook.Path & _
"Автоматизация Word.doc")
wdDoc.Application.Visible = True
Set wdDoc = Nothing
End Sub

Макрос UseGetObject открывает документ внутри существующего экземпляра приложения Word и выводит окно последнего на экран. Поскольку переменная wdDoc ссылается на объект документа, для вывода окна Word на экран используется свойство Application объекта Document (wdDoc .Application. Visible = True).
На заметку
Несмотря на установку значения свойства visible объекта Application равным True, макрос UseGetObject не делает приложение Word активным.

Следующий код пытается вставить диаграмму Excel в конец открытого документа Word, предварительно отключив обработку ошибок. Если на момент
выполнения кода ни один документ Word не был открыт, создается новый документ.
Sub IsWordOpen()
Dim wdApp As Object
ActiveChart.ChartArea.Copy
On Error Resume Next
Set wdApp = GetObject(,   "Word.Application")
If wdApp Is Nothing Then
Set wdApp = GetObject("",   "Word.Application")
End If
If wdApp.ActiveDocument Is Nothing Then
With wdApp
.Documents.Add
.Visible = True
End With
End If
On Error GoTo 0
With wdApp.Selection
.EndKey Unit:=wdStory
.TypeParagraph
.PasteSpecial link:=False, DataType:=wdPasteOLEObject,
Placement:=wdInLine,  DisplayAsIcon:=False
End With
Set wdApp = Nothing
End Sub

Обработка ошибок отключается с помощью строки On Error Resume Next. Ошибка возникает при попытке связать переменную wdApp с несуществующим объектом. В этом случае переменная wdApp не будет иметь значения, чем можно воспользоваться (if wdApp Is Nothing Then) для открытия нового экземпляра Word, создания пустого документа и отображения окна Word на экране. Чтобы открыть новый экземпляр Word, значение первого параметра функции GetObject задается как 11". Возвратиться к обычному режиму обработки ошибок позволяет строка On Error GoTo 0.
 


Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.