Макрос для слияния данных при серийной печати рассылок в Excel

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

Подготовка слияния данных для серийной печати рассылок в Excel

Чтобы использовать в Excel преимущества серийной печати и слияния данных, в первую очередь необходимо создать таблицу с определенной структурой и контролем ввода в нее значений при заполнении. А после подготовки материалов, мы с помощью средств VBA напишем свой макрос, который будет выполнять серийную печать документов. Данные на основе которых будет реализована печать тиража, должны быть разделены на 2 части:

  1. Таблица с постоянными (не изменяющимися) значениями для информации, которая будет выполнять роль шаблона при многоразовой печати. Например: суть предложения, бланк заказа, отчет, реквизиты фактур Вашей фирмы и т.п. В данном примере эта таблица будет называться «Серийная Таблица».
  2. Таблица в которой все значения уникальны и подаются для заполнения реквизитов при многоразовой печати. Эти значения будут вставлены в соответственные места Серийной Таблицы. Например: адреса клиентов, имена и фамилии получателей и т.д. В данном примере вторая таблица будет навиваться «Таблица Данных».

Естественно правильно выполнять слияние данных из этих двух таблиц будет реализовано с помощью определенного макроса VBA.

Создание Серийной Таблицы с шаблоном для рассылки

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

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

создать Серийную Таблицу.

Несложно догадаться, что ячейки B3, B4, B6 и B7 предназначены для заполнения переменными данными из Таблицы Данных. А в ячейку B9 введем формулу, которая автоматически вычислит сроки реализации заказа с учетом даты его составления. Допустим на строки реализации дается 2 недели, тогда вводим простую формулу: =B3+14.

Подготовка Таблицы Данных с реквизитами для рассылок

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

создадим Таблицу Данных.

При создании такой таблицы мы должны придерживаться базового правила – каждая строка содержит определенную группу связанных между собой значений. Например, имя и фамилия одного и того же получателя должны находиться в одной строке. Наш макрос будет по строкам считывать эту таблицу и подставлять взятые значения с диапазона каждой строки в соответственные места Серийной Таблицы. Так будет реализована многоразовая печать одного и того же шаблона с разными реквизитами.

Так же следует помнить о том, то Таблица Данных должна быть полностью заполнена. Если будет пустая ячейка, тогда будет опущено значение. А если будет пустая целая строка, тогда будет прервана серия печати. Положение Таблицы Данных не обязательно должно начинаться с ячейки A1. Ее адрес расположения укажем в VBA-коде макроса.

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

Слияние данных обеих таблиц в Excel с помощью макроса

Заполнение серийной таблицы значениями, собранными в Таблице Данных выполнить за нас программа VBA-макроса. Для этого откройте редактор Visual Basic (ALT+F11) и создайте модуль: «Insert»-«Module», чтобы в него записать этот код макроса:

Sub PechatSerii()
  On Error Resume Next
  Dim ListSerii As Worksheet
  Dim ListDannye As Worksheet
Dim DiapazS As Range
Dim DiapazD As Range
Dim Stroki As Long
Dim Stolbec As Long
Dim Yacheyki As Range
Dim Rekvizit As Range
Dim NameListSerii As String
Dim NameListDanye As String
Dim AdresDannye As String
Dim AdresRekvizitov As String
'настройки структуры книги
NameListSerii = "Серии"
NameListDanye = "Данные"
AdresDannye = "A2:D20"
AdresRekvizitov = "B3, B4, B6, B7"
'код программы
Set ListSerii = ActiveWorkbook.Worksheets(NameListSerii)
Set ListDannye = ActiveWorkbook.Worksheets(NameListDanye)
Set DiapazS = ListSerii.Range(AdresRekvizitov)
Set DiapazD = ListDannye.Range(AdresDannye)
For Stroki = 1 To DiapazD.Rows.Count
 Stolbec = 1
 For Each Rekvizit In DiapazS
  Set Yacheyki = DiapazD.Cells(Stroki, Stolbec)
  Stolbec = Stolbec + 1
Rekvizit.Formula = Yacheyki.Value
Next Rekvizit
ListSerii.PrintOut
Next Stroki
MsgBox ("Отравлено на печать" & _
CStr(Stroki - 1) & " бланков")
On Error GoTo 0
End Sub
Код VBA-макроса.

