Иллюстрированный самоучитель по Microsoft Access 2002

Обмен данными с 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.