Слетает подключение к источнику данных при слиянии. Слияние документов Microsoft Word. Примеры работы с полями

Сейчас мы с Вами рассмотрим пример реализации того, как можно выполнить слияние данных Word с данными Microsoft SQL Server, при этом данный процесс будет автоматизирован средствами VBA Access 2003 .

Многие, наверное, уже умеют осуществлять слияние документов Word, например, с источником данных Excel или с тем же SQL сервером, но не все знают, как можно автоматизировать данный процесс или внедрить его в какую-нибудь программу.

Однажды у меня встала задача автоматизировать слияние некого шаблона Word с данными расположенными на SQL сервере, при этом все это необходимо было внедрить в программу, разработанную в Access 2003 (ADP проект). И сегодня я покажу пример решения данной задачи.

Исходные данные

И для начала давайте разберем исходные данные, т.е. что мы имеем.

Итак, в качестве клиента, как я уже сказал, у нас будет выступать ADP проект Access 2003. В качестве источника данных для примера будет выступать SQL Server 2012 Express . На компьютере установлен Microsoft Office 2013 (и Access 2003 ).

Создадим на сервере тестовую таблицу и заполним ее данными (допустим в базе данных Test ). Для этого Вы можете запустить следующую SQL инструкцию .

CREATE TABLE dbo.TestTable(ID INT IDENTITY(1,1) NOT NULL, ProductName VARCHAR(50) NOT NULL, Price MONEY NULL, CONSTRAINT PRIMARY KEY CLUSTERED (ID ASC)) GO INSERT INTO dbo.TestTable(ProductName, Price) VALUES ("Компьютер", 500) GO INSERT INTO dbo.TestTable(ProductName, Price) VALUES ("Монитор", 400) GO INSERT INTO dbo.TestTable(ProductName, Price) VALUES ("Телефон", 200) GO INSERT INTO dbo.TestTable(ProductName, Price) VALUES ("Планшет", 300) GO INSERT INTO dbo.TestTable(ProductName, Price) VALUES ("Принтер", 250) GO SELECT * FROM TestTable

Создаем файл подключения к источнику данных MS SQL Server

Теперь давайте создадим файл подключения (ODC) к нашему источнику данных. Данный файл будет выступать своего рода «шаблоном файла подключения », так как впоследствии мы можем, и будем переопределять и базу данных и сам SQL запрос .

Для создания файла подключения к SQL серверу давайте откроем Word и стандартным способом создадим данный файл, т.е. с помощью функционала «Рассылки ». (Кстати пример создания подключения к SQL серверу из Excel мы с Вами уже рассматривали в материале – Excel — Подключение и получение данных с SQL сервера ).


Затем в окне выбора источника данных нажимаем кнопку «Создать ».



Потом вводим адрес сервера и нажимаем «Далее ».


Затем выбираем базу данных и таблицу для подключения, еще раз напомню, это всего лишь шаблон, все эти параметры мы будем переопределять, жмем «Далее ».


И в заключение вводим понятное название файла подключения, а также мы можем сразу его сохранить в нужный нам каталог путем кнопки «Обзор », по умолчанию он сохраняется в « C:\Users\Имя_Пользователя\Documents\Мои источники данных». Нажимаем «Готово ».


Все, файл создан, Word можем закрыть без сохранения.

Создаем шаблон Word для слияния

Теперь давайте подготовим шаблон Word, т.е. это тот документ, в который мы будем подставлять данные из базы данных SQL сервера.

Вся подготовка сводится к тому, что нам необходимо вставить поля слияния там, где это нам нужно. Это делается следующим образом. Вкладка «Вставка -> Экспресс-блоки -> Поле ».


Ищем поле MERGEFIELD и вводим название поля, которое будет соответствовать полю в источнике данных (в моем случае это ProductName и Price ). Жмем «ОК ».


Так как у меня это тестовый шаблон в нем текста практически не будет, и выводить я буду всего два поля, у Вас скорей всего будет много текста и много полей слияния.


