Очень часто бывает такое, что нужно сформировать документы по определенному шаблону, на основе каких-то данных, например, по каждому сотруднику или по каждому лицевому счету. И делать это вручную бывает достаточно долго, когда этих самых сотрудников или лицевых счетов много, поэтому сегодня мы рассмотрим примеры реализации таких задач в Excel с помощью макроса написанного на VBA Excel.
Немного поясню задачу, допустим, нам необходимо сформировать какие-то специфические документы по шаблону массово, т.е. в итоге их получится очень много, как я уже сказал выше, например, по каждому сотруднику. И это нужно сделать непосредственно в Excel, если было бы можно это сделать в Word, то мы бы это сделали через «Слияние», но нам нужно именно в Excel, поэтому для этой задачи мы будем писать макрос.
Мы с Вами уже выгружали данные по шаблону через клиент Access из базы MSSql 2008 в Word и Excel вот в этой статье — Выгрузка данных из Access в шаблон Word и Excel. Но сейчас допустим, у нас данные располагаются в базе, в клиенте которой нельзя или слишком трудоемко реализовать такую задачу, поэтому мы просто выгрузим необходимые данные в Excel и на основе таких данных по шаблону сформируем наши документы.
В нашем примере мы, конечно, будем использовать простой шаблон, только для того чтобы это было просто наглядно и понятно (только в качестве примера), у Вас в свою очередь шаблон будет, как мне кажется намного сложней.
Напомню, что на данном сайте тема VBA Excel уже затрагивалась, например, в материале – Запрет доступа к листу Excel с помощью пароля
И так приступим!
Реализовывать нашу задачу будем на примере «Электронной карточке сотрудника» (я это просто придумал:), хотя может такие и на самом деле есть), т.е. документ в котором хранится личные данные сотрудника вашего предприятия, в определенном виде, именно в Excel.
Примечание! Программировать будем в Excel 2010.
И для начала приведем исходные данные, т.е. сами данные и шаблон
Данные.
Лист, на котором расположены эти данные так и назовем «Данные»
Шаблон.
Лист, на котором расположен шаблон, тоже так и назовем «Шаблон»
Далее, нам необходимо присвоить имена полей для вставки, так более удобней к ним обращаться чем, например, по номеру ячейки.
Это делается очень просто, выделяете необходимую ячейку или диапазон, и жмете правой кнопкой мыши и выбираете «Присвоить имя», пишите имя ячейки и жмете «ОК»
Свои поля я назвал следующим образом:
- ФИО – fio;
- № — number;
- Должность – dolgn;
- Адрес проживания – addres;
- Тел. № сотрудника – phone;
- Комментарий – comment.
Код макроса на VBA Excel
Для того чтобы написать код макроса, открывайте на ленте вкладку «Разработчик», далее макросы.
Примечание! По умолчанию данной вкладке в Excel 2010 может и не быть, чтобы ее отобразить нажмите правой кнопкой по ленте пункт меню «Настройка ленты»
затем, в правой области поставьте галочку напротив пункта «Разработчик»
После вкладка разработчик станет отображаться на ленте.
Далее, когда Вы откроете вкладку разработчик и нажмете кнопку «Макросы» у Вас отобразится окно создания макроса, Вы пишите название макросы и жмете «создать».
После у Вас откроется окно редактора кода, где собственно мы и будем писать свой код VBA. Ниже представлен код, я его как обычно подробно прокомментировал:
Sub Карточка() 'Книга NewBook = "" ' Путь, где будут храниться наши карточки ' Т.е. в той папке, откуда запустился файл с макросом Path = ThisWorkbook.Path ' Выбираем лист с данными Sheets("Данные").Select ' Запускаем цикл, скажем на 100000 итераций ' Начиная со второй строки, не учитывая заголовок For i = 2 To 100000 ' Выйдем из него, когда фамилии закончатся, т.е. строки If Cells(i, 1).Value = "" Then i = 100000 Exit For End If ' Имя файла карточки, назовем по фамилии Name_file = Path & "" & Sheets("Данные").Cells(i, 1).Value & ".xls" ‘Выбираем лист с шаблоном Sheets("Шаблон").Select ' Присваиваем значения нашим ячейкам, по именам которые мы задавали Range("fio").Value = Sheets("Данные").Cells(i, 1).Value & " " & _ Sheets("Данные").Cells(i, 2).Value & " " & Sheets("Данные").Cells(i, 3).Value Range("number").Value = Sheets("Данные").Cells(i, 4).Value Range("addres").Value = Sheets("Данные").Cells(i, 5).Value Range("dolgn").Value = Sheets("Данные").Cells(i, 6).Value Range("phone").Value = Sheets("Данные").Cells(i, 7).Value Range("comment").Value = Sheets("Данные").Cells(i, 8).Value ' Копируем все Cells.Select Selection.Copy ' Создаем новую книгу или делаем ее активной If NewBook = "" Then Workbooks.Add NewBook = ActiveWorkbook.Name Else Workbooks(NewBook).Activate Cells(1, 1).Select End If ' Вставляем данные в эту книгу Application.DisplayAlerts = False ActiveSheet.Paste Application.CutCopyMode = False ' Сохраняем с нашим новым названием ActiveWorkbook.SaveAs Filename:= _ Name_file, FileFormat:=xlExcel8, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False NewBook = ActiveWorkbook.Name Application.DisplayAlerts = True ' Снова активируем файл с макросом и выбираем лист Workbooks("Макрос.xls").Activate Sheets("Данные").Select ' Переходим к следующей строке Next i ' Закроем книгу Workbooks(NewBook).Close ' Выведем сообщение об окончании MsgBox ("Выполнено!") End Sub
Теперь осталось выполнить этот макрос, для этого откройте вкладку разработчик->макросы->выполнить наш макрос:
и после выполнения у Вас в той же папке появится вот такие файлы
Вот с таким содержимым:
Для удобства можете на листе с данными создать кнопку и задать ей событие выполнить наш только что созданный макрос, и после чего простым нажатием выполнять этот макрос. Вот и все! Удачи!
Генерация документов и отчетов из реестра или базы данных Excel с помощью кода VBA для просмотра, анализа и вывода на печать. Создание, заполнение, удаление.
Нет смысла хранить множество документов и отчетов в отдельных файлах, если существуют реестры и базы данных Excel, в которых уже есть вся необходимая информация. Каждый документ или отчет можно сгенерировать с помощью кода VBA в виде временного файла, просмотреть его, проанализировать, распечатать. Затем удалить его, а при необходимости сформировать снова.
Создание документа или отчета из шаблона
Допустим, у нас есть реестр документов или база данных Excel с какой-либо информацией. Чтобы создать документ или отчет и заполнить его данными, необходим его шаблон (печатная форма).
Шаблон создаем вручную на отдельном рабочем листе или с помощью кода VBA при заполнении документа. Способы создания шаблона определяют место его хранения:
- В коде VBA. Такой способ возможен для несложных печатных форм.
- В рабочей книге Excel с реестром или базой данных на скрытом листе.
- В отдельном файле, который не обязательно сохранять как шаблон Excel (*.xlt*).
Я предпочитаю создавать шаблон вручную и хранить его на скрытом листе в книге с реестром или базой данных. Такой способ подходит для подавляющего большинства случаев.
Из редких исключений можно назвать печать ценников на основании товарной накладной, сохраненной в Excel. Шаблон ценника и программный код VBA приходится хранить в отдельном файле, по команде из которого открывается и обрабатывается товарная накладная.
Назовем лист с шаблоном документа или отчета — «Shablon». Для создания новой печатной формы скрытый лист с шаблоном необходимо скопировать:
With Worksheets(«Shablon») .Visible = True .Copy After:=Worksheets(Worksheets.Count) .Visible = False End With |
Данный код вставит новый лист с шаблоном в ту же книгу после всех имеющихся листов. Чтобы шаблон скопировать в новую книгу, заменяем строку .Copy After:=Worksheets(Worksheets.Count)
на .Copy
. Печатная форма откроется в новом файле.
Сразу после создания, обращаться к новому листу можно как к активному (ActiveSheet), даже в том случае, если он скопирован в новую книгу. Чтобы воспользоваться этой возможностью, порядок действий в программе должен быть следующим:
- Копирование информации в переменную массива из реестра или базы данных.
- Создание нового документа или отчета из шаблона.
- Заполнение документа или отчета, обращаясь к нему как к ActiveSheet.
Копирование информации и заполнение формы
Копирование информации
Информация о документе обычно хранится в реестре или базе данных Excel в одной строке. Информация для отчета может располагаться как в одной, так и в нескольких или во многих строках.
Если информация нужна из одной строки, перед запуском кода VBA следует выделить любую ячейку в строке с данными. Тогда в ходе выполнения программы можно будет определить номер строки по активной ячейке и извлечь из нее информацию.
Допустим, что лист называется «Reestr», а необходимая информация расположена в десяти первых ячейках каждой строки:
Dim nomer As Long, massiv() As Variant nomer = ActiveCell.Row massiv = Range(Cells(nomer, 1), Cells(nomer, 10)) |
Если для отчета требуется информация из нескольких строк, можно выделить их вертикально по любому столбцу и использовать следующий код:
Dim nomer1 As Long, nomer2 As Long, massiv() As Variant nomer1 = Selection.Cells(1).Row nomer2 = Selection.Cells(Selection.Cells.Count).Row massiv = Range(Cells(nomer1, 1), Cells(nomer2, 10)) |
В иных случаях, когда для отчета требуется большое количество строк, можно организовать автоматическое выделение диапазона, например, по интервалу дат.
Если требуется обработка данных для отчета, проводим ее в массиве. Для результатов обработки можно объявить еще одну переменную массива.
Создание и заполнение формы
После того как информация скопирована и обработана, создаем из шаблона печатную форму документа или отчета, лист которой после создания будет активным.
Заполняем ячейки печатной формы информацией из массива, обращаясь к листу с формой как к ActiveSheet. Если новый документ или отчет создан в той же книге, ее можно автоматически сохранить:
Чтобы не наблюдать за мерцаниями экрана во время выполнения процедуры VBA Excel, можно временно отключить его обновления:
Sub GeneratsiyaDokumenta() Application.ScreenUpdating = False ———— операторы ———— Application.ScreenUpdating = True End Sub |
Удаление печатной формы
Если лист документа или отчета временно сохраняется в книгу с реестром или базой данных, можно предусмотреть его простое удаление без выведения дополнительного диалогового окна.
Для этого необходимо на лист шаблона правее печатной формы вставить кнопку из коллекции «Элементы управления ActiveX». Дважды кликнуть по ней и в открывшемся модуле листа внутрь автоматически сгенерированного объявления процедуры вставить строку Call UdaleniyeLista
:
Sub CommandButton1_Click() Call UdaleniyeLista End Sub |
Затем в модуль текущей книги добавляем процедуру:
Sub UdaleniyeLista() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub |
Кнопка вместе с шаблоном будет копироваться в новую печатную форму. При нажатии кнопки активный лист будет удаляться кодом VBA без предупреждения от Excel.
- Документы Word
- Создание файлов
- Работа с файлами
Макрос предназначен для программного создания документов Word на основе шаблона
(без использования функции слияния в Word)
В прикреплённом к статье архиве находятся 2 файла:
- шаблон договора в формате Microsoft Word (расширение .dot)
- файл Excel с макросом
Настройки макроса задаются в коде:
Const ИмяФайлаШаблона = «шаблон.dot»
Const КоличествоОбрабатываемыхСтолбцов = 8
Const РасширениеСоздаваемыхФайлов = «.doc»
При нажатии кнопки запуска макрос на основе шаблона dot создаёт очередной файл, и в этом документе производит замену текста («кода поля») из первой строки файла Excel на значение поля (из очередной строки с данными файла Excel)
Папка для сформированных документов создаётся автоматически, и содержит в имени текущую дату и время
(например, созданная папка будет называться Договоры, сформированные 01-05-2011 в 15-03-24)
Имена создаваемых файлов формируются объединением полей фамилия, имя и отчество, с добавлением расширения doc
PS: Макрос был написан достаточно давно, когда я только начинал изучать VBA, — так что код недостаточно универсален.
Но, в качестве примера, пожалуй, подойдёт (если вам нужен более функциональный макрос, воспользуйтесь универсальной надстройкой (см. ниже))
Ознакомьтесь также с универсальной надстройкой формирования документов по шаблонам,
которая может делать всё тоже самое, что и эта программа,
только в качестве шаблонов могут выступать, помимо документов Word, ещё текстовые файлы, и книги Excel.
В надстройке — много возможностей, и полезных дополнений: склонение ФИО в родительный и дательный падежи, автоматический вывод на печать (с заданным количеством копий), размещение созданных файлов в разных папках, создание и рассылка писем со вложениями, и множество других полезных функций.
По вышеприведённой ссылке программа заполнения документов Word из Excel доступна для бесплатного скачивания.
Внимание: просьбы о доработке макроса, описанного в этой статье, не принимаются.
Есть новая (универсальная) версия, — в которой уже есть практически всё, что может понадобиться.
- 197090 просмотров
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
Краткое описание
Макрос на основе шаблонов в формате Word и по заданному списку значений в Excel формирует необходимое количество вордовских документов. Количество формируемых файлов неограниченно и зависит только от числа указанных вами параметров в Excel.
Подробное описание
Если по роду деятельности часто приходится формировать какие-либо документы в Word по шаблону (приказы, распоряжения, договора, соглашения, счета и др), то вам может пригодится макрос для автоматизации создания вордовских документов на основе исходных данных в файле Excel.
Макрос удобно и быстро создает необходимые документы, исходя из указанных шаблонов и настроенных параметров.
— Шаблоны задаются в формате Word. Количество одновременно используемых шаблонов неограниченно.
— Настройки (параметры) для подстановки в шаблоны хранятся в файле эксель. Может быть задано неограниченное количество параметров.
Из дополнительных возможностей макроса:
— В настройках листа с данными достаточно указать название шаблона и именно данный шаблон будет применен для формирования документов. Если шаблонов указано несколько, то формирование документов будет происходить по нескольким (указанным) шаблонам.
— В настройках макроса можно указать, по каким строкам формировать документы, а по каким пропускать.
— Для каждого формируемого документа можно указать необходимое имя (название).
— Для более удобной вставки наименований шаблонов в ячейку достаточно два раза кликнуть на соответствующей ячейке в столбце «C» и в открывшейся форме выбрать нужные шаблоны.
В целом, ничего сложного в работе с макросом и шаблонами нет.
Перед запуском макроса обязательно ознакомьтесь с примечаниями в пункте «Важно» на листе «const».
Скачать макрос эксель для создания документов и примеры шаблонов можно по ссылке выше.
Обновление макроса от 09.07.2020
В программу добавлена возможность замены значений в колонтитулах. Колонтитулы учитываются как верхние, так и нижние. При необходимости можете ознакомиться с примерами заполнения шаблонов, которые также присутствуют в архиве.
Ссылка на загрузку архива с программой обновлена. Актуальная версия программы: «CreateWord, v.2.xlsb».
Доброго времени… |
|
Пытливый Пользователь Сообщений: 4587 |
#2 14.12.2017 17:42:38 Может, как-то так? (рекордер включил)
Потом еще можно Activeworkbook.SaveAs добавить… Кому решение нужно — тот пример и рисует. |
||
Спасибо. |
|
oldy7 Пользователь Сообщений: 1061 Anchoret |
Вроде видел на просторах инета варианты решений, как не только создавать *xlsm файлы, но и макросы в них с ячеек листа. |
DmitriyBastr Пользователь Сообщений: 82 |
#5 15.12.2017 14:06:42 Получился вот такой код:
Адрес расположения шаблона берет из ячейки и создает соответствующий файл. |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#6 15.12.2017 14:13:54
Запишите это сохранение макрорекордером — увидите, в чём разница. |
||
DmitriyBastr Пользователь Сообщений: 82 |
#7 15.12.2017 15:10:37
При записи «Сохранить Как» получился такой макрос ↑ |
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
ChDir можно пренебречь. Обратите внимание, что Вы раньше пытались при сохранении Как указывать только имя и расширение файла. А формат не указывали. |
DmitriyBastr Пользователь Сообщений: 82 |
#9 15.12.2017 15:16:21 Имеете в виду
|
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
|
DmitriyBastr Пользователь Сообщений: 82 |
#11 15.12.2017 15:19:02 А за что отвечает
|
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Я справка или переводчик? ) Не создавать Бэкап файл (резервную копию). |
vikttur Пользователь Сообщений: 47199 |
#13 15.12.2017 15:23:55 … но и без этого нормально |