Слияние документов для почтовых рассылок


Следующий пример связан с эффектным решением еще одной типовой задачи — созданием серийных документов. Это могут быть письма с одинаковым содержанием, но адресованные разным лицам, или типовые бланки, которые должны оформляться в большом количестве. Задача сводится к тому, что должны существовать шаблон такого документа и некоторая база данных. Требуется создать необходимое количество экземпляров такого документа, вставив в каждый экземпляр существующие данные. Если источником данных является таблица Access или запрос, задача решается просто — достаточно выделить эту таблицу (запрос) в списке в окне базы данных и выполнить команду меню Сервис, Связи с Office, Слияние с MS Word (Tools, Office Links, Merge it With MS Word). Однако может оказаться, что данные для вставки в бланк или письмо определяются достаточно сложно, например представляют собой набор записей — Recordset. Тогда можно создать все бланки программно.
Сейчас мы создадим приглашение сотрудникам фирмы "Борей" на некоторое мероприятие. Мероприятие торжественное и важное, поэтому мы хотим напечатать приглашение на красивом бланке.
Шаблон документа должен быть приготовлен заранее. Рассмотрим, как это можно сделать.

  1. Создайте красивый бланк, пользуясь средством Microsoft Clip Gallery или любой другой библиотекой картинок, рамочек и т. д. (Можно использовать шаблон, присутствующий на компакт-диске, — файл Приглашение.dot). Это будет основной документ для слияния.
  2. Теперь нужно установить связь с источником данных. В программе мы будем использовать в качестве источника данных временную таблицу Access, т. е. таблицу, которая существует только при работе процедуры VBA. Однако для установления связи нужно создать такую таблицу в базе данных. Создайте новую таблицу и определите следующие поля таблицы: "Фамилия", "Имя", "Обращение", "Должность". Назовите ее "СписокПриглашенных".
  3. Откройте файл Приглашение-dot и выполните команду меню Сервис, Письма и рассылки, Мастер слияния (Tools, Letters and Mailing, Mail Merge Wizard). Будет запущен Мастер слияния, который в новой версии Microsoft Word реализован в виде панели задач, расположенной слева на экране
  1. Далее следуйте указаниям мастера. На первом шаге выберите тип документа — Письма (Letter) и нажмите кнопку Далее (Next), чтобы перейти к следующему шагу.
  2. На втором шаге выберите переключатель Текущий документ (Use The current document).
  3. На третьем шаге нужно указать источник данных. Оставьте значение поля Выбор получателей (Select Recipient) по умолчанию — Использование списка (Use an existing List) и нажмите на ссылку Обзор (Browse). Появится стандартное диалоговое окно для выбора файла.
  4. Найдите в этом окне файл "Борей.MDB" и нажмите кнопку Открыть (Open). Появится диалоговое окно со списком таблиц.
  5. Выберите в нем таблицу "СписокПриглашенных". Появится диалоговое окно, в котором будет отображено содержимое исходной таблицы. Закройте это окно.
  1. Теперь на экране отображается панель инструментов Слияние (Mail Merge). Установите курсор в левый верхний угол документа и нажмите кнопку Добавить поля слияния (Insert Merge Fields). Появляется одноименное диалоговое окно со списком всех полей в источнике данных. Выберите в списке поле "Обращение" и нажмите кнопку Вставить (Insert). Аналогично вставьте остальные поля . Поля слияния являются одним из видов полей Word и выглядят в основном документе как заключенные в угловые кавычки названия соответствующих полей источника данных.
  2. Сохраните документ в виде шаблона (файл с расширением dot) и закройте.

Рассмотрим теперь программу, которая будет выполнять слияние документа 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.