Код VBA Access 2003 для слияния документа Word с источником данных MS SQL Server

Осталось написать код VBA, который будет осуществлять слияние. Для примера давайте добавим на форму кнопку StartMerge и поле Price для фильтрации данных. Затем в редакторе Visual Basic напишем процедуру для слияния, допустим с названием MergeWord, и в обработчик события кнопки StartMerge (нажатие кнопки ) вставляем код вызова этой процедуры. Весь код будет выглядеть следующим образом (я его прокомментировал ). Сразу поясню, что шаблон Word и файл ODC у меня лежат в каталоге D:\Test\.

"Процедура для запуска слияния Private Sub MergeWord(TemplateWord As String, QuerySQL As String) "Первый параметр - Путь к шаблону Word "Второй параметр - Строка запроса к БД On Error GoTo Err1 Dim ConnectString As String, PathOdc As String Dim WordApp As Object Dim WordDoc As Object "Шаблон файла ODC для подключения к данным PathOdc = "D:\Test\TestSourceData.odc" If TemplateWord <> "" Then "Создаем документ Word Set WordDoc = CreateObject("Word.document") Set WordDoc = GetObject(TemplateWord) Set WordApp = WordDoc.Parent "Создаём подключение к источнику данных (MS SQL Server) "Некоторые данные берём из текущего подключения ADP проекта ConnectString="Provider=SQLOLEDB.1; " & _ "Integrated Security=SSPI;" & _ "Persist Security Info=True; " & _ "Initial Catalog=" & CurrentProject.Connection.Properties("Initial Catalog") & "; " & _ "Data Source=" & CurrentProject.Connection.Properties("Data Source") & "; " & _ "Use Procedure for Prepare=1;" & _ "Auto Translate=True;" & _ "Packet Size=4096;" & _ "Use Encryption for Data=False;" "Задаем источник данных WordDoc.MailMerge.OpenDataSource NAME:=PathOdc, _ Connection:=ConnectString, _ SQLStatement:=QuerySQL "Делаем видимым Word WordApp.Visible = True WordApp.Activate "Начинаем слияние With WordDoc.MailMerge .Destination = wdSendToNewDocument .SuppressBlankLines = True .Execute Pause:=False End With "Закрываем шаблон без сохранения WordDoc.close (wddonotsavechanges) Set WordDoc = Nothing Set WordApp = Nothing Else MsgBox "Не указан шаблон для слияния", vbCritical, "Ошибка" End If Ex1: Exit Sub Err1: MsgBox Err.Description WordDoc.close (wddonotsavechanges) WordApp.Quit Set WordDoc = Nothing Set WordApp = Nothing Resume Ex1 End Sub Private Sub StartMerge_Click() Dim Filter As String Filter = "" "Условие If Nz(Me.Price, "") <> "" Then Filter = "WHERE Price >= " & Me.Price End If "Вызов процедуры слияния Call MergeWord("D:\Test\Шаблон.docx", "SELECT * FROM ""TestTable"" " & Filter & " ") End Sub

Сохраняем и проверяем работу.

После нажатия на кнопку (StartMerge) запустится Word, в котором уже все данные заполнены и документов будет столько, сколько строк в источнике.


Как видим, все работает. На этом у меня все, надеюсь, материал был полезен. Пока!

Теперь нужно создать источник данных слияния (адресов и фамилий получателей письма).

1. В разделе Выбор получателей окна Слияние области задач выберите пункт Создание списка (рис. 8.6).

Рис. 8.6. Окно Выбор получателей мастера Слияние

2. Щелкните на команде Создать в разделе Создание списка . Откроется окно диалога, показанное на рис. 8.7.

Источник данных слияния представляет собой базу данных, состоящую из записей, на основе каждой из которых с помощью главного документа будет сгенерирован конкретный экземпляр письма. Все записи имеют одинаковые поля данных.

