Печать бланков из списка в Excel

Печать бланков из списка в Excel

Очень легко научимся из любого списка Excel делать неограниченное количество бланков (форм, анкет, документов) с помощью макросов VBA.

Задача

Распечатать Карты диспансерного наблюдения (форма 030/у) для стоматологической клиники на n пациентов из списка Excel.

Дано

ПК с MS Office 2016 (неважно какой)
Сам список в формате Excel
Форма 030/у (есть в общем доступе)

Решение

Условно план работы такой: 

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

Вот такой список у нас есть - здесь, в принципе, имеются почти все поля, которые должны быть в нашем бланке (карте диспансерного наблюдения форма 030/у). Сохраняем наш список в формате xlsm, т.к. только в этом формате можно засунуть туда макросы (кстати в старых версиях MS Office макросы сохранялись в формате xls).

В исходном файле ФИО пациентов было написано в нижнем регистре, чтобы написать первую букву каждого слова в ячейке Excel с большой буквы используем формулу:

=ЗАМЕНИТЬ(I2;1;1;ПРОПИСН(ПСТР(I2;1;1)))

В нашем файле (уже сохраненном в формате xlsm) создаем ещё две вкладки:
"Настройки" (для управления макросом)
"Форма 030у" (сам бланк)

Вкладка "Настройка"
В ячейке E9 - будет начальная строка для вставки в бланк, а ниже в Е10 - конечная строка.
Таким образом, задав начало и конец циклу печати бланков, можно будет оставить наш файл (пока тот отправляет готовые бланки на принтер) и пойти попить кофе.
А в 15 и 16 строки будем копировать строки из нашего списка.
Ну и всякие приколюли, типа большой кнопки для запуска, подсчета кол-ва листов (Е11).

Вкладка "Форма 030у"
Здесь будет шаблон формы, в которую будет вставляться наши значения из строк вкладки "Настройки".
Поскольку наш бланк маленький (Карта диспансерного наблюдения) - на полиста А4, то на одном листе будет два бланка - поэтому и строки для вставки за раз - две штуки.
Слева - лицо бланков, справа - зад(няя часть). Оборот сзади всегда будет пустой, поэтому его напечатаем после всего, просто так.

Соответствие полей формы настраиваем простой формулой, например, поле диагноза бланка соответствует ячейки Настройка!N15.
И так по аналогии все нужные поля в обоих бланках.

Создаем сам макрос
Есть много способов, мне нравится такой: внизу слева шмакаем на квадратик. В диалоге нажимаем "Ок"

Открывается встроенный в каждый Office редактор макросов Microsoft Visual Basic for Application (VBA)
Копируем и вставляем туда этот простой макрос

‘ Очищаем строки (можно и без этого, но так правильнее)
Worksheets(«Настройка»).Range(«A15:Z16»).ClearContents

‘ Объявляем переменные
Dim fr, lr, i
‘ Первая строка
fr = Sheets(«Настройка»).Cells(9, 5).Value
‘ Последняя
lr = Sheets(«Настройка»).Cells(10, 5).Value

‘ Цикл перебора строк
For i = fr To lr

     ‘ Копируем 2 новые строки

     Worksheets(«Список»).Rows(i).Copy Worksheets(«Настройка»).Rows(15)
     Worksheets(«Список»).Rows(i + 1).Copy Worksheets(«Настройка»).Rows(16)

     ‘ Печать — отправляем на принтер
     Worksheets(«Форма 030у»).PrintOut
     ‘ Маленькая пауза, чтобы не забить память принтера
     Application.Wait Time:=Now + TimeValue(«0:00:10»)

     ‘ прибавляем 1 — т.к. идем по два
     i = i + 1
Next i

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

Всё готово.
Работает очень просто:
Макрос берет строку, указанную в ячейке Е9 листа "Настройки" и копирует с листа "Список" в "Настройки" в строку 15. Аналогично со следующей строкой (т.к. идём по два).
Затем значения из этих двух строк автоматом по формулам встают на лист с бланком "Форма 030у" в нужные ячейки и этот лист отправляется на печать.
Цикл повторяется с начала.

Любое использование материалов — только с обязательным указание сайта koozmin.ru