В коде применяются 2 цикла:

  1. For Stroki = 1 To DiapazD.Rows.Count – Первый проходить по всем строкам Таблицы Данных. Количество проходов зависит от значения в переменной Stroki. А ее значение получено путем определения количества заполненных строк в Таблице Данных. Адрес этой таблицы находится в переменной DiapazDannye.
  2. For Each Rekvizit In DiapazS – Второй цикл находиться внутри первого. Он отвечает за поочередное заполнение соответственных ячеек на листе где находится Серийная Таблица. А данные берет со строк Таблицы Данных. Количество циклов определяется значением переменной Yacheyki. А ее значение получено путем определения количества ячеек в исходной строке.

Когда макрос Excel пройдет по всем циклам, тогда можно вызвать окно сообщения (MsgBox) о количестве напечатанных документов. То есть сколько было выполнено непрерывных циклов в процессе выполнения кода.

В макросе используются еще 2 переменные с адресами диапазонов ячеек:

  1. DiapazS – содержит адрес на несмежный диапазон ячеек для Серийной Таблицы, в которую будут вводиться переменные значения.
  2. DiapazD – содержит адрес на смежный диапазон ячеек для Таблицы Данных из которой будут браться переменные значения для заполнения.

Чтобы более-менее было удобно приспособить функционирование макроса к изменениям таблиц на листах, адреса на диапазоны ячеек подаются в текстовых переменных AdresRekvizitov и AdresDannye. Благодаря функции Range значения этих переменных из типа строки (As String) преобразуются в тип адреса (As Range):

Set DiapazS = ListSerii.Range(AdresRekvizitov)
Set DiapazD = ListDannye.Range(AdresDannye)

Такой подход к построению макроса имеет определенные преимущества. Можно свободно редактировать и изменять адреса диапазонов для обеих таблиц при их изменении размера или структуры:

AdresDannye = "A2:D20"
AdresRekvizitov = "B3, B4, B6, B7"

Макрос будет работать без проблем.

Код макроса содержит некоторую информацию о структуре данной рабочей книги Excel: размещение исходных данных и целевых, а также названия листов. Сами названия листов указаны в строковых переменных NameListSerii и NameListDannye.

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

NameListSerii = "Серии"
NameListDanye = "Данные"

А также:

AdresDannye = "A2:D20"
AdresRekvizitov = "B3, B4, B6, B7"

В том случаи если изменились размеры или адреса диапазонов таблиц на этих листах просто отредактируйте значение в соответственных переменных.

Обратите внимание, что при указании несмежного диапазона адреса между ячейками мы разделяем запятыми. Также количество ячеек в каждой строке Таблицы Данных соответствует количеству поданных адресов ячеек для несмежного диапазона в Серийной Таблице. Все данные собираются и вводятся по очереди. Например, в ячейку Серии!B3 по очереди будут заполняться все значения из столбца Данные!A:A, а в ячейку Серии!B3 – попадут значения из столбца Данные!B:B и т.д.

На этапе тестирования макроса нет необходимости рисковать ошибочной печатью документов и тратит офисные листы бумаги. Достаточно лишь поменять строку кода:

ListSerii.PrintOut

на временную строку которая включит режим предварительного просмотра:

ListSerii.PrintPreview

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

Процесс слияния данных и серийной печати рассылок из Excel

Когда уже создадите и заполните все таблицы необходимыми значениями, можно запустить свой макрос для серийной печати. Нажимаете комбинацию клавиш (ALT+F8) из списка в появившемся окне выбираем имя макроса «PechatSerii» и нажимаем на кнопку «Выполнить».

Циклы инструкций кода сразу проходят по всем строкам Таблицы Данных и поочередно вводят собранные значения из ячеек строк в соответственные ячейки Серийной Таблицы. После заполнения каждого комплекта данных выполняется печать готового текущего документа.

Данный процесс повторяется ровно столько раз сколько строк содержит Таблица Данных. После завершения действия макроса выводиться сообщение с информацией о завершении генерации документов и о их количестве отправленных на печать:

Информация о количестве.

После завершения действия макроса Серийная Таблица будет содержать данные полученные из последней строки Таблицы Данных. Как показано ниже на рисунке:

Готов бланк.

Таким образом у нас получилось автоматизировать большой объем роботы с помощью макроса и без использования программы Word.