Некоторые наиболее распространенные поля заранее внесены в список окна создания источника данных. Вы можете удалить из базы данных ненужные поля и добавить свои собственные.

Рис. 8.7. Создание источника данных

Другие пункты раздела Выбор получателей позволяют выбрать в качестве источника данных имеющуюся базу данных, ранее созданную в Word или в приложении типа Access, либо адресную книгу.

Примечание Наличие в источнике данных лишних полей никак не влияет на результат слияния, но замедляет работу программы.

3. Щелкните на кнопке Настройка . Откроется окно диалога, пока занное на рис. 8.8.

4. Выделите пункт Обращение .

5. Щелчком на кнопке Удалить сотрите выделенное поле.

Рис. 8.8. Настройка полей источника данных

Рис. 8.9. Окно диалога Получатели слияния

6. Повторяя шаги 4 и 5, удалите все поля, кроме Имя, Фамилия , Организация , Адрес 1 и Индекс .

7. Щелкните на кнопке ОК .

8. Щелкните на кнопке Закрыть окна диалога .

9. В открывшемся окне диалога сохранения документа введите имя Гости и щелкните на кнопке Сохранить . Появится показанное на рис. 8.9 окно диалога Получатели слияния , в котором в настоящее время нет ни одной записи.

10. Вам обязательно придется когда-нибудь ввести информацию в источник данных. Щелкните на кнопке Изменить... , чтобы сделать это сейчас. Откроется форма для ввода данных. Давайте добавим несколько записей. Позже слияние сгенерирует ровно столько копий главного документа, сколько записей имеется в источнике данных.

11. Заполните поля формы.

12. Чтобы добавить еще одну запись, щелкните на кнопке Создать запись .

13. Введите еще несколько записей, перенеся в них информацию, представленную в табл. 8.1.

ТАБЛИЦА 8.1. Источник данных слияния

14. Щелкните на кнопке Закрыть , чтобы сохранить базу данных, а затем - на кнопке ОК окна Получатели .

Примечание Для изменения информации источника данных щелкните в панели инструментов Слияние на кнопке Получатели , а затем в открывшемся окне диалога - на кнопке Изменить . Откроется форма источника данных. Для перемещения по записям источника пользуйтесь кнопками Первая , Назад , Вперед , Последняя в нижней части формы.

Рис. 8.10 . Панель инструментов Слияние

Приложение Word может извлекать данные для слияния из различных источников. Являясь частью набора Microsoft Office, приложение Word легко принимает данные из Outlook, Excel и Access. Можно использовать и другие источники, включая веб-страницы, текстовые файлы OpenDocument и файлы данных с разделителями, сохраненные в виде обычного текста. Если у вас еще нет источника данных, его можно создать в приложении Word.

Важно: Доступ к именованным источникам данных в расположении HTTP не поддерживается. Прежде чем использовать файл в качестве источника данных для слияния, сохраните его на локальном жестком диске.

Источники данных для слияния

Ниже перечислены некоторые источники данных, которые можно использовать для слияния в Word.

Другие файлы баз данных

Для слияния можно использовать и другие источники данных. Чтобы получить доступ к этим источникам, запустите мастер подключения к данным.

Настроив источник данных, вы сможете создать наклейки , конверты , письма и сообщения электронной почты с помощью слияния.

Дополнительные сведения

Остались вопросы о слиянии в Word?

Помогите нам улучшить Word

У вас есть идеи по улучшению слияния или других функций Word? Поделитесь ими на странице

Недавно в одной организации наблюдала дикую картину:)

Компания переезжала в новое здание - из МО в Москву. Речь, соответственно, об изменении существенных условий трудового договора для всех сотрудников. По процедуре сотрудников нужно уведомить под роспись о предстоящем переезде, а затем заключить со всеми дополнительные соглашения к трудовым договорам. В организации работают около 1,5 тысяч человек, отдел кадров должен срочно подготовить документы.

Что же происходит дальше?
Начальник отдела кадров направляет запрос в отдел информационных технологий о доработке кадровой системы: нужно создать печатные формы - уведомление и дополнительное соглашение. ИТ отвечают, что подобная доработка будет стоить столько-то тысяч евро, а расходы в бюджет не заложены, и, кроме прочего, реализация возможна не ранее, чем через два месяца.

Посылая проклятия в адрес отдела ИТ, кадровики выходят на работу в выходные, бросив дома маленьких детей. Бессмертный трудовой подвиг: за двое суток создано 3000 документов! В шаблон вручную добавляли имя и паспортные данные каждого работника, и так 3000 раз!

Смогут ли они простить себе так бездарно потраченное время, когда узнают, что используя Слияние (Mail Merge) шаблона в Word с таблицей Excel, содержащей персональные данные, сделать это можно было минут за двадцать:)

ШАГ 1. Создаем шаблон документа в Word.

Красным выделены те данные которые будут изменяться: фамилия, имя, отчество, номер, дата трудового договора, должность, подразделение и окончания в словах уважаемый(-ая) и получил(-а) в зависимости от пола.

ШАГ 2. Создаем источник данных в Excel.

После того, как мы настроим Слияние, программа будет подставлять данные из источника в шаблон. Каждая строка - отдельный документ.

ШАГ 3. Возвращаемся к шаблону документа, который мы создали в Word. Нам предстоит работать со вкладкой "Рассылки", внимательно изучите ее.

Нажимаем кнопку "Выбрать получателей", выбираем вариант "Использовать существующий список" и открываем источник данных (файл Excel с информацией о сотрудниках).

В следующем окне выбираем лист файла, на котором содержатся нужные данные.

ШАГ 4. Ставим курсор в том месте текста шаблона, куда нужно вставить данные из источника, нажимаем кнопку "Вставить поле слияния" и выбираем нужное поле.

Вот так выглядит мой шаблон после того, как вставлены все поля слияния:

ШАГ 5. Создаем Правила, изменяющие окончания слов "уважаемый" и "получил" в зависимости от пола сотрудника.

Ставим курсор после перед окончанием слова. Нажимаем кнопку "Правила" и выбираем "IF...THEN...ELSE" в выпадающем списке.

Записываем правило: если пол женский - тогда..., иначе...

ШАГ 6. Форматируем даты.

Если раньше вам уже приходилось использовать Рассылки (Слияние), вы наверняка сталкивались с тем, что даты, перенесенные из Excel, выглядят в Word совершенно не так, как нужно. Например, вместо 19.06.2012 вы, скорее всего, увидите 6/19/2012, вряд ли такой результат вас устроит.

Есть разные способы решить эту проблему, воспользуемся самым простым и удобным.

Нажмем сочетание клавиш Alt+F9, теперь мы можем видеть коды полей слияния.

Внутри кода поля Дата_договора перед закрывающей фигурной скобкой поставим обратную косую черту, а после нее ключ форматирования:
{ MERGEFIELD "Дата_договора" \@ "DD.MM.YYYY" }
@ - обозначение даты, "DD.MM.YYYY" - ключ формата даты вида 19.06.2012 .
Вы можете использовать любой другой формат. Например, чтобы дата имела вид 19 июня 2012 г. , используйте ключ \@ "DD MMMM YYYY г." .

Чтобы выйти из режима редактирования кодов, снова нажимаем Alt+F9.

ШАГ 7. Нажимаем кнопку "Просмотр результатов", чтобы проверить, что получилось.

ШАГ 8. Редактируем список сотрудников.

Нажав на кнопку "Изменить список получателей" можно исключить отдельные записи из списка, проверить, нет ли повторов, установить сортировку или фильтры.

Сортировке стоит уделить особое внимание, чтобы не пришлось тратить время на раскладывание документов после того, как они будут распечатаны. Удобнее всего использовать сортировку по фамилиям сотрудников или по названиям подразделений.

ШАГ 8. Завершаем слияние.

