Обмен данными с Microsoft Word в системе автоматизации
В настоящем разделе будут рассмотрены несколько примеров управления объектами Microsoft Word из процедур VBA: открытие и печать документа, слияние документов для почтовых рассылок и заполнение полей в документе Word данными из БД Microsoft Access.
Иерархия объектов VBA приложения Microsoft Word
Так же как и при использовании объектной модели Microsoft Excel, познакомимся сначала с некоторыми объектами объектной модели Microsoft Word.
- Объект Application – ссылается на активное приложение Microsoft Word. Через этот объект можно получить доступ ко всем остальным объектам модели. Объект Application имеет свойства ActiveDocument и ActiveWindow, которые представляют собой активный документ и активное окно соответственно. Можно указать Word.Application в качестве значения аргумента <класс> функций CreateObject() и GetObject() и в операторе Dim <объектнаяПеременная> As New <класс>.
- Объект Document – является глобальным объектом и, так же как и объект Application, может использоваться в коде автоматизации в качестве значения аргумента <класс> функций CreateObject() и GetObject() и в операторе Dim <объектнаяПеременная> As New <класс>. Семейство Documents представляет собой набор всех документов, открытых в Word.
- Объект Selection – представляет собой выделенную область в окне документа Word или точку вставки. Каждый документ может иметь только одну область выделения, и только одна область выделения открытых документов может быть активна в некоторый момент времени. Это означает, что всегда существует только один объект Selection. Объект Selection подчинен объекту Application, а создается при применении метода Select к объекту Document.
- Семейство windows объекта Application представляет собой набор всех окон приложения Word.
- Семейство Bookmarks подчинено объекту Document, и каждый объект этого семейства представляет собой закладку в документе.
- Объект Range представляет собой непрерывную область текста в документе Word. Диапазоны, как и закладки, используются для идентификации текста в документе, однако, в отличие от закладок, диапазоны существуют только во время выполнения процедур VBA. Диапазоны не зависят от области выделения в документе. Можно работать с диапазоном, не затрагивая области выделения. Диапазонов в документе может быть несколько.
Открытие документа Word
Для того чтобы открыть документ Word, можно использовать любой из перечисленных ранее способов создания экземпляров класса объекта автоматизации. Ниже приводятся примеры процедур VBA для открытия документа. В первой используется функция CreateObject (), а во второй – GetObject(). Для проверки кода этих процедур вы можете, так же как и при работе с объектами приложения Excel, использовать окно отладки.
Sub
OpenDocument()
Dim
wda
As
Word.Application
Set
wda = CreateObject(
"Word.Application"
)
With
wda
.Visible =
True
.Documents.Open
"C:\Doc\Letter.doc"
End
With
'операции над документом wda.Quit Wda.Nothing
End
Sub
В данном случае независимо от того, запущен ли уже Word, программа запустит еще один его экземпляр и в нем откроет файл Letter.doc. После того как все операции с документом закончены, нужно закрыть Word, для чего используйте метод Quit. Если при этом документ был изменен, то приложение Word выдаст сообщение, спрашивающее о том, нужно ли сохранить изменения. При этом программа приостанавливает выполнение и ждет указания пользователя. Таких ситуаций следует избегать.
Если все изменения делались программно, то лучше сначала закрыть документ, выполнив команду:
wda.ActiveDocuments.Close
False
Окно документа будет закрыто, при этом все изменения будут сохранены. Если же нужно, чтобы пользователь мог посмотреть сделанные программой изменения и при необходимости что-то откорректировать, можно не закрывать приложение в программе, а предоставить сделать это пользователю.
В следующей процедуре для открытия документа используется функция Getobject (). То есть сначала делается попытка проверить, не запущен ли уже Word. Если он еще не запущен, будет сгенерирована ошибка (код ошибки: 429). Программа перехватит эту ошибку и использует функцию CreateObject(), чтобы запустить Word. Если Word уже запущен, то новый документ будет открыт в этом же экземпляре приложения. Затем документ выводится на печать, после чего закрывается либо документ, либо приложение в зависимости от значения флага (modeFlag). Значение флага показывает, запускался ли экземпляр Word, или документ был добавлен к другим открытым документам:
Sub
OpenPrintDocument()
Dim
wda
As
Word.Application
Dim
modeFlag
As
Boolean
On
Error
GoTo
ErrStartWord
modeFlag =
True
'устанавливаем флаг операции
Set
wda = GetObjectf,
"Word.Application"
)
With
wda
.Visible =
True
.Documents.Open
"C:\Doc\Letter.doc"
.ActiveDocument.Printout
Do
While
.BackgroundPrintingStatus <> 0
DoEvents
'ждем, пока документ напечатается
Loop
If
modeFlag
Then
.ActiveDocument.Close
'закрываем только документ
Else
.Quit
'закрываем все приложение
End
If
End
With
Set
wda =
Nothing
Exit
Sub
ErrStartWord:
If
Err.Number = 429
Then
'Word не запущен
Set
wda = CreateObject(
"Word.Application"
)
modeFlag =
False
'сбрасываем флаг
Resume
Next
'возвращаемся к оператору, следующему за тем, который вызвал ошибку Else
'выдаем диалоговое окно с сообщением и номером ошибки
MsgBox Err.Description &
" "
& Err.Number, vblnformation
Exit
Sub
'выходим из процедуры
End
If
End
Sub