Автоматизация создания документов Word по шаблону
Краткое описание
Макрос на основе шаблонов в формате Word и по заданному списку значений в Excel формирует необходимое количество вордовских документов. Количество формируемых файлов неограниченно и зависит только от числа указанных вами параметров в Excel.
Подробное описание
Если по роду деятельности часто приходится формировать какие-либо документы в Word по шаблону (приказы, распоряжения, договора, соглашения, счета и др), то вам может пригодится макрос для автоматизации создания вордовских документов на основе исходных данных в файле Excel. Макрос удобно и быстро создает необходимые документы, исходя из указанных шаблонов и настроенных параметров. - Шаблоны задаются в формате Word. Количество одновременно используемых шаблонов неограниченно. Из дополнительных возможностей макроса: - В настройках листа с данными достаточно указать название шаблона и именно данный шаблон будет применен для формирования документов. Если шаблонов указано несколько, то формирование документов будет происходить по нескольким (указанным) шаблонам. В целом, ничего сложного в работе с макросом и шаблонами нет. Скачать макрос эксель для создания документов и примеры шаблонов можно по ссылке выше. Обновление макроса от 09.07.2020
- Настройки (параметры) для подстановки в шаблоны хранятся в файле эксель. Может быть задано неограниченное количество параметров.
- В настройках макроса можно указать, по каким строкам формировать документы, а по каким пропускать.
- Для каждого формируемого документа можно указать необходимое имя (название).
- Для более удобной вставки наименований шаблонов в ячейку достаточно два раза кликнуть на соответствующей ячейке в столбце "C" и в открывшейся форме выбрать нужные шаблоны.
Перед запуском макроса обязательно ознакомьтесь с примечаниями в пункте "Важно" на листе "const".
Ссылка на загрузку архива с программой обновлена. Актуальная версия программы: "CreateWord, v.2.xlsb".
Будем возможность, поделитесь ссылкой на данную страницу в соц. сетях или иных интернет источниках. Поможете проекту в развитии.
Посмотрел. Да, это из-за превышения 255 символов. Но это не ошибка макроса. В данном случае, это ограничение самого ворда. Если вы попробуйте вручную в вордовском документе через функционал «поиск — замена» сделать аналогичную замену, то ворд обрежет вашу строку до 255 символов.
Как альтернатива, либо переписать весь код макроса (что лично мне не целесообразно в данном случае), либо разбивать вашу исходную строку на большее количество меток, что при замене не превышать лимит в 255 символов.
Function ExportWord(ByVal iName As String, ByVal iVal As String) As Boolean
Dim a1 As Integer
a1 = 0
If iWord.Bookmarks.Exists(iName) Then
iWord.Bookmarks(iName).Range.Text = iVal
a1 = a1 + 1
End If
If a1 > 0 Then 'проверяем, найдена ли Закладка в документе Word
ExportWord = True 'закладка найдена
Else
ExportWord = False 'закладка НЕ найдена
End If
End Function
А в шаблоне Word значения в квадратных скобках выделить как закладки с присвоением имени (для имени закладок есть ограничения 40 символов, без пробелов) Имена закладок присвоить столбцам для заменяемых значений на листе data.
Как и говорил выше, если текст большой, — просто разбейте его на несколько переменных.
Попробовал исправить макрос с теми строками, что вы написали и у меня ошибку эксель выдает.
Допускаю, что сделал что то не так, был бы весьма благодарен за помощь
После чего появилось окошко с надписью:
Удаленный компонент: Компонент /xl/styles.bin. (Стили)
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet1.bin
Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet2.bin
Далее, при попытке сформировать документы (даже ничего не меняя, кроме пути на шаблоны), вылетает ошибка на буржуйском языке. Дескать, не найден прожект или библиотека. Выделена строка Microsoft Forms 2.0 Objekt Library.
Что я делаю не так?
Данный макрос работает вполне успешно на Windows 7 и выше и в Excel 2007 и выше.
Также возможно, либо настройки безопасности вашего экселя режут макросы либо ваш антивирус.
А при нажатии на кнопку Сформировать документ операция проходит, но папка Result пуста. В чем может быть проблема?
На листе const в ячейке E3 проверьте путь к вашей папке с шаблонами. Указанная папка должна существовать и в ней должны быть расположены шаблоны word с наименованиями, которые обозначены в ячейке E4.
2. «Invalid use of Null»
Проверил сейчас на двух компьютерах, всё работает. Почему у вас данная ошибка — не могу сказать.
Точно, что данный функционал никак не влияет на формирование файлов. Двойной клик по ячейке в столбце C — это исключительно для удобства заполнения ячейки нужными именами шаблонов. Если не сможете решить проблему с двойным кликом, можете заполнять ячейке в этом столбце вручную (разделитель точка с запятой, как в примере). Как вариант решения — переписать блок кода, отвечающий за позиционирование окна всплывающей формы.
И да, очень не хватает вставки данных и в поля колонтитулов. Но, боюсь, мне мозгов не хватит самой допиливать, чтобы и туда вставлялось. Так что буду ждать обновлений.
Ещё раз спасибо!
В иных случаях, мне дорабатывать под офис 2003 не актуально, т.к. версия данного офиса всё дальше уходит в прошлое и людей, использующих эту версию, всё меньше.
За сохранение файла в коде отвечает строка:
iWord.SaveAs filename:=BasePath & MyArray(i, 2) & " — " & tmpArray(q) & ".docx", FileFormat:=wdFormatXMLDocument
Соответственно, чтобы файл сохранялся под именем «Договор №[номер договора]», нужно написать:
iWord.SaveAs filename:=BasePath & «Договор №» & MyArray(i, 5) & ".docx", FileFormat:=wdFormatXMLDocument
Это при условии, что номер договора у вас указан на листе data в столбце E
Прекрасная работа спасибо, очень упрощает работу, единственный нюанс с которым я столкнулся, это данные которые указываю в екселе в разных форматах (процентный, числовой и т.д.), то они переносятся в документ не в том виде в котором в екселе, а в общий вид переводит. В итоге подставляются совсем не те данные. Так же, если уменьшаешь кол-во нолей после запятой, то при переносе эти данные так же игнорируются(.
Это можно как-то исправить?
Только через правку кода макроса.
Суть правки — добавить в макрос функционал, чтобы период отправкой в Word шла проверка текущего формата ячейки Excel и в Word, соответственно, потом шла вставка не значения ячейки (как сейчас), а уже отформатированного текста.
Правка, в целом, не сложная. Можете поправить самостоятельно (код открыт). Либо я поправлю позже (правда, не скажу точно когда, т.к. сейчас на это времени).
Я не держу весь код в голове. Чтобы понять, что править, мне также надо открывать и смотреть.
Раз такое дело, то: либо подождать, когда я найду свободное время и внесу необходимые правки в код, либо обратиться с вопросом на форумы по excel (код макроса открыт), либо я могу сделать нужные вам доработки за плату (если очень срочно надо). По вопросам платных доработок обращайтесь на info@excelstore.pro
У меня сработало, надо сконвертировать значение ячейки в виде текста и нужном вам формате, тогда в итоговом документе вы получите такое же отображение формата как и в ячейке
Ваш пример — это если настраивать формат непосредственно в экселе (что проще конечно). Если же настраивать в VBA, то функция format.
ПС_______
Не работает форма оплаты, не смог перевести 300 рублей на ваш кошелек
Ограничимся спасибом на добром слове :))
Почему то не работает выдает ошибку
complet error
Cant find project or library
Сложно что-либо комментировать, не зная условий, в которых возникла указанная ошибка.
compile error
Can't find project or library
параллельно с этим открывается редактор Visual Basic и там сразу выделен текст:
AppWord As Word.Application
После закрытия окна с сообщением об ошибке ещё в окне редактора Visual Basic появляется диалог References, где выделена библиотека Microsoft Forms 2.0 Object Library (C:\WINDOWS\SysWOW64\FM20.DLL)
… я проверил данный файл присутствует.
Эта ошибка проявилась и на компьютере с Win8.1, Office2010,
и на другом компьютере с WinXP, Office2007
… и там и там — одинаково.
Если ошибка связана с вычислением размера диалогового окна, то сложно что-то конкретное рекомендовать. Разве что можете отключить автофокус формы. Тогда проблема точно исчезнет, но форма будет появляться не рядом с ячейкой, а по середине листа.
Нет ли у Вас версии этого же макроса, чтобы он работал с Excel 2010/Word 2010?
Это возможно. Даже кто-то выше в комментариях уже просил реализовать подобное. К сожалению, всё никак не найду свободного времени реализовать данную доработку. В пору, наверное, создавать краудфандинговый проект на ту или иную доработку. Может тогда появится стимул ))
Насчет «передрал». Код макроса открыт. Приведете факты, что я скопировал код из макроса другого разработчика, тогда и поговорим.
И кстати, это не блог. А просто комменты к выложенным мной макросам.
Критиковать работу которую сделали бесплатно, уровень сверхразума.
скачала программу, но при запуске выдает ошибку: Compile error: Can`t find project or library. Что нужно сделать, чтобы исправить?
У вас по всей видимости не Excel 2013, а другая версия.
Если так, то чтобы макрос работал, необходимо в VBA -> Referenc отключить ошибочные библиотеки и подключить аналогичные, но для вашей версии Excel.
public appword as word.application, iWord as word.document
В какой библиотеке находиться описания объекта word? интерпретатор VBA не знает такого объекта. нужна dll библиотека?
Подскажите а вставка картинки возможна. В ячейке ссылка на изображение, а в шаблон ворд подстановка самой картинки.
Да, конечно, возможно. Но для этого необходимо доработать макрос, чтобы подобная обработка работала.
Пробовал запустить данный макрос под MacOS но что-то пошло не так, не совсем понятно какой прописывать путь к файлу, и вылетает ошибка «91» и ругается на Ворд почему то, есть ли у вас какое-то решение?
К сожалению, не подскажу. Макрос изначально создавался под Windows.
В ячейке E3 вместо «C:\Users\Admin\Desktop\Macro\шаблоны\» укажите путь к папке, в которой лежат нужные вам шаблоны. Все вордовский файлы, что будут в данной папке, макрос воспринимает как шаблоны.
Моя почта: info@excelstore.pro
Иногда беру заказы при наличии свободного времени. Если что, обращайтесь на почту info@excelstore.pro
У меня тот же вопрос, макрос заменяет сформированные файлы word в папке Result (несмотря на другое название), а хотелось бы чтобы папка дополнялась новым файлом.
В коде VBA найдите (например, через поиск) строку кода: Kill iPath & "*.docx"
и закоментируйте эту строку (добавьте апостроф впереди).
Тогда при каждом запуске макроса файлы с разными именами не будут перезаписываться, а просто дополнять папку.
Если имена файлов совпадут, то они перезапишутся.
В коде VBA найдите (например, через поиск) код: BasePath = ThisWorkbook.Path & "\Result\"
и замените его на: BasePath = ThisWorkbook.Path & "\" & Replace(Now, ":", "") & "\"
Тогда при каждом запуске макроса будет формироваться новая папка.
При замене, главное, не меняйте всю строку, а только указанный выше код (до двоеточия).
Благодарю!!!
Методом научного тыка для читабельности вставил другую команду из другого макроса:
BasePath = ThisWorkbook.Path & "\" & Format(Now, «YYYY_MM_DD hh_mm») & "\": Call FolderCreateDel(BasePath)
Я бы поехал головой делать 130 одинаковых договоров, еще и «срочно», если бы не ваш скрипт. От души.
У меня аналогичная проблемам:
При первом открытии, при двойном нажатии на столбец С (в котором перечислены шаблоны для обработки) вылетает exception run-time error '94': Invalid use of Null. При дебаге показывает, что ошибка в строке DesktopMonitor.ScreenHeight = Item.ScreenHeight, в функции GetDesktopMonitor().
А при нажатии на кнопку Сформировать документ операция проходит, но папка Result пуста. В чем может быть проблема?
Закоментируйте в макросе вызов функции GetDesktopMonitor
Подскажите пожалуйста, каким образом в макросе прописать так чтобы при одинаковом шаблоне создавался не отдельный файл, а добавлялось в ворд книгу следующей страницой
Для реализации задуманного необходимо в процедуре CreateDoc доработать блок:
iWord.SaveAs filename:=BasePath & MyArray(i, 2) & " — " & tmpArray(q) & ".docx", FileFormat:=wdFormatXMLDocument
iWord.Close False: Set iWord = Nothing
Все прекрасно работало до 3 строки. Дальше не идет, выдает ошибку.
Позже перепроверю логику работы с кавычками.
Подскажите, вы не создавали вариант с внесением данных в колонтитулы?
Если нет, не могли бы уточнить, какая часть кода отвечает за заполнение листов?
Просит пароль
Вы писали что код открытый
Поменял Microsoft Word 15.0 Object Library на Microsoft Word 14.0 Object Library
в функции GetDesktopMonitor() Item.ScreenHeight и Item.ScreenWeight поставил численные значения, чтобы не было ошибок.
Файлы создаются, но все 0 размера. Что может быть?
Закройте все документы ворд и после через диспетчер задач убедитесь, что нет вордовских процессов. Если есть, закройте их. После этого проверьте работу макроса.
Перед запуском макроса также рекомендую проверь, что в наименовании формируемых вами файлов нет символов, не допустимых в наименовании файла (т.е. название состоит из букв, цифр, пробелов или тире).
Если макрос помог, можете подписаться на мой канал YouTube: www.youtube.com/ExcelStore?sub_confirmation=1
На канале публикую много обучающих видео по работе с Excel и SQL.
Макрос очень помогает! Работает отлично.
Есть возможность сделать так, чтобы макрос проводил замену текста также в колонтитулах документа?
Возможность есть, но нет времени. Если оплатите данную доработку, то сделаю.
Если что, можете писать мне на почту: info@excelstore.pro
Подскажите, а что нужно подправить, чтобы итоговые файлы сохранялись в формате PDF?
вместо iWord.SaveAs Filename:=BasePath & MyArray(i, 3) & ".docx", FileFormat:=12 'wdFormatXMLDocument = 12
iWord.Close False: Set iWord = Nothing
пишу это
iWord.ExportAsFixedFormat OutputFileName:=BasePath & MyArray(i, 3) & ".pdf", ExportFormat:=17, OpenAfterExport:=False, UseISO19005_1:=False
iWord.Close 0: Set AppWord = Nothing
но макрос тупо зависает после создания первого PDF//
Попробуйте вот так. У меня, по крайней мере, данный код отработал без проблем.
Супер, получилось. Спасибо!!)
В этом блоке (в модуле iMacro):
'делаем замену переменных
For j = 4 To iColl
Call ExportWord(MyArray(1, j), MyArray(i, j))
Next j
можете написать:
'делаем замену переменных
For j = 4 To iColl
if trim(MyArray(i, j)) <> "" then Call ExportWord(MyArray(1, j), MyArray(i, j))
Next j
А возможно сделать, что бы при формирование файлов они бы формировались в формате pdf?
Это не очень актуально, т.к. PDF — это по сути уже закрытый документ, велика вероятность, что ворд после формирования надо немного поправить (например, в части переносов строк на другие листы).
А так в целом да, можно сделать и сохранение в PDF. Код открыт, можете доработать самостоятельно. Доработать нужно в блоке сохранения.
Могу я доработать — пишите на почту info@excelstore.pro
Есть вероятность что для Office 2013 и Visual Basic 7.1 необходимо писать условие по-другому?
Макрос не работает (
в макросе почему-то вылезает ошибка 91, не найдена объектная переменная.
работаю на маке, в чем может быть причина?
Нашел решение, но скорость формирования документов резко возросла. В общем тем кому надо править все колонтитулы и верхние и нижние пробуйте: надо
заменить на это:
Возможно я верхний колонтитул отключу он у меня практически не используется)
В двух словах сложно объяснить. Если коротко, то изменить массив в коде. Сейчас там жестко задано, что заголовки идут по горизонтали в самом вверху. Вам же нужно сделать по вертикали.
Пользуюсь данным макросом давно, но то ли прошло какое-то обновление ПК или еще чего, но перестали вставляться значения в шаблон. Сам файл после отработки макроса сохраняется, но значения, не подставлены. Не понимаю в чем проблема. В код макроса не лазили. Win10, ms office 2021
Сам к макросах ноль, не справлюсь.
Формируется файл Word, как в шаблоне, без замены кодов на значение из таблицы.
Ничего не правил, просто перестало заменять.
При первом запуске в Excel файла CreateWord_v.2.xlsb сегодня вылетела ошибка, что-то про VBA макросы было, не успел прочитать. Больше ошибка не выходила, перезагружал комп, восстанавливал файл макроса из чистого архива — всё равно не работает.
Тоже Win10 + Office 365 (лицензия).
Проверил + ребята знакомые помогли потестировать на других версиях офиса. В общем, проблема наблюдается только в Office 365. Например, в том же Office 2013, 2016, 2019, 2021 все работает нормально.
Файл поправил. Ссылка: disk.yandex.ru/d/VvNwUiv5HrAWnw
Если будете использовать другой офис (не 365), то рекомендую пользоваться прежней версией (v.2), которая по прежнему находится в шапке данной статьи.
Спасибо Вам большое за GeoYandexGoogle!
Балуюсь с ним через API Яндекса.
Вопрос
Странная ошибка при работе — непонятен первый запрос, остальные приведены для примера:
— Запрос
Россия, Республика Саха (Якутия), Булунский район, пгт Тикси, ул. ?Больничная, 1
Ответ
Мали, Каес, Бе -10.960363 13.352855
— Запрос
Россия, Республика Саха (Якутия), Булунский район, п. Тикси, ул. Ленинская, д. 13а
Ответ
Россия, Республика Саха (Якутия), муниципальный район Булунский улус, посёлок городского типа Тикси, Ленинская улица, 13А 128.868861 71.637861
— Запрос
Россия, Республика Саха (Якутия), Булунский район, п. Тикси, ул. Больничная, 1/1
Ответ
Россия, Республика Саха (Якутия), муниципальный район Булунский улус, посёлок городского типа Тикси, Больничная улица, 2А 128.853545 71.638343
Прежде всего спасибо за удобный макрос! Использую давно.
Недавно столкнулся с проблемой — на рабочем ноутбуке не создаётся файл в папке results — вообще никакой! Хотя все пути прописаны верно.
Дома всё работает — заключаю, что могут быть какие-то ограничения — где проверить? В программе макросы все включены…
Макрос отличный! Обязательно поделюсь ссылкой на Ваш сайт.
Подскажите, у макроса есть какая-то лицензия? Можем мы его использовать в организации для работы?
Макрос отличный, но можно ли как то сделать, чтобы таблица с данными была не в строке, а в столбике? (Транспорировать), не совсем удобно вводить данные в таком виде (В столбце было бы удобнее)
1. создал новый лист
2. Скопировал-транспорировал на нем таблицу с листа «Data»
3. На листе «Data» приравнял соотвествующие ячейки (столбцы) к ячейкам (Строкам) на созданном листе
Проверил, работает, вводить данные удобнее, но хотелось бы без лишней возни=)
'перебираем массив
For j = 2 To iColl
If MyArray(1, j) = «ok» Then
'перебираем указанные word-шаблоны
tmpArray = Split(MyArray(3, j), ";")
For q = 0 To UBound(tmpArray)
tmpSTR = iFolder & tmpArray(q) & ".docx"
If Len(Dir(tmpSTR)) > 0 Then
Set iWord = AppWord.Documents.Open(tmpSTR, ReadOnly:=True)
'делаем замену переменных
For i = 4 To iRow
Call ExportWord(MyArray(i, 1), MyArray(i, j))
Next i
iWord.SaveAs filename:=BasePath & MyArray(2, 2) & " — " & tmpArray(q) & ".docx", FileFormat:=12 'wdFormatXMLDocument = 12
iWord.Close False: Set iWord = Nothing
End If
'tmpSTR = ""
Next q
'Erase tmpArray
End If
Next j
Дополнительно поменять макрос на листе data:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Row = 3 Then
Cancel = True
UserForm1.Show
End If
End Sub
Макрос отличный, но нет предела совершенству :). Не подскажете, как в макросе можно настроить поиск закладок НЕ ТОЛЬКО на одном листе?
Заранее благодарен!