Нажимаем кнопку "Найти и объединить". Если выбрать вариант "Печать документов", документы будут сразу отправлены на принтер. Если же нужно перед печатью просмотреть документы и внести правки, выбираем "Изменить отдельные документы".

Будет сформирован отдельный файл Word с результатами слияния.

Готово! Наслаждаемся сэкономленным временем!

UPDATE в ответ на комментарий alexey_lao :
При помощи несложного макроса можно сохранить каждый документ как отдельный файл.

Сохраняем наш шаблон как файл с расширением.docm (файл Word с поддержкой макросов).

Нажимаем сочетание клавиш Alt+F8 (вызов окна Макрос).

В открывшемся окне задаем "Имя" макроса (например, SaveFiles) и выбираем наш файл с шаблоном в выпадающем списке "Макросы из" (я предпочитаю создавать макросы непосредственно в файле, чтобы они работали и тогда, когда файл открыт на другом компьютере). Нажимаем кнопку "Создать".

В том месте, где мигает курсор, записываем код макроса:

Dim DocNum As Integer
For DocNum = 1 To ActiveDocument.MailMerge.DataSource.Reco rdCount
ActiveDocument.MailMerge.DataSource.Acti veRecord = DocNum
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = ActiveDocument.MailMerge.DataSource.Acti veRecord
.LastRecord = ActiveDocument.MailMerge.DataSource.Acti veRecord
End With
.Execute Pause:=False
End With
With ActiveDocument
.SaveAs FileName:="C://Test/" & DocNum , FileFormat:=wdFormatXMLDocument
.Close
End With

Вместо C://Test/ укажите адрес папки, в которой вы хотите сохранить документы.
Закрываем окно редактора Visial Basic и возвращаемся в наш документ с шаблоном.

Снова нажимаем Alt+F8, выбираем макрос SaveFiles в списке и нажимаем кнопку "Выполнить".

Пока компьютер по очереди создает и сохраняет каждый документ, можно выпить чашку кофе с печенькой. Или пойти домой поспать, если документов больше, чем пара сотен:)


______________

Скачать файлы с примерами можно здесь:
http://hrexcel.ru/download/excel4hr_istochnik_dannyh.xlsx
http://hrexcel.ru/download/excel4hr_shablon.docx

Экспериментируйте!

Из статьи в предыдущем номере мы узнали, что метод слияния позволяет создавать источник данных средствами Word. В этой статье мы рассмотрим, как сведения об источнике данных можно получить из таблицы Excel.

Источник данных может использоваться в версиях Word 2000/2002/2003/2007, но процесс его создания проходит одинаково для любых версий Word. Итак, опишем алгоритм для создания источника данных:

  1. Откройте Excel.
  2. В появившейся таблице в ячейку А1 введите имя первого поля (например, страна ), в В1 –второго (например, индекс ) и т.д. (рис. 1).

Рис. 1. Таблица данных

Использование таблицы Word 2000/2002

  1. Откройте или создайте в Word основной документ.
  2. Слияние кнопку (Диалоговое окно Слияние ).
  3. Слияние на втором шаге выберите кнопку Получить данные, а из списка – Открыть источник данных (рис. 2).

Рис. 2. Раскрывающийся список Открыть источник данных

  1. В новом диалоговом окне Открытие источника данных из раскрывающегося списка Тип файла выберите Книги MS Excel .
  2. Откройте выбранный файл, нажав кнопку Открыть.
  3. В появившемся диалоговом окне Microsoft Excel (рис. 3) задайте диапазон или имя.

Рис. 3. Окно Microsoft Excel

В результате файл Excel стал как бы «привязан» в качестве источника данных, поэтому теперь можно вставлять поля слияния в основной документ, а также произвести слияние источника данных с основным документом так, как было объяснено в предыдущей статье.

Правило отбора записей для включения в процесс слияния с основным документом

В процесс слияния могут быть включены записи, удовлетворяющие определенному заданному критерию. Для выбора записей используются связки ИЛИ , И .

