Рассмотрим теперь программу, которая будет выполнять слияние документа Word с данными из таблицы Access. В этой программе мы покажем, как объект Document создается из шаблона документа. Предположим, что у нас есть форма, в которой отображаются отобранные записи о тех сотрудниках, которым мы хотим разослать приглашения. На форме есть кнопка, при нажатии на которую должны формироваться и печататься все экземпляры приглашений. Процедура обработки нажатия этой кнопки выглядит следующим образом:
Private Sub MergeDocument_Click()
Dim wda As Word.Application
Dim rst As Recordset, rstNew As Recordset
Dim db As Database
Dim tdf As TableDef
Dim i As Integer
Set db = CurrentDb()
'
Создаем новую таблицу
Set tdf = db.CreateTableDef("СписокПриглашенных")
With tdf
' Создаем поля таблицы и добавляем их в семейство Fields
.Fields.Append .CreateField("Фамилия", dbText)
.Fields.Append . CreateFieldC'HMH", dbText)
.Fields.Append .CreateField("Обращение", dbText)
.FieIds.Append .CreateField("Должность", dbText)
' Добавляем таблицу в семейство TableDefs
db.TableDefs.Append tdf End With
' копируем записи из формы в созданную таблицу
Set rst = Me.RecordsetClone rst.MoveFirst
Set rstNew = db.OpenRecordset("СписокПриглашенных")
Do While Not rst.EOF
rstNew.AddNew
For i = 0 To rst.Fields.Count - 1
rstNew.Fields(i) = rst.Fields(i)
Next i
rstNew.Update
rst.MoveNext Loop
' создаем объект Application Word
On Error GoTo err_StartWord
Set wda = GetObject(, "Word.Application")
wda.Visible = True
'
открываем документ на основе шаблона - он добавляется в семейство
Documents wda.Documents.Add "C: \Doc\nj»iMiaEieHHe.dot"
' выполняем слияние основного документа и данных из источника
With wda.ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.Execute End With
' печатаем приглашения wda.ActiveDocument.Printout
Do While wda.BackgroundPrintingStatus <> 0
DoEvents Loop
' сохраняем получившийся документ
wda.ActiveDocument.SaveAs "C:\Doc\MailMergeDoc.doc"
' закрываем окно с новым документом
wda.ActiveWindow.Close False
' закрываем, не сохраняя, окно с первоначальным документом
wda.Documents (1).Close False
' если нет больше открытых документов, то закрываем Word If
wda.Documents.Count = 0 Then
wda.Quit End If
' Удаляем временную таблицу
db.TableDefs.Delete "СписокПриглашенных"
db.Close
Set wda = Nothing
Set rst = Nothing
Set rstNew = Nothing
Exit Sub
err_StartWord:
If Err = 429 Then ' Word не запущен
Set wdd = CreateObject("Word.Application")
Resume Next Else
MsgBox Err.Description & " " & Err.Number, vblnformation
Exit Sub End If
End Sub
Сначала создается таблица "СписокПриглашенных" с той же структурой, которая была создана вручную. Затем все данные, отображаемые в форме, записываются в эту таблицу. Все операции с данными выполняются с использованием объектов DАО. Объект Application Word создается с помощью функции GetObject() или CreateObject () в зависимости от того, запущен ли уже Word. Для создания нового документа на основе шаблона используется метод Add семейства Documents. При слиянии основного документа с записями в таблице создается новый документ. Для этого устанавливается значение свойства Destination объекта MailMerge равным константе wdSendToNewDocument. Этот документ уже не содержит поля слияния, а является просто текстовым документом, который можно сохранить в виде файла, задав его имя. Перед сохранением в файле документ выводится на печать. После этого нужно аккуратно закрыть сначала новый документ, потом основной документ, к которому присоединен источник данных, и потом, если нужно, сам Word.