Автоматическая печать конвертов в Excel на VBA и Python
Снаружи EnvelopeHelper выглядит как обычный Excel-файл с парой кнопок. Внутри — три слоя, каждый из которых решает свою задачу: Excel хранит данные, VBA управляет процессом, а отдельная программа на Python рисует сами конверты. Разберём, зачем такая связка и почему это надёжнее, чем печатать конверты напрямую из Word или Excel.
Опубликовано
Из чего состоит EnvelopeHelper
В архиве три составные части:
- EnvelopeHelper.xlsm — сам Excel-файл с листами «Получатели» и «Настройки» и макросами VBA;
- папка bin — лежит рядом с xlsm-файлом и содержит:
- EnvelopeHelper.exe — отдельную программу, которая формирует PDF;
- папку _internal — библиотеки, нужные exe-файлу для работы.
Это не совпадение и не техническая небрежность: три части — это три разных слоя со своей ролью, и трогать структуру папок нельзя, потому что VBA ищет exe-файл именно в подпапке bin рядом с самим Excel-файлом.
Зачем нужен именно такой стек
Слой 1 — Excel: хранилище данных и интерфейс
Лист «Получатели» — это таблица со списком адресов, лист «Настройки» — данные отправителя и калибровка печати. Excel в этой связке не занимается версткой конверта, он просто хранит данные в привычном табличном виде и даёт удобный интерфейс: заполнить строку, поставить галочку, нажать кнопку.
Слой 2 — VBA: диспетчер процесса
Когда нажимается кнопка «Сформировать конверт(ы)», макрос VBA:
- проходит по листу «Получатели» и собирает строки, отмеченные галочкой;
- проверяет, что все выбранные строки — одного формата конверта;
- формирует из данных получателей и настроек отправителя временный файл-задание;
- запускает EnvelopeHelper.exe с этим заданием и ждёт, пока он завершит работу;
- после завершения открывает папку
output\с готовым PDF или показывает сообщение об ошибке, если что-то пошло не так.
VBA здесь не рисует конверты сам — он выступает диспетчером: собирает входные данные, вызывает внешнюю программу и обрабатывает результат. Верстка PDF в Excel неудобна и ограничена: тонкая настройка отступов, шрифтов и координат гораздо надёжнее делается отдельным кодом, а не формулами и объектами на листе.
Слой 3 — Python: генератор PDF
Сама отрисовка конверта — это отдельная программа на Python, упакованная в один exe-файл через PyInstaller. Она получает от VBA список получателей и данные отправителя, а дальше для каждого адресата:
- рассчитывает точные координаты блоков «отправитель» и «получатель» под выбранный формат конверта (DL, C6, C5 или C4);
- размещает текст и, если указан, логотип отправителя;
- учитывает калибровку, заданную на листе «Настройки»;
- добавляет получившийся конверт отдельной страницей в общий PDF.
Почему не сделать это средствами самого Excel? У Excel нет нормального способа задать координаты объектов в миллиметрах относительно физического листа бумаги — печать «плывёт» в зависимости от принтера, драйвера и локальных настроек Windows. PDF, собранный кодом с абсолютными координатами, выглядит одинаково независимо от того, на каком компьютере и принтере его открыли.
Почему PDF, а не печать напрямую из Excel или Word
- Предсказуемость. PDF-страница имеет фиксированный размер и координаты — то, что вы видите при тестовой печати, будет напечатано так же и через месяц, и на другом компьютере. Прямая печать из Excel зависит от масштаба страницы, полей, версии Excel и настроек конкретного принтера.
- Пакетная обработка. Один PDF может содержать сразу несколько десятков или сотен конвертов — по странице на получателя. Печатать такой список сразу удобнее, чем открывать и распечатывать каждый конверт по отдельности.
- Архив отправлений. Готовый PDF можно сохранить, переслать на печать в другое место или в типографию, не пересылая сам Excel-файл с данными получателей.
- Независимость от Word. Не нужна ни печать слиянием (mail merge), ни установленный Word — только Excel и сам exe-файл.
Как работает пакетная генерация
В одно задание можно включить до 500 получателей. Внутри процесс устроен просто:
- VBA собирает все отмеченные галочкой строки одного формата конверта в единый список заданий;
- EnvelopeHelper.exe запускается один раз для всего списка — не по разу на каждого получателя, это было бы медленно;
- внутри Python-программа проходит по списку в цикле и добавляет для каждого получателя новую страницу в один и тот же PDF-документ;
- готовый файл с конвертами по числу отмеченных строк сохраняется в папке
output\.
Формат конверта в рамках одного задания смешивать нельзя — у DL, C6, C5 и C4 разный размер страницы PDF, поэтому под каждый формат нужен отдельный запуск генерации.
Часто задаваемые вопросы
Нужно ли устанавливать Python, чтобы это заработало?
Нет. Python-часть уже собрана в автономный EnvelopeHelper.exe при помощи PyInstaller — все нужные библиотеки упакованы внутрь. Устанавливать Python, ReportLab или что-либо ещё не требуется.
Почему макрос не запускает генерацию PDF?
Чаще всего причина в одном из двух: либо в файле не разрешено выполнение макросов, либо папка bin с EnvelopeHelper.exe и _internal не лежит рядом с EnvelopeHelper.xlsm — VBA ищет исполняемый файл именно в подпапке bin рядом с самим Excel-файлом. Как включить макросы и снять блокировку — в статье «как разблокировать и открыть файл».
Можно ли сгенерировать конверты сразу для двух форматов одной кнопкой?
Нет — за один запуск EXE строит PDF одного формата, потому что у каждого формата конверта своя фиксированная страница. Если нужны разные форматы, запускайте генерацию отдельно для каждого — VBA сам отфильтрует строки по выбранному формату.
Что произойдёт, если закрыть Excel во время генерации?
Лучше этого не делать: VBA ждёт завершения работы EXE и блокирует книгу до получения ответа. Если закрыть файл в этот момент, задание прервётся и PDF может получиться неполным — тогда его нужно будет сформировать заново.
Что дальше
Если вы ещё не заполняли список получателей — начните со статьи «Печать адресов на конвертах: пошаговая инструкция». А если непонятно, что именно должно быть написано на самом конверте — в статье «как правильно заполнять почтовый конверт» показана структура блоков адреса.
Попробуйте EnvelopeHelper
Excel-файл с VBA и автономная программа на Python — вместе они формируют готовый PDF для печати конвертов DL, C6, C5 и C4. Устанавливать Python не нужно.