Текстовый редактор Word обладает определенной функциональностью, которой нет в Excel. Например, функция слияния документов для серийной печати адресов писем на конвертах при массовой рассылке. Задумайтесь, на сколько был-бы практически применим этот инструмент в Excel, чтобы можно было печатать: счета фактур, отчеты, анкеты, бланки заказов, коммерческие предложения и др. В принципе с помощью программы Word мы можем применять инструмент слияния документов так, чтобы импортировать данные из Excel. Но это весьма сложное и не всегда удобно реализуемое решение. В данном примере мы с помощью VBA-макроса создадим свой альтернативный инструмент слияния в Excel. И продемонстрируем как использовать его для серийной печати документов при подготовке их к массовой рассылке по адресам клиентов получателей.
Подготовка слияния данных для серийной печати рассылок в Excel
Чтобы использовать в Excel преимущества серийной печати и слияния данных, в первую очередь необходимо создать таблицу с определенной структурой и контролем ввода в нее значений при заполнении. А после подготовки материалов, мы с помощью средств VBA напишем свой макрос, который будет выполнять серийную печать документов. Данные на основе которых будет реализована печать тиража, должны быть разделены на 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
В коде применяются 2 цикла:
- For Stroki = 1 To DiapazD.Rows.Count – Первый проходить по всем строкам Таблицы Данных. Количество проходов зависит от значения в переменной Stroki. А ее значение получено путем определения количества заполненных строк в Таблице Данных. Адрес этой таблицы находится в переменной DiapazDannye.
- For Each Rekvizit In DiapazS – Второй цикл находиться внутри первого. Он отвечает за поочередное заполнение соответственных ячеек на листе где находится Серийная Таблица. А данные берет со строк Таблицы Данных. Количество циклов определяется значением переменной Yacheyki. А ее значение получено путем определения количества ячеек в исходной строке.
Когда макрос Excel пройдет по всем циклам, тогда можно вызвать окно сообщения (MsgBox) о количестве напечатанных документов. То есть сколько было выполнено непрерывных циклов в процессе выполнения кода.
В макросе используются еще 2 переменные с адресами диапазонов ячеек:
- DiapazS – содержит адрес на несмежный диапазон ячеек для Серийной Таблицы, в которую будут вводиться переменные значения.
- 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.
Три способа печати переменных данных
Возможность персонализировать продукцию — одно из ключевых преимуществ цифровой печати, но многие типографии им не пользуются. Чтобы восполнить этот пробел, поговорим о трёх бесплатных способах добавлять переменные данные в макет.
Но сперва рассмотрим готовность сервера печати к работе с переменными данными. На всех серверах EFI Fiery для этого присутствует механизм EFI FreeForm. Вы отдельно готовите файл с переменной частью и отдельно — с постоянной формой. Форма загружается на контроллер и предварительно растрируется. Для этого на вкладке VDP в параметрах работы при отправке работы говорим контроллеру: «Создать МАСТЕР». Переменная часть растрируется отдельно и «совмещается» на лету с формой, для чего при отправке переменой части на вкладке VDP указываем «Использовать МАСТЕР».
Способ 1
Microsoft Word. Mail merge
- Сохраните таблицу с переменными данными в Excel. В первой строке должны быть названия полей.
- Откройте шаблон документа в Word.
- Привяжите данные из Excel (Mailings -> Select recipients -> Use an existing list… / Рассылки -> Выбрать получателей -> Использовать существующий список).
- Укажите, что данные находятся на заданном листе (Sheet), а первая строка — строка с наименованием полей (First row of data contains column headers).
- Вставьте поля в документ (Mailings -> Insert merge field / Рассылка -> Вставить поле слияния).
- Выведите на печать документ с переменными данными (Mailings -> Finish & merge… / Рассылка -> Найти и объединить). Во вкладке VDP укажите «Использовать мастер».
Способ 2
Adobe InDesign. Data merge
- Создайте таблицу с переменными данными в Excel или другом редакторе. В первой строке должны быть названия полей.
- В начале имени поля введите символ «@» для вставки текста или путей, указывающих на файлы изображений (в Excel — «’@»).
- Сохраните файл в формате CSV с кодировкой Unicode или в формате текстового документа (.txt). Разделители — запятые или знаки табуляции.
- Откройте окно Data Merge в InDesign (Window -> Utilities -> Data Merge).
- Выберите источник данных (дополнительные настройки -> Select Data Source -> укажите файл с данными) и настройте формат импорта.
- При редактировании вставьте данные двойным щелчком по соответствующему полю в окне Data Merge.
Способ 3
EFI FreeForm Create
Пожалуй, самый удобный и продвинутый способ. В частности позволяет создавать штрихкоды, в том числе QR-коды. Но работает только на относительно новых серверах печати EFI Fiery.
- Задайте форму — файл PDF или PS.
- Задайте источник данных — файл CSV или Excel. В первой строке должны быть названия полей.
- Укажите соответствие полей и типов данных.
- Доработайте вёрстку макета.
- Напечатайте документ, отправив его на контроллер Fiery по сети. Или сохраните в промежуточном формате (FFP file).
jfd Пользователь Сообщений: 302 |
#1 29.01.2013 18:10:48 Здравствуйте!
Прикрепленные файлы
Изменено: jfd — 29.01.2013 18:11:55 |
||
Sergei_A Пользователь Сообщений: 443 |
#2 29.01.2013 19:06:29 Не хватило самой малости
|
||
jfd Пользователь Сообщений: 302 |
Спасибо, все заработало как надо. |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Потому что свойство PrintArea принимает в качестве аргумента текст(т.е. адрес диапазона), а не сам диапазон как объект. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Добрый всем вечер. |
|
Sergei_A Пользователь Сообщений: 443 |
#6 12.03.2013 20:19:57
8 — это номер столбца H |
||
Выдает ошибку — переменная не определена( |
|
Kuzmich Пользователь Сообщений: 7998 |
|
Sergei_A Пользователь Сообщений: 443 |
#9 12.03.2013 21:20:49 SerjVorotilov, сорри, к Option Explicit я себя пока не приучил
|
||
Большое спасибо Вам, Sergei_A и Kuzmich |
|
Что-то не могу понять — область печати в обоих случаях — диапазон А1:Н1, несморя на наличие данных в ячейках, расположенных ниже (но в диапазоне А:Н) Прикрепленные файлы
|
|
Sergei_A Пользователь Сообщений: 443 |
#12 13.03.2013 00:06:23 Не думал, что у Вас первый столбец пустой, по-этому всегда лучше сразу кидать пример
|
||
Спасибо, Сергей, то что нужно. |
|
jfd Пользователь Сообщений: 302 |
#14 13.03.2013 00:16:13 Кажется самый простой вариант
|
||
SerjVorotilov Пользователь Сообщений: 231 |
#15 13.03.2013 00:30:10 Сделал через Worksheet_SelectionChange:
Еще раз огромное спасибо Вам, Сергей. |
||
SerjVorotilov Пользователь Сообщений: 231 |
#16 13.03.2013 00:33:51 Сделал через Worksheet_SelectionChange:
Еще раз огромное спасибо Вам, Сергей. Блин, только при использовании Worksheet_SelectionChange макрос начинает реагировать на ввод данных в столбцы, выходящие за определенный мной диапазон А:Н, что не есть гуд. |
||
Sergei_A Пользователь Сообщений: 443 |
#17 13.03.2013 00:42:26 Воспользуйтесь событием Workbook_BeforePrint
Изменено: Sergei_A — 13.03.2013 00:44:00 |
||
marchela Пользователь Сообщений: 8 |
Здравствуйте! |
Sanja Пользователь Сообщений: 14838 |
Согласие есть продукт при полном непротивлении сторон. |
marchela Пользователь Сообщений: 8 |
#20 18.01.2019 12:13:25 Доброго дня! Почему не в тему? У меня похожая задача. Смотрите вложение Сделал через Worksheet_SelectionChange:
у меня работает, но только нужно реализовать выделение области БЕЗ учета форматов и формул — только по отображаемому значению в ячейке. КАК ОПРЕДЕЛИТЬ ПОСЛЕДНЮЮ ЯЧЕЙКУ НА ЛИСТЕ ЧЕРЕЗ VBA? СПОСОБ 4 Да видел я этот пример — с реализацией туго , помогите, пожалуйста, соединить этот код с кодом из способа 4 Прикрепленные файлы
Изменено: marchela — 18.01.2019 12:20:36 |
||
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
marchela, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение. |
Юрий М Модератор Сообщений: 60586 Контакты см. в профиле |
#22 18.01.2019 12:24:26 И ещё:
Т.е. Ваш вопрос лишь косвенно связан с этой темой — задание области печати. |
||
Antag Пользователь Сообщений: 52 |
Получится задать разные области печати на нескольких листах книги, чтобы область печати менялась в зависимости от значения одной ячейки в другом листе? Если Главный!R6=»a» → область печати одна, |
MikeVol Пользователь Сообщений: 230 Ученик |
#24 24.01.2023 09:17:05 Antag Доброго времени суток. Возможно я не понял вас правильно. Как понял. Вариант:
Изменено: MikeVol — 24.01.2023 09:23:29 |
||
Antag Пользователь Сообщений: 52 |
#25 24.01.2023 16:05:48
Если Главный!R6=»a» → область печати на других (но не на всех) листах A1:G256, Изменено: Antag — 24.01.2023 16:06:08 |
||
MikeVol Пользователь Сообщений: 230 Ученик |
#26 24.01.2023 18:15:11 Antag,
вы этого не указали в своём стартовом посте #23 Думаю что при таких раскладах вам не составит большого труда подстроить под ваши нужды выше мной выложеный код. Необходимо изначально чётко ставить задачи, тут экстрасенсорными способностями никто не обладает. Удачи вам. Изменено: MikeVol — 24.01.2023 18:16:32 |
||
_Boroda_ Пользователь Сообщений: 1496 Контакты см. в профиле |
#27 25.01.2023 09:26:46 Для листов 1 и 3. Без макросов. См. Диспетчер имен Прикрепленные файлы
Скажи мне, кудесник, любимец ба’гов… |
Как напечатать док-ты заданной формы с данными из таблицы |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub Workbook_BeforePrint(Cancel As Boolean) ‘Блок печати и возвращения начального диапазона для печати Макрос будет запускаться перед печатью и переопределять диапазон по заполненному 2-му столбцу. 200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub Workbook_BeforePrint(Cancel As Boolean) ‘Блок печати и возвращения начального диапазона для печати Макрос будет запускаться перед печатью и переопределять диапазон по заполненному 2-му столбцу. Иногда все проще чем кажется с первого взгляда. 200?’200px’:»+(this.scrollHeight+5)+’px’);»> Private Sub Workbook_BeforePrint(Cancel As Boolean) ‘Блок печати и возвращения начального диапазона для печати Макрос будет запускаться перед печатью и переопределять диапазон по заполненному 2-му столбцу. Источник Метод Sheets.PrintOut (Excel)Синтаксисexpression. PrintOut (From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, IgnorePrintAreas) выражение: переменная, представляющая объект Sheets. Параметры
Возвращаемое значениеПримечания«Страницы» в описаниях from и To относится к печатным страницам, а не к общим страницам на листе или книге. ПримерВ этом примере выводится активный лист. В этом примере выполняется печать со страницы 2 на страницу 3. В этом примере выводится три копии со страницы 2 на страницу 3. Поддержка и обратная связьЕсть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Источник VBA Excel. Объект PageSetup (параметры страницы)Параметры печатной страницы в VBA Excel. Свойство PageSetup объекта Worksheet. Объект PageSetup и описание некоторых его свойств с примерами. Описание объекта PageSetupОбъект PageSetup возвращается свойством PageSetup объекта Worksheet: где Expression — это выражение (переменная), возвращающее объект Worksheet. Свойства объекта PageSetupДиапазон печатиУстановить диапазон для печати из кода VBA Excel можно с помощью свойства PageSetup.PrintArea: Размеры полейСвойства, отвечающие за размер полей печатной страницы:
Свойства, отвечающие за размер полей, предназначены для чтения и записи, выражаются в точках (1 точка равна 1/72 дюйма или ≈1/28 см). Тип данных — Double. Для того, чтобы вручную не высчитывать количество точек в дюймах или сантиметрах, существуют методы Application.InchesToPoints и Application.CentimetersToPoints, которые автоматически переводят дюймы и сантиметры в точки. Пример задания размеров полей для печатной страницы: Источник Vba excel печать диапазона ячеекВ общем надо сделать что-то в виде макроса. И надо, чтоб выходило на печать 10 бумажек, в которых будет порставлено на каждой номер партии (в моем случае цифра 1 ) и по порядку кол-во кип (в моем случае 1-10) В общем надо сделать что-то в виде макроса. И надо, чтоб выходило на печать 10 бумажек, в которых будет порставлено на каждой номер партии (в моем случае цифра 1 ) и по порядку кол-во кип (в моем случае 1-10) Сообщение В общем надо сделать что-то в виде макроса. И надо, чтоб выходило на печать 10 бумажек, в которых будет порставлено на каждой номер партии (в моем случае цифра 1 ) и по порядку кол-во кип (в моем случае 1-10) Заранее спасибо Автор — Silver |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|