Для того чтобы задать критерия отбора:

  1. Откройте основной документ.
  2. Выберите на панели инструментов Слияние кнопку (Диалоговое окно Слияние ).
  3. В диалоговом окне Слияние на третьем шаге выберите кнопку Отбор записей.

В результате появится диалоговое окно Отбор записей .

  1. Во вкладке Отбор записей диалогового окна Отбор записей в столбце Поле из раскрывающегося списка выберите имя поля, на значение которого будет наложено условие.
  2. В столбце Оператор выберите операцию сравнения.
  3. В столбце Значение введите значение, с которым будет проводиться сравнение.
  4. После задания всех критериев закройте окно Отбор записей , нажав кнопку ОК (рис. 4).

Рис. 4. Окно Отбор записей

  1. В диалоговом окне Слияние нажмите кнопку Объединить или на панели инструментов Слияние нажмите кнопку (Слияние в новый документ ).

Использование таблицы Excel в качестве источника данных в Word 2003

  1. В меню Сервис выберите команду Письма и рассылки , а затем - команду Слияние .
  2. В открывшейся области задач Слияние, используя кнопку Далее, перейдите на третий этап мастера Выбор получателя, далее щелкните на команду
  3. Найдите необходимый файл таблицы Excel и откройте его, дважды щелкнув на нем мышью.
  4. Подтвердите, что первая строка данных содержит заголовки столбцов (именно они являются полями слияния) (рис. 5).

Рис. 5. Окно Выделить таблицу

Примечание. В окне Получатели слияния можно отредактировать записи.

  1. Перейдя к четвертому этапу, выберите команду
  2. В появившемся диалоговом окне Добавление поля слияния (рис. 6) выберите поле из списка, предварительно установив курсор мыши в то место основного документа, где должно находиться поле слияния.

Рис. 6. Диалоговое окно Добавление поля слияния

Чтобы совершить отбор записей для включения в процесс слияния с основным документом в Word 2003, необходимо, перейдя к третьему этапу, выбрать команду, а в диалоговом окне Получатели слияния (рис. 7) снять флажок R у записи, в адрес которой не надо отсылать текст основного документа.


Рис. 7. Диалоговое окно Получатели слияния

Использование таблицы Excel в качестве источника данных в Word 2007

  1. На вкладке Рассылка в группе Слияние выберите команду Выбрать получателей .
  2. Выберите (рис. 8), найдите нужный файл в диалоговом окне Выбор источника данных и откройте его.

Рис. 8. Выбор команды Использовать существующий список

Примечание. После выбора файла станут активными команды вкладки

  1. Щелкните мышью на Изменить список полей при изменении списка.
  2. Щелкните мышью на Вставить поле слияния и выберите поле из списка, предварительно установив курсор мыши в то место основного документа, где должно находиться поле слияние.

Отбор записей для включения в процесс слияния с основным документом в Word 2007

  1. Во вкладке Рассылки в группе Начать слияние нажмите на Выбрать получателей и в выпадающем списке меню выберите Использовать существующий список .
  2. Найдите необходимый файл таблицы Excel и откройте его, дважды щелкнув по нему мышью.
  3. Подтвердите, что первая строка данных содержит заголовки столбцов (именно они являются полями слияния).
  4. Во вкладке Рассылки в группе Начать слияние выберите Изменить список получателей.

5.В диалоговом окне Получатели слияния (рис. 9) снимите флажок R у записи, в адрес которой не надо отсылать текст основного документа.

Рис. 9. Окно Получатели слияния

Основные преимущества использования Excel в качестве источника данных для процесса слияния

1. Экономия времени, т.к. пропадает необходимость выполнять одну и ту же работу многократно.

2. Автоматизация рабочего процесса путем создания множества копий шаблона документа с различными реквизитами.

3. Удобство и легкость выполнения работы, которая состоит всего из трех этапов: создания основного документа, создания источника данных и непосредственно их слияния.

Г.А. Серова, проф. РГГУ