Автоматизация создания документов Word по шаблону


Краткое описание

Макрос на основе шаблонов в формате Word и по заданному списку значений в Excel формирует необходимое количество вордовских документов. Количество формируемых файлов неограниченно и зависит только от числа указанных вами параметров в Excel.


Подробное описание

Если по роду деятельности часто приходится формировать какие-либо документы в Word по шаблону (приказы, распоряжения, договора, соглашения, счета и др), то вам может пригодится макрос для автоматизации создания вордовских документов на основе исходных данных в файле Excel.

Макрос удобно и быстро создает необходимые документы, исходя из указанных шаблонов и настроенных параметров.

       - Шаблоны задаются в формате Word. Количество одновременно используемых шаблонов неограниченно.
       - Настройки (параметры) для подстановки в шаблоны хранятся в файле эксель. Может быть задано неограниченное количество параметров.

Из дополнительных возможностей макроса:

       - В настройках листа с данными достаточно указать название шаблона и именно данный шаблон будет применен для формирования документов. Если шаблонов указано несколько, то формирование документов будет происходить по нескольким (указанным) шаблонам.
       - В настройках макроса можно указать, по каким строкам формировать документы, а по каким пропускать.
       - Для каждого формируемого документа можно указать необходимое имя (название).
       - Для более удобной вставки наименований шаблонов в ячейку достаточно два раза кликнуть на соответствующей ячейке в столбце "C" и в открывшейся форме выбрать нужные шаблоны.

В целом, ничего сложного в работе с макросом и шаблонами нет.
Перед запуском макроса обязательно ознакомьтесь с примечаниями в пункте "Важно" на листе "const".

Скачать макрос эксель для создания документов и примеры шаблонов можно по ссылке выше.

Обновление макроса от 09.07.2020

В программу добавлена возможность замены значений в колонтитулах. Колонтитулы учитываются как верхние, так и нижние. При необходимости можете ознакомиться с примерами заполнения шаблонов, которые также присутствуют в архиве.
Ссылка на загрузку архива с программой обновлена. Актуальная версия программы: "CreateWord, v.2.xlsb".

Вернуться к списку примеров

Комментарии ()

  1. Констанин 04 августа 2017, 14:31 # 0
    Спасибо огромное. макрос очень помог, давно искал.
    1. Maxim 04 августа 2017, 14:54(Комментарий был изменён) # 0
      Да, макрос при должном применении очень упрощает автоматизацию создания типовых документов. К тому же, его легко масштабировать.
      Будем возможность, поделитесь ссылкой на данную страницу в соц. сетях или иных интернет источниках. Поможете проекту в развитии.
    2. Юрий 31 августа 2017, 12:38 # 0
      Добрый день! Вчера искал что то подобное вашему макросу в интернете, наткнулся на эту страницу. Возился вечер утро, а макрос не работает) я так понял ошибка возникает при копировании ячейки размером более 255 символов, поможете допилить? Буду бескрайне благодарен и запощу отзыв о Вас везде где смогу ;)
      1. Maxim 10 сентября 2017, 20:37 # 0
        Здравствуйте, Юрий.
        Посмотрел. Да, это из-за превышения 255 символов. Но это не ошибка макроса. В данном случае, это ограничение самого ворда. Если вы попробуйте вручную в вордовском документе через функционал «поиск — замена» сделать аналогичную замену, то ворд обрежет вашу строку до 255 символов.
        Как альтернатива, либо переписать весь код макроса (что лично мне не целесообразно в данном случае), либо разбивать вашу исходную строку на большее количество меток, что при замене не превышать лимит в 255 символов.
        1. Александр 12 июля 2019, 15:07 # 0
          Чтобы решить проблему 255 символов, необходимо в модуле iFunction немного переписать код
          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.
          1. Анастасия 12 мая 2020, 18:18 # 0
            Здравствуйте. Очень понадобился этот макрос и крайне необходимо вносить информацию с большим количеством символов, нежели 255. Подскажите пожалуйста, не могли бы Вы отправить мне с внесёнными правками макрос? Была бы очень благодарна. К сожалению, не разбираюсь в данной теме настолько, чтобы самостоятельно вносить правки в код. Эл.почта disorder0502@gmail.com
            1. Maxim 12 мая 2020, 19:04 # 0
              Здравствуйте. А здесь и не нужно разбираться в макросе. Просто создайте две переменные, в которых отразите ваш текст (первая переменная — одна часть текста, вторая переменная — другая). И шаблоне ворда соответственно эти переменные поставьте рядом, чтобы текст слитно вставлялся.
            2. Дмитрий 28 июля 2020, 17:49 # 0
              Вроде добавил кусок кода, создаю в шаблоне закладку с именем, это имя прописываю в наименовании столбца на листе data, до 255 символов замена происходит без проблем, более 255 символов — та же ошибка. Кусок кода вроде работает, но проблему 255 символов не решил
              1. Maxim 03 августа 2020, 10:05 # 0
                255 символов — это ограничение офиса.
                Как и говорил выше, если текст большой, — просто разбейте его на несколько переменных.
              2. Jester 11 октября 2023, 06:53 # 0
                Приветствую, очень необходимо, чтобы можно было вносить более 255 символов.
                Попробовал исправить макрос с теми строками, что вы написали и у меня ошибку эксель выдает.
                Допускаю, что сделал что то не так, был бы весьма благодарен за помощь
          2. Тимур 15 сентября 2017, 11:03(Комментарий был изменён) # 0
            При первом запуске вышло сообщение: «В книге обнаружено содержимое, которое не удалось прочитать. попробовать восстановить содержимое?»
            После чего появилось окошко с надписью:
            Удаленный компонент: Компонент /xl/styles.bin. (Стили)
            Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet1.bin
            Восстановленные записи: Сведения о ячейках из части /xl/worksheets/sheet2.bin

            Далее, при попытке сформировать документы (даже ничего не меняя, кроме пути на шаблоны), вылетает ошибка на буржуйском языке. Дескать, не найден прожект или библиотека. Выделена строка Microsoft Forms 2.0 Objekt Library.

            Что я делаю не так?
            1. Maxim 18 сентября 2017, 01:09(Комментарий был изменён) # 0
              А какая у вас операционная система и версия Excel?
              Данный макрос работает вполне успешно на Windows 7 и выше и в Excel 2007 и выше.
              Также возможно, либо настройки безопасности вашего экселя режут макросы либо ваш антивирус.
              1. Тимур 18 сентября 2017, 03:17 # 0
                Используется MS Office 2007. Пробовал на Win XP и Win 7. Антивирус отключал. В настройках безопасности макросы включены.
                1. Maxim 18 сентября 2017, 17:30 # 0
                  Если у вас на ПК установлен TeamViewer, могу сегодня вечером (время по МСК) к вам удаленно подключиться и посмотреть, что да как. Если что, пишите на info@excelstore.pro
                  1. Валера 27 сентября 2017, 12:05 # 0
                    Такая же ситуация подскажите как исправить
                    1. Maxim 28 сентября 2017, 16:23(Комментарий был изменён) # 0
                      У вас тоже Excel 2007 и Win 7?
            2. Данил 22 сентября 2017, 12:09 # 0
              При первом открытии, при двойном нажатии на столбец С (в котором перечислены шаблоны для обработки) вылетает exception run-time error '94': Invalid use of Null. При дебаге показывает, что ошибка в строке DesktopMonitor.ScreenHeight = Item.ScreenHeight, в функции GetDesktopMonitor().
              А при нажатии на кнопку Сформировать документ операция проходит, но папка Result пуста. В чем может быть проблема?
              1. Maxim 22 сентября 2017, 16:28(Комментарий был изменён) # 0
                1. «папка Result пуста».
                На листе const в ячейке E3 проверьте путь к вашей папке с шаблонами. Указанная папка должна существовать и в ней должны быть расположены шаблоны word с наименованиями, которые обозначены в ячейке E4.

                2. «Invalid use of Null»
                Проверил сейчас на двух компьютерах, всё работает. Почему у вас данная ошибка — не могу сказать.
                Точно, что данный функционал никак не влияет на формирование файлов. Двойной клик по ячейке в столбце C — это исключительно для удобства заполнения ячейки нужными именами шаблонов. Если не сможете решить проблему с двойным кликом, можете заполнять ячейке в этом столбце вручную (разделитель точка с запятой, как в примере). Как вариант решения — переписать блок кода, отвечающий за позиционирование окна всплывающей формы.
              2. Gu-Dron 23 октября 2017, 16:18 # 0
                Спасибо очень помогли, такой вопрос нельзя ли так же сделать, что бы можно было подставлять данные в колонитулы?
                1. Maxim 01 ноября 2017, 11:09 # 0
                  В следующем обновлении макроса учту данную доработку.
                  1. Екатерина 25 января 2019, 10:08 # 0
                    Спасибо вам огромное, очень помогли!
                    И да, очень не хватает вставки данных и в поля колонтитулов. Но, боюсь, мне мозгов не хватит самой допиливать, чтобы и туда вставлялось. Так что буду ждать обновлений.
                    Ещё раз спасибо!
                2. Артут 31 октября 2017, 20:27 # 0
                  здравстуйте, а как-нибудь можно сделать чтобы в 2003 office работал?
                  1. Maxim 01 ноября 2017, 10:59 # 0
                    Здравствуйте. Как-нибудь конечно можно. Код макроса открыт, можете попробовать доработать самостоятельно. Либо можете обратиться ко мне (email: info@excelstore.pro), обсудим вопрос платной доработки.
                    В иных случаях, мне дорабатывать под офис 2003 не актуально, т.к. версия данного офиса всё дальше уходит в прошлое и людей, использующих эту версию, всё меньше.
                  2. Иван 18 января 2018, 17:56(Комментарий был изменён) # 0
                    Добрый день. Не создает фалі, окно с текстом что файлі сформировані віскакивает, жму ок, и ничего. В чем может біть дело? Спасибо
                    1. Иван 18 января 2018, 19:01 # 0
                      Разобрался, вопрос с именем файла остался, как реализовать, чтобы название файла делалось Договор№[номер договора], именно так пробовал, так и создает, без номера, а с текстом [номер договора]?
                      1. Maxim 23 января 2018, 10:50(Комментарий был изменён) # 0
                        Добрый день.

                        За сохранение файла в коде отвечает строка:
                        iWord.SaveAs filename:=BasePath & MyArray(i, 2) & " — " & tmpArray(q) & ".docx", FileFormat:=wdFormatXMLDocument

                        Соответственно, чтобы файл сохранялся под именем «Договор №[номер договора]», нужно написать:
                        iWord.SaveAs filename:=BasePath & «Договор №» & MyArray(i, 5) & ".docx", FileFormat:=wdFormatXMLDocument

                        Это при условии, что номер договора у вас указан на листе data в столбце E
                    2. Вячеслав 02 марта 2018, 14:18 # 0
                      Добрый день.
                      Прекрасная работа спасибо, очень упрощает работу, единственный нюанс с которым я столкнулся, это данные которые указываю в екселе в разных форматах (процентный, числовой и т.д.), то они переносятся в документ не в том виде в котором в екселе, а в общий вид переводит. В итоге подставляются совсем не те данные. Так же, если уменьшаешь кол-во нолей после запятой, то при переносе эти данные так же игнорируются(.
                      Это можно как-то исправить?
                      1. Maxim 02 марта 2018, 15:52 # 0
                        Здравствуйте.
                        Только через правку кода макроса.
                        Суть правки — добавить в макрос функционал, чтобы период отправкой в Word шла проверка текущего формата ячейки Excel и в Word, соответственно, потом шла вставка не значения ячейки (как сейчас), а уже отформатированного текста.
                        Правка, в целом, не сложная. Можете поправить самостоятельно (код открыт). Либо я поправлю позже (правда, не скажу точно когда, т.к. сейчас на это времени).
                        1. Вячеслав 02 марта 2018, 16:47 # 0
                          Если подскажите, что, куда и как, то думаю справлюсь, а так я макросами не владею(
                          1. Maxim 02 марта 2018, 17:49 # 0
                            Данная подсказка равносильно тому, что я сам внесу все правки :)
                            Я не держу весь код в голове. Чтобы понять, что править, мне также надо открывать и смотреть.

                            Раз такое дело, то: либо подождать, когда я найду свободное время и внесу необходимые правки в код, либо обратиться с вопросом на форумы по excel (код макроса открыт), либо я могу сделать нужные вам доработки за плату (если очень срочно надо). По вопросам платных доработок обращайтесь на info@excelstore.pro
                        2. Alexander 26 декабря 2020, 18:10 # 0
                          support.microsoft.com/ru-ru/office/%D1%82%D0%B5%D0%BA%D1%81%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F-%D1%82%D0%B5%D0%BA%D1%81%D1%82-20d5ac4d-7b94-49fd-bb38-93d29371225c

                          У меня сработало, надо сконвертировать значение ячейки в виде текста и нужном вам формате, тогда в итоговом документе вы получите такое же отображение формата как и в ячейке
                          1. Maxim 27 декабря 2020, 00:38 # 0
                            Александр, спасибо за ссылку.
                            Ваш пример — это если настраивать формат непосредственно в экселе (что проще конечно). Если же настраивать в VBA, то функция format.
                            1. Alexander 11 января 2021, 13:12 # 0
                              я давно не практиковал VBA, так что испольовал доступный мне механизм :)
                              ПС_______
                              Не работает форма оплаты, не смог перевести 300 рублей на ваш кошелек
                              1. Maxim 05 февраля 2021, 00:37 # 0
                                Форма работает. Возможно, это из-за Яндекса. Например, ребята знакомые из Украины не могут таким образом осуществлять перевод (санкции, яндекс блокирует).
                                Ограничимся спасибом на добром слове :))
                        3. Илья 03 апреля 2018, 21:39 # 0
                          Здравствуйте. Можно ли как то сделать, чтобы файлы в папке result после создания нового файла не удалялись? Я ни черта не шарю в программировании, поэтому искренне надеюсь на Вашу помощь.
                          1. Maxim 12 апреля 2018, 12:23 # 0
                            Здравствуйте. Да, это сделать несложно. Напишите мне на почту info@excelstore.pro ваш контактный email, я скину вам поправленный вариант.
                          2. Дмитрий 18 мая 2018, 11:00 # 0
                            Добрый день.
                            Почему то не работает выдает ошибку
                            complet error
                            Cant find project or library
                            1. Maxim 30 мая 2018, 11:04 # 0
                              Добрый день.
                              Сложно что-либо комментировать, не зная условий, в которых возникла указанная ошибка.
                              1. Михаил 06 июля 2018, 02:03 # 0
                                У меня аналогичная ошибка:
                                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
                                … и там и там — одинаково.
                                1. Сергей 14 августа 2018, 11:23 # 0
                                  дебугер ругается на строчку с вычислением размера диалогового окна (странно)
                                  1. Елена 07 декабря 2018, 15:57 # 0
                                    И у меня такая ошибка. Что делать???
                                    1. Maxim 11 декабря 2018, 22:11 # 0
                                      Если ошибка связана с References, то, скорее всего, дело в отсутствующих библиотеках. Для исправление вам просто нужно зайти в References и вместо библиотеки с ошибкой выбрать Microsoft Word 14.0 Object Library или что-то похожее, исходя из вашей версии офиса.

                                      Если ошибка связана с вычислением размера диалогового окна, то сложно что-то конкретное рекомендовать. Разве что можете отключить автофокус формы. Тогда проблема точно исчезнет, но форма будет появляться не рядом с ячейкой, а по середине листа.
                            2. М 20 мая 2018, 15:04 # 0
                              Спасибище!!! Макрос что надо!
                              1. Georg 09 июня 2018, 11:49 # 0
                                Максим, добрый день.Спасибо за макрос, работает стабильно.
                                Нет ли у Вас версии этого же макроса, чтобы он работал с Excel 2010/Word 2010?
                                1. Максим, добрый день. не могу понять, где сохраняются документы. за ранее спасибо. 20 июня 2018, 09:28 # 0
                                  Максим, добрый день. не могу понять, где сохраняются документы. за ранее спасибо.
                                  1. Maxim 20 июня 2018, 20:25(Комментарий был изменён) # 0
                                    Добрый день. В папке, из которой вы открыли макрос по окончании его работы автоматически создается папка «Result». Собственно, там и сохраняются сформированные документы.
                                  2. Мария 19 июля 2018, 20:43 # 0
                                    Добрый день, спасибо за предоставленный макрос! Скажите, пожалуйста, можно ли на основе исходных данных в excel сформировать документ, в котором будет меняться не только основной текст, но и колонтитул?
                                    1. Maxim 06 августа 2018, 23:09 # 0
                                      Здравствуйте, Мария.
                                      Это возможно. Даже кто-то выше в комментариях уже просил реализовать подобное. К сожалению, всё никак не найду свободного времени реализовать данную доработку. В пору, наверное, создавать краудфандинговый проект на ту или иную доработку. Может тогда появится стимул ))
                                      1. Сергей 15 августа 2018, 10:58 # 0
                                        Максим, зачем вам блог, если вы пишете, что вам некогда им заниматься. Передрал где-то скрипт, так напишите, что не могу его доработать, бесплатно или платно за сколько. Загадили интернет спамом, ленивые студяки.
                                        1. Maxim 02 октября 2018, 10:14(Комментарий был изменён) # 0
                                          Сергей, нет абсолютно никакого желания что-либо вам доказывать.
                                          Насчет «передрал». Код макроса открыт. Приведете факты, что я скопировал код из макроса другого разработчика, тогда и поговорим.

                                          И кстати, это не блог. А просто комменты к выложенным мной макросам.
                                          1. Чел 26 ноября 2019, 11:00 # 0
                                            Ну ты и пидор конечно. Если ты такой у нас ахуенный, то почему бы тебе самому не сделать такое?
                                            Критиковать работу которую сделали бесплатно, уровень сверхразума.
                                      2. Светлана 17 августа 2018, 09:14 # 0
                                        Добрый день,
                                        скачала программу, но при запуске выдает ошибку: Compile error: Can`t find project or library. Что нужно сделать, чтобы исправить?
                                        1. Maxim 02 октября 2018, 10:02 # 0
                                          Добрый день.
                                          У вас по всей видимости не Excel 2013, а другая версия.
                                          Если так, то чтобы макрос работал, необходимо в VBA -> Referenc отключить ошибочные библиотеки и подключить аналогичные, но для вашей версии Excel.
                                        2. NeVashno 21 августа 2018, 08:37 # 0
                                          При запуске кнопки «сформировать документ» пишет ошибку -Compile error: Can`t find project or library. Исходный код содержит строки:

                                          public appword as word.application, iWord as word.document

                                          В какой библиотеке находиться описания объекта word? интерпретатор VBA не знает такого объекта. нужна dll библиотека?
                                          1. Maxim 02 октября 2018, 10:03 # 0
                                            Посмотрите на вопрос выше и мой ответ к нему. Скорее всего, аналогичная проблема и у вас.
                                          2. Sayriddin 04 сентября 2018, 17:30 # 0
                                            Всем привет можно сохранит сформирование документы на отделный папках не на result а на заданую папку
                                            1. Maxim 02 октября 2018, 10:01 # 0
                                              Да, можно. В коде VBA макроса через поиск найдите фразу «result» и скорректируйте путь папки сохранения на нужный вам.
                                            2. Айдар Ситдиков 05 сентября 2018, 15:34 # 0
                                              Спасибо!
                                              1. Серж 27 сентября 2018, 11:19 # 0
                                                Всем привет!
                                                Подскажите а вставка картинки возможна. В ячейке ссылка на изображение, а в шаблон ворд подстановка самой картинки.
                                                1. Maxim 02 октября 2018, 09:23 # 0
                                                  Добрый день.
                                                  Да, конечно, возможно. Но для этого необходимо доработать макрос, чтобы подобная обработка работала.
                                                2. Евгений 20 ноября 2018, 14:41 # 0
                                                  Добрый день

                                                  Пробовал запустить данный макрос под MacOS но что-то пошло не так, не совсем понятно какой прописывать путь к файлу, и вылетает ошибка «91» и ругается на Ворд почему то, есть ли у вас какое-то решение?
                                                  1. Maxim 11 декабря 2018, 22:28 # 0
                                                    Добрый день.
                                                    К сожалению, не подскажу. Макрос изначально создавался под Windows.
                                                  2. Максим 10 декабря 2018, 10:43 # 0
                                                    Добрый день, подскажите как добавить дополнительный шаблон вордовский или ексель?
                                                    1. Maxim 11 декабря 2018, 22:00 # 0
                                                      Добрый день.
                                                      В ячейке E3 вместо «C:\Users\Admin\Desktop\Macro\шаблоны\» укажите путь к папке, в которой лежат нужные вам шаблоны. Все вордовский файлы, что будут в данной папке, макрос воспринимает как шаблоны.
                                                      1. Максим 12 декабря 2018, 11:51 # 0
                                                        Спасибо большое)
                                                    2. Рустэм 14 декабря 2018, 06:56 # 0
                                                      Максим, привет. Напиши, пожалуйста, свою почту
                                                      1. Maxim 12 января 2019, 01:36(Комментарий был изменён) # 0
                                                        Привет, Рустэм.
                                                        Моя почта: info@excelstore.pro
                                                      2. Вячеслав 22 января 2019, 22:01 # 0
                                                        Спасибо за отличный скрипт — реальная помощь для работы. Вы сотрудничаете по разработке скриптов на заказ?
                                                        1. Maxim 22 января 2019, 22:28 # 0
                                                          Пожалуйста.
                                                          Иногда беру заказы при наличии свободного времени. Если что, обращайтесь на почту info@excelstore.pro
                                                        2. Вячеслав 22 января 2019, 22:55 # 0
                                                          Спасибо
                                                          1. Ренат 09 февраля 2019, 20:21 # 0
                                                            Спасибо. Что надо поменять в макросе, чтобы таблица с данными была столбцом, а не строкой?
                                                            1. Maxim 10 февраля 2019, 14:01 # 0
                                                              Ответил на ваше письмо в почте.
                                                            2. Ольга 23 февраля 2019, 10:40 # 0
                                                              Максим, здравствуй! Можно сделать так, чтобы каждый раз при нажатие на кнопку «Сформировать документы» файлы, сохранились на отдельную папку, т.е не удалялись файлы в папке РЕзульт? Еще есть возможности сделать так, чтобы макрос обрабатывал и шаблоны эксель?
                                                              1. Дмитрий 24 февраля 2019, 15:28 # 0
                                                                Максим, здравствуйте!
                                                                У меня тот же вопрос, макрос заменяет сформированные файлы word в папке Result (несмотря на другое название), а хотелось бы чтобы папка дополнялась новым файлом.
                                                                1. Maxim 24 февраля 2019, 21:11 # 0
                                                                  Дмитрий, добрый день.
                                                                  В коде VBA найдите (например, через поиск) строку кода: Kill iPath & "*.docx"
                                                                  и закоментируйте эту строку (добавьте апостроф впереди).

                                                                  Тогда при каждом запуске макроса файлы с разными именами не будут перезаписываться, а просто дополнять папку.
                                                                  Если имена файлов совпадут, то они перезапишутся.
                                                                  1. Дмитрий 13 марта 2019, 14:45 # 0
                                                                    Спасибо большое!
                                                                2. Maxim 24 февраля 2019, 20:56 # 0
                                                                  Ольга, добрый день.

                                                                  В коде VBA найдите (например, через поиск) код: BasePath = ThisWorkbook.Path & "\Result\"
                                                                  и замените его на: BasePath = ThisWorkbook.Path & "\" & Replace(Now, ":", "") & "\"

                                                                  Тогда при каждом запуске макроса будет формироваться новая папка.
                                                                  При замене, главное, не меняйте всю строку, а только указанный выше код (до двоеточия).
                                                                  1. Юрий 26 апреля 2022, 14:56 # 0
                                                                    Максим спасибо огромное!!! Макрос то что надо!!!

                                                                    Благодарю!!!

                                                                    Методом научного тыка для читабельности вставил другую команду из другого макроса:

                                                                    BasePath = ThisWorkbook.Path & "\" & Format(Now, «YYYY_MM_DD hh_mm») & "\": Call FolderCreateDel(BasePath)
                                                                  2. Maxim 24 февраля 2019, 21:02 # 0
                                                                    Чтобы в качестве шаблонов использовать и файлы эксель — здесь уже заменой одной строчки кода не обойтись. Если данная доработка все-таки необходима, можете написать мне на почту info@excelstore.pro, я сообщу примерную стоимость данной работы.
                                                                    1. Ольга 25 февраля 2019, 08:04 # 0
                                                                      Написала Вам на почту
                                                                  3. Денис 03 марта 2019, 08:48 # 0
                                                                    Есть ли возможность запустить сие чудо на Excel 2003?
                                                                    1. Maxim 03 марта 2019, 11:46 # 0
                                                                      В целом, конечно, возможно. Основная часть кода универсальная. Но для полной работоспособности макроса, его надо тестировать в Excel 2003. Сейчас лично у меня на это нет времени. Код макроса открыт, можете самостоятельно поправить или обратиться за помощью на фриланс или иные сайты.
                                                                    2. Roman 23 апреля 2019, 13:48 # 0
                                                                      То, что искал! Большое спасибо, автор. И комментарии дельные.
                                                                      1. Андрей 24 апреля 2019, 15:51 # 0
                                                                        Автор, огромное спасибо.
                                                                        Я бы поехал головой делать 130 одинаковых договоров, еще и «срочно», если бы не ваш скрипт. От души.
                                                                        1. Maxim 24 апреля 2019, 21:44 # 0
                                                                          Спасибо большое за отзыв!
                                                                        2. Дмитрий 30 июля 2019, 11:41 # 0
                                                                          Добрый день!
                                                                          У меня аналогичная проблемам:

                                                                          При первом открытии, при двойном нажатии на столбец С (в котором перечислены шаблоны для обработки) вылетает exception run-time error '94': Invalid use of Null. При дебаге показывает, что ошибка в строке DesktopMonitor.ScreenHeight = Item.ScreenHeight, в функции GetDesktopMonitor().
                                                                          А при нажатии на кнопку Сформировать документ операция проходит, но папка Result пуста. В чем может быть проблема?
                                                                          1. Maxim 30 июля 2019, 22:37 # 0
                                                                            Добрый день.
                                                                            Закоментируйте в макросе вызов функции GetDesktopMonitor
                                                                            1. Alex 03 января 2020, 23:10 # 0
                                                                              Всем привет! С переопределением библиотек для офиса 2010 разобрался. Но вот выходных файлов так и не могу найти, папка создается. но пустая. все упоминания о GetDesktopMonitor закоментировал. может что не правильно сделал. не подскажете, что конкретно нужно закокоментировать. Спасибо Макс! Всех с Новым годом!
                                                                              1. Alex 04 января 2020, 20:53 # 0
                                                                                поставил офис 2013. ошибка осталась. может есть какие-то мысли?
                                                                                1. Alex 04 января 2020, 21:08 # 0
                                                                                  извиняйте. все работает. баран не проверил путь к шаблонам. Макс, еще раз спасибо!
                                                                          2. Игорь 13 августа 2019, 14:19 # 0
                                                                            Максим, добрый день, полдня бьюсь с Вашим макросом, никак не могу понять, в чем причина — папка Result не создается, появляется только диалоговое окно «Список шаблонов», и всё, что я делаю не так? вызов функции GetDesktopMonitor закоментировал
                                                                            1. Игорь 13 августа 2019, 17:33 # 0
                                                                              Спасибо, огромное, разобрался, это гениальное изобретение!!!
                                                                              1. Maxim 14 августа 2019, 14:48 # 0
                                                                                Пожалуйста. Рад, что макрос полезен людям.
                                                                              2. Яна 21 августа 2019, 23:01 # 0
                                                                                Максим, спасибо Вам, просто громадное!!! Очень долго и безрезультатно искала что-то подобное. Этот макрос буквально спас от часов бестолковых действий!
                                                                                1. Maxim 23 августа 2019, 15:40 # 0
                                                                                  Пожалуйста, Яна. Одно время он меня тоже сильно выручал, когда были задачи по заполнению однотипных документов. Так что понимаю вас прекрасно :)
                                                                                2. Aleks 22 августа 2019, 12:30 # 0
                                                                                  Максим, подскажите плиз, а как добавить строки, одну и более, выше таблицы на листе data? В смысле как физически добавить я понимаю, а как при этом не нарушить код? Заранее спасибо
                                                                                  1. Maxim 23 августа 2019, 15:41 # 0
                                                                                    Алексей, в этом случае придется корректировать макрос. Корректировка небольшая, но перепривязку строк в VBA придется сделать.
                                                                                  2. Дмитриевич 02 октября 2019, 17:48 # 0
                                                                                    Добрый вечер!
                                                                                    Подскажите пожалуйста, каким образом в макросе прописать так чтобы при одинаковом шаблоне создавался не отдельный файл, а добавлялось в ворд книгу следующей страницой
                                                                                    1. Maxim 08 октября 2019, 10:30 # 0
                                                                                      Добрый день.
                                                                                      Для реализации задуманного необходимо в процедуре CreateDoc доработать блок:

                                                                                      iWord.SaveAs filename:=BasePath & MyArray(i, 2) & " — " & tmpArray(q) & ".docx", FileFormat:=wdFormatXMLDocument
                                                                                      iWord.Close False: Set iWord = Nothing
                                                                                    2. Аноним 09 октября 2019, 16:19 # 0
                                                                                      При обработке данных возникал ошибка.
                                                                                      Все прекрасно работало до 3 строки. Дальше не идет, выдает ошибку.
                                                                                      1. Maxim 09 октября 2019, 18:25 # 0
                                                                                        Зависит от настроек вашего шаблона и описания ошибки.
                                                                                        1. Аноним 10 октября 2019, 13:24 # 0
                                                                                          Заработало. Не работает при указании " таких кавычек. При таких «» все работает.
                                                                                          1. Maxim 11 октября 2019, 15:35 # 0
                                                                                            Добавил в список доработок.
                                                                                            Позже перепроверю логику работы с кавычками.
                                                                                      2. Евгений 18 октября 2019, 15:06 # 0
                                                                                        Максим, добрый день!
                                                                                        Подскажите, вы не создавали вариант с внесением данных в колонтитулы?
                                                                                        Если нет, не могли бы уточнить, какая часть кода отвечает за заполнение листов?
                                                                                        1. Татьяна 23 октября 2019, 15:49 # 0
                                                                                          ОГРОМНОЕ Вам спасибо!!! Вы даже не представляете, как Ваша табличка меня выручила.
                                                                                          1. Иван В 22 января 2020, 11:06(Комментарий был изменён) # 0
                                                                                            Не могу редактировать макрос, изменить папку для сохранения результа и прочее
                                                                                            Просит пароль
                                                                                            Вы писали что код открытый
                                                                                            1. Евгений 30 января 2020, 14:56 # 0
                                                                                              Подскажите пожалуйста, макрос может работать с файлом шаблона, сохраненном в формате WORD с поддержкой макросов?
                                                                                              1. Сергей 10 марта 2020, 22:34 # 0
                                                                                                Установлен office 2010, Windows10
                                                                                                Поменял Microsoft Word 15.0 Object Library на Microsoft Word 14.0 Object Library
                                                                                                в функции GetDesktopMonitor() Item.ScreenHeight и Item.ScreenWeight поставил численные значения, чтобы не было ошибок.
                                                                                                Файлы создаются, но все 0 размера. Что может быть?
                                                                                                1. Сергей 11 марта 2020, 21:05(Комментарий был изменён) # 0
                                                                                                  Не знаю что было, но помогла переустановка office
                                                                                                  1. Алексей 24 марта 2020, 21:01 # 0
                                                                                                    А не подскажете что нужно прописать чтобы создавались не только word но и excel шаблоны?
                                                                                                    1. Макс 01 апреля 2020, 17:50 # 0
                                                                                                      Огромное спасибо за программу! Супруге сэкономили кучу времени!
                                                                                                      1. Эмилия 17 мая 2020, 13:39 # 0
                                                                                                        Добрый день. Спасибо за макрос. Подскажите, пожалуйста, при сохранении в загрузки, все работает, а если переношу на рабочий стол, то ничего не формируется, и ошибок нет, путь к папке с шаблонами меняю. Еще пишет, что книга заблокирована лоя редактирования другим пользователем. Заранее благодарю за ответ.
                                                                                                        1. Maxim 17 мая 2020, 13:46 # 0
                                                                                                          Добрый день.
                                                                                                          Закройте все документы ворд и после через диспетчер задач убедитесь, что нет вордовских процессов. Если есть, закройте их. После этого проверьте работу макроса.
                                                                                                          Перед запуском макроса также рекомендую проверь, что в наименовании формируемых вами файлов нет символов, не допустимых в наименовании файла (т.е. название состоит из букв, цифр, пробелов или тире).
                                                                                                        2. Никитушка 20 мая 2020, 14:43 # 0
                                                                                                          Дай бог вам здоровья.
                                                                                                          1. Maxim 20 мая 2020, 20:31 # 0
                                                                                                            Спасибо!
                                                                                                            Если макрос помог, можете подписаться на мой канал YouTube: www.youtube.com/ExcelStore?sub_confirmation=1
                                                                                                            На канале публикую много обучающих видео по работе с Excel и SQL.
                                                                                                          2. Илья 07 июля 2020, 12:57 # 0
                                                                                                            Максим, добрый день!
                                                                                                            Макрос очень помогает! Работает отлично.
                                                                                                            Есть возможность сделать так, чтобы макрос проводил замену текста также в колонтитулах документа?
                                                                                                            1. Maxim 07 июля 2020, 13:46(Комментарий был изменён) # 0
                                                                                                              Добрый день, Илья.
                                                                                                              Возможность есть, но нет времени. Если оплатите данную доработку, то сделаю.
                                                                                                              Если что, можете писать мне на почту: info@excelstore.pro
                                                                                                              1. Илья 08 июля 2020, 08:20 # 0
                                                                                                                Написал на почту
                                                                                                            2. Arty 20 декабря 2020, 21:13 # 0
                                                                                                              Добрый день!
                                                                                                              Подскажите, а что нужно подправить, чтобы итоговые файлы сохранялись в формате 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//
                                                                                                              1. Maxim 21 декабря 2020, 15:47 # 0
                                                                                                                Добрый день!
                                                                                                                Попробуйте вот так. У меня, по крайней мере, данный код отработал без проблем.

                                                                                                                iWord.SaveAs filename:=BasePath & MyArray(i, 2) & " - " & tmpArray(q) & ".docx", FileFormat:=12     'wdFormatXMLDocument = 12
                                                                                                                iWord.ExportAsFixedFormat OutputFileName:=BasePath & MyArray(i, 2) & " - " & tmpArray(q) & ".pdf", ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, BitmapMissingFonts:=True, UseISO19005_1:=False
                                                                                                                iWord.Close False: Set iWord = Nothing
                                                                                                                1. Arty 23 декабря 2020, 13:30 # 0
                                                                                                                  Добрый день!
                                                                                                                  Супер, получилось. Спасибо!!)
                                                                                                                2. Maxim 21 декабря 2020, 15:48 # 0
                                                                                                                  Если Word вообще не нужен, то первую строку из приведенного мной кода можно убрать.
                                                                                                                3. Ирина Горошко 04 февраля 2021, 14:23 # 0
                                                                                                                  Спасибо огромное, очень полезный инструмент! Подскажите, а какое условие вставить перед функцией автозамены, чтобы она не заменяла значение в шаблоне, если ячейка в Экселе пустая. А то заменяет на пробел((
                                                                                                                  1. Maxim 05 февраля 2021, 00:13 # 0
                                                                                                                    Спасибо за отзыв.

                                                                                                                    В этом блоке (в модуле 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
                                                                                                                  2. Владимир 23 апреля 2021, 11:34 # 0
                                                                                                                    Здравствуйте!
                                                                                                                    А возможно сделать, что бы при формирование файлов они бы формировались в формате pdf?
                                                                                                                    1. Maxim 23 апреля 2021, 12:27 # 0
                                                                                                                      Здравствуйте.
                                                                                                                      Это не очень актуально, т.к. PDF — это по сути уже закрытый документ, велика вероятность, что ворд после формирования надо немного поправить (например, в части переносов строк на другие листы).
                                                                                                                      А так в целом да, можно сделать и сохранение в PDF. Код открыт, можете доработать самостоятельно. Доработать нужно в блоке сохранения.
                                                                                                                      Могу я доработать — пишите на почту info@excelstore.pro
                                                                                                                    2. Arsen 31 мая 2021, 22:16 # 0
                                                                                                                      День добрый. Подскажите, что за проблема может быть, если папка «Result» создается, но в ней пусто? Путь к папке с шаблонами изменен, путей с кириллицей нет. Окно «Файлы сформированы» также появляется, как будто все в порядке. Win 10 2004, Office 2013
                                                                                                                      1. Arsen 05 июня 2021, 10:16 # 0
                                                                                                                        Создав в Visual Basic точки останова видно, что не выполняется этот код:

                                                                                                                        If Len(Dir(tmpSTR)) > 0 Then
                                                                                                                                        Set iWord = AppWord.Documents.Open(tmpSTR, ReadOnly:=True)
                                                                                                                                    
                                                                                                                                        'делаем замену переменных
                                                                                                                                        For j = 4 To iColl
                                                                                                                                            Call ExportWord(MyArray(1, j), MyArray(i, j))
                                                                                                                                        Next j
                                                                                                                                        
                                                                                                                                        iWord.SaveAs filename:=BasePath & MyArray(i, 2) & " - " & tmpArray(q) & ".docx", FileFormat:=12     'wdFormatXMLDocument = 12
                                                                                                                                        iWord.Close False: Set iWord = Nothing
                                                                                                                                    End If
                                                                                                                        
                                                                                                                        Есть вероятность что для Office 2013 и Visual Basic 7.1 необходимо писать условие по-другому?
                                                                                                                        1. Denys 09 августа 2021, 22:40 # 0
                                                                                                                          Office 2019
                                                                                                                          Макрос не работает (
                                                                                                                          1. Мария 23 августа 2021, 10:49 # 0
                                                                                                                            добрый день!
                                                                                                                            в макросе почему-то вылезает ошибка 91, не найдена объектная переменная.
                                                                                                                            работаю на маке, в чем может быть причина?
                                                                                                                            1. Владимир 03 сентября 2021, 14:17(Комментарий был изменён) # 0
                                                                                                                              Макрос работает, офис2019, конечно, не так как мне надо. Идея безумно понравилась, буду дорабатывать под себя. Хочу еще вставку готовых таблиц из экселля, реализовать. Заметил проблему с тем что верхние и нижние колонтитулы исправляются только на первой страницы. Исправления на других страницах нет. В лоб проблему быстро сам не решил, сейчас в поисках решения проблемы. Найду решение напишу в комментах.
                                                                                                                              1. Владимир 03 сентября 2021, 16:33 # 0
                                                                                                                                Сейчас колонтитулы правятся только на первой странице!
                                                                                                                                Нашел решение, но скорость формирования документов резко возросла. В общем тем кому надо править все колонтитулы и верхние и нижние пробуйте: надо
                                                                                                                                'осуществляем замену текста в колонтитулах
                                                                                                                                    For i = 6 To 11
                                                                                                                                        On Error Resume Next
                                                                                                                                        With iWord.StoryRanges.Item(i).Find
                                                                                                                                            .ClearFormatting
                                                                                                                                            .Replacement.ClearFormatting
                                                                                                                                            '.Replacement.Style = ActiveDocument.Styles("Заголовок 2 Знак")  'Возвращает или устанавливает стиль объекта.
                                                                                                                                            .Text = iName
                                                                                                                                            .Replacement.Text = iVal
                                                                                                                                            .Forward = True                     'True, если задано направление поиска "Вперёд". False - в противном случае ("Назад").
                                                                                                                                            .Wrap = 1                           'Возвращает или устанавливает константу перечисления WdFindWrap. wdFindContinue = 1
                                                                                                                                            .Format = False                     'True если в операцию поиска включено форматирование, False - в противном случае.
                                                                                                                                            .MatchCase = True                   'True, если в процессе поиска следует различать регистр символов.
                                                                                                                                            .MatchWholeWord = True              'True, если в процессе поиска следует искать заданный текст как отдельное слово, а не как часть другого слова.
                                                                                                                                            .MatchAllWordForms = False          'True, если требуется найти все словоформы для заданного слова.
                                                                                                                                            .MatchSoundsLike = False            'True, если требуется найти слова похожие по звучанию на заданный текст.
                                                                                                                                            .MatchWildcards = False             'True, если в процессе поиска используются регулярные выражения.
                                                                                                                                            
                                                                                                                                            'MatchByte                          'True, если в процессе поиска следует различать символы полной и половинной ширины.
                                                                                                                                            'ParagraphFormat                    'Возвращает или устанавливает объект ParagraphFormat.
                                                                                                                                            'Found                              'True, если в результате выполнения поиска было найдено соответствие.
                                                                                                                                            'Font                               'Возвращает или устанавливает объект Font задающий форматирование шрифта.
                                                                                                                                            
                                                                                                                                            '.Execute Replace:=wdReplaceAll
                                                                                                                                            .Execute
                                                                                                                                            
                                                                                                                                            If .Found Then  'проверяем, найдена ли Закладка в документе Word
                                                                                                                                                ExportWord = True           'закладка найдена
                                                                                                                                                .Execute Replace:=2         'wdReplaceAll = 2
                                                                                                                                            Else
                                                                                                                                                ExportWord = False          'закладка НЕ найдена
                                                                                                                                            End If
                                                                                                                                       End With
                                                                                                                                       If Err.Number <> 0 Then Err.Clear
                                                                                                                                    Next i
                                                                                                                                заменить на это:
                                                                                                                                'осуществляем замену текста в нижних колонтитулах
                                                                                                                                    For i = 0 To iWord.Sections.Count
                                                                                                                                       On Error Resume Next
                                                                                                                                        For j = 0 To iWord.Sections(i).Footers.Count
                                                                                                                                            On Error Resume Next
                                                                                                                                                With iWord.Sections(i).Footers(j).Range.Find
                                                                                                                                                    .ClearFormatting
                                                                                                                                                    .Replacement.ClearFormatting
                                                                                                                                                    '.Replacement.Style = ActiveDocument.Styles("Заголовок 2 Знак")  'Возвращает или устанавливает стиль объекта.
                                                                                                                                                    .Text = iName
                                                                                                                                                   .Replacement.Text = iVal
                                                                                                                                                    .Forward = True                     'True, если задано направление поиска "Вперёд". False - в противном случае ("Назад").
                                                                                                                                                    .Wrap = 1                           'Возвращает или устанавливает константу перечисления WdFindWrap. wdFindContinue = 1
                                                                                                                                                    .Format = False                     'True если в операцию поиска включено форматирование, False - в противном случае.
                                                                                                                                                   .MatchCase = True                   'True, если в процессе поиска следует различать регистр символов.
                                                                                                                                                    .MatchWholeWord = True              'True, если в процессе поиска следует искать заданный текст как отдельное слово, а не как часть другого слова.
                                                                                                                                                    .MatchAllWordForms = False          'True, если требуется найти все словоформы для заданного слова.
                                                                                                                                                    .MatchSoundsLike = False            'True, если требуется найти слова похожие по звучанию на заданный текст.
                                                                                                                                                    .MatchWildcards = False             'True, если в процессе поиска используются регулярные выражения.
                                                                                                                                
                                                                                                                                                    'MatchByte                          'True, если в процессе поиска следует различать символы полной и половинной ширины.
                                                                                                                                                    'ParagraphFormat                    'Возвращает или устанавливает объект ParagraphFormat.
                                                                                                                                                    'Found                              'True, если в результате выполнения поиска было найдено соответствие.
                                                                                                                                                    'Font                               'Возвращает или устанавливает объект Font задающий форматирование шрифта.
                                                                                                                                                    
                                                                                                                                                    '.Execute Replace:=wdReplaceAll
                                                                                                                                                    .Execute
                                                                                                                                
                                                                                                                                                   If .Found Then  'проверяем, найдена ли Закладка в документе Word
                                                                                                                                                        ExportWord = True           'закладка найдена
                                                                                                                                                        .Execute Replace:=2         'wdReplaceAll = 2
                                                                                                                                                    Else
                                                                                                                                                        ExportWord = False          'закладка НЕ найдена
                                                                                                                                                    End If
                                                                                                                                                End With
                                                                                                                                            If Err.Number <> 0 Then Err.Clear
                                                                                                                                        Next
                                                                                                                                        If Err.Number <> 0 Then Err.Clear
                                                                                                                                    Next
                                                                                                                                
                                                                                                                                'осуществляем замену текста в верхних колонтитулах
                                                                                                                                
                                                                                                                                    For i = 0 To iWord.Sections.Count
                                                                                                                                       On Error Resume Next
                                                                                                                                        For j = 0 To iWord.Sections(i).Headers.Count
                                                                                                                                            On Error Resume Next
                                                                                                                                                With iWord.Sections(i).Headers(j).Range.Find
                                                                                                                                                    .ClearFormatting
                                                                                                                                                    .Replacement.ClearFormatting
                                                                                                                                                    '.Replacement.Style = ActiveDocument.Styles("Заголовок 2 Знак")  'Возвращает или устанавливает стиль объекта.
                                                                                                                                                    .Text = iName
                                                                                                                                                   .Replacement.Text = iVal
                                                                                                                                                    .Forward = True                     'True, если задано направление поиска "Вперёд". False - в противном случае ("Назад").
                                                                                                                                                    .Wrap = 1                           'Возвращает или устанавливает константу перечисления WdFindWrap. wdFindContinue = 1
                                                                                                                                                    .Format = False                     'True если в операцию поиска включено форматирование, False - в противном случае.
                                                                                                                                                   .MatchCase = True                   'True, если в процессе поиска следует различать регистр символов.
                                                                                                                                                    .MatchWholeWord = True              'True, если в процессе поиска следует искать заданный текст как отдельное слово, а не как часть другого слова.
                                                                                                                                                    .MatchAllWordForms = False          'True, если требуется найти все словоформы для заданного слова.
                                                                                                                                                    .MatchSoundsLike = False            'True, если требуется найти слова похожие по звучанию на заданный текст.
                                                                                                                                                    .MatchWildcards = False             'True, если в процессе поиска используются регулярные выражения.
                                                                                                                                
                                                                                                                                                    'MatchByte                          'True, если в процессе поиска следует различать символы полной и половинной ширины.
                                                                                                                                                    'ParagraphFormat                    'Возвращает или устанавливает объект ParagraphFormat.
                                                                                                                                                    'Found                              'True, если в результате выполнения поиска было найдено соответствие.
                                                                                                                                                    'Font                               'Возвращает или устанавливает объект Font задающий форматирование шрифта.
                                                                                                                                                    
                                                                                                                                                    '.Execute Replace:=wdReplaceAll
                                                                                                                                                    .Execute
                                                                                                                                
                                                                                                                                                   If .Found Then  'проверяем, найдена ли Закладка в документе Word
                                                                                                                                                        ExportWord = True           'закладка найдена
                                                                                                                                                        .Execute Replace:=2         'wdReplaceAll = 2
                                                                                                                                                    Else
                                                                                                                                                        ExportWord = False          'закладка НЕ найдена
                                                                                                                                                    End If
                                                                                                                                                End With
                                                                                                                                            If Err.Number <> 0 Then Err.Clear
                                                                                                                                        Next
                                                                                                                                        If Err.Number <> 0 Then Err.Clear
                                                                                                                                    Next
                                                                                                                                Возможно я верхний колонтитул отключу он у меня практически не используется)
                                                                                                                              2. Алексей 04 января 2023, 15:54 # 0
                                                                                                                                Добрый день. Подскажите, как модифицировать макрос, чтобы таблица с данными была столбцом, а не строкой?
                                                                                                                                1. Maxim 12 января 2023, 01:30 # 0
                                                                                                                                  Добрый день.
                                                                                                                                  В двух словах сложно объяснить. Если коротко, то изменить массив в коде. Сейчас там жестко задано, что заголовки идут по горизонтали в самом вверху. Вам же нужно сделать по вертикали.
                                                                                                                                2. Сергей 07 февраля 2023, 15:10 # 0
                                                                                                                                  Здравствуйте!
                                                                                                                                  Пользуюсь данным макросом давно, но то ли прошло какое-то обновление ПК или еще чего, но перестали вставляться значения в шаблон. Сам файл после отработки макроса сохраняется, но значения, не подставлены. Не понимаю в чем проблема. В код макроса не лазили. Win10, ms office 2021
                                                                                                                                  Сам к макросах ноль, не справлюсь.
                                                                                                                                  1. Денис 07 февраля 2023, 19:37 # 0
                                                                                                                                    Такая же проблема возникла сегодня. Перестала происходить автозамена.
                                                                                                                                    Формируется файл Word, как в шаблоне, без замены кодов на значение из таблицы.

                                                                                                                                    Ничего не правил, просто перестало заменять.

                                                                                                                                    При первом запуске в Excel файла CreateWord_v.2.xlsb сегодня вылетела ошибка, что-то про VBA макросы было, не успел прочитать. Больше ошибка не выходила, перезагружал комп, восстанавливал файл макроса из чистого архива — всё равно не работает.

                                                                                                                                    Тоже Win10 + Office 365 (лицензия).
                                                                                                                                    1. Maxim 10 февраля 2023, 23:48 # 0
                                                                                                                                      Здравствуйте.

                                                                                                                                      Проверил + ребята знакомые помогли потестировать на других версиях офиса. В общем, проблема наблюдается только в Office 365. Например, в том же Office 2013, 2016, 2019, 2021 все работает нормально.

                                                                                                                                      Файл поправил. Ссылка: disk.yandex.ru/d/VvNwUiv5HrAWnw
                                                                                                                                      Если будете использовать другой офис (не 365), то рекомендую пользоваться прежней версией (v.2), которая по прежнему находится в шапке данной статьи.
                                                                                                                                    2. Владимир 15 февраля 2023, 11:48 # 0
                                                                                                                                      Здравствуйте!
                                                                                                                                      Спасибо Вам большое за GeoYandexGoogle!
                                                                                                                                      Балуюсь с ним через API Яндекса.

                                                                                                                                      Вопрос
                                                                                                                                      Странная ошибка при работе — непонятен первый запрос, остальные приведены для примера:
                                                                                                                                      — Запрос
                                                                                                                                      Россия, Республика Саха (Якутия), Булунский район, пгт Тикси, ул. ?Больничная, 1
                                                                                                                                      Ответ
                                                                                                                                      Мали, Каес, Бе -10.960363 13.352855
                                                                                                                                      — Запрос
                                                                                                                                      Россия, Республика Саха (Якутия), Булунский район, п. Тикси, ул. Ленинская, д. 13а
                                                                                                                                      Ответ
                                                                                                                                      Россия, Республика Саха (Якутия), муниципальный район Булунский улус, посёлок городского типа Тикси, Ленинская улица, 13А 128.868861 71.637861
                                                                                                                                      — Запрос
                                                                                                                                      Россия, Республика Саха (Якутия), Булунский район, п. Тикси, ул. Больничная, 1/1
                                                                                                                                      Ответ
                                                                                                                                      Россия, Республика Саха (Якутия), муниципальный район Булунский улус, посёлок городского типа Тикси, Больничная улица, 2А 128.853545 71.638343
                                                                                                                                      1. Владимир 15 февраля 2023, 12:05 # 0
                                                                                                                                        Вопросительный знак перед Больничная — ошибочно вставился в письме. в запросе нет
                                                                                                                                        1. Maxim 01 марта 2023, 23:47 # 0
                                                                                                                                          У меня такого не было. Странно. Что править в данном случае мне в макросе не очевидно. Раз удалить его из результата в экселе не сложно, то править макрос пока не буду.
                                                                                                                                        2. Александр 15 марта 2023, 11:18 # 0
                                                                                                                                          Добрый день,

                                                                                                                                          Прежде всего спасибо за удобный макрос! Использую давно.
                                                                                                                                          Недавно столкнулся с проблемой — на рабочем ноутбуке не создаётся файл в папке results — вообще никакой! Хотя все пути прописаны верно.

                                                                                                                                          Дома всё работает — заключаю, что могут быть какие-то ограничения — где проверить? В программе макросы все включены…
                                                                                                                                          1. Александр 15 марта 2023, 11:54 # 0
                                                                                                                                            Под программой я имею ввиду настройки безопасности excel.
                                                                                                                                          2. Иван 19 марта 2023, 13:50 # 0
                                                                                                                                            Подправил код для поиска и замены в плавающих текстовых полях. Но только если эти поля не в колонтитулах.
                                                                                                                                            'осуществляем замену текста в текстовых полях
                                                                                                                                                For i = 0 To iWord.Shapes.Count
                                                                                                                                                   On Error Resume Next
                                                                                                                                            
                                                                                                                                                        On Error Resume Next
                                                                                                                                                            With iWord.Shapes(i).TextFrame.ContainingRange.Find
                                                                                                                                                                .ClearFormatting
                                                                                                                                                                .Replacement.ClearFormatting
                                                                                                                                                                '.Replacement.Style = ActiveDocument.Styles("Заголовок 2 Знак")  'Возвращает или устанавливает стиль объекта.
                                                                                                                                                                .Text = iName
                                                                                                                                                               .Replacement.Text = iVal
                                                                                                                                                                .Forward = True                     'True, если задано направление поиска "Вперёд". False - в противном случае ("Назад").
                                                                                                                                                                .Wrap = 1                           'Возвращает или устанавливает константу перечисления WdFindWrap. wdFindContinue = 1
                                                                                                                                                                .Format = False                     'True если в операцию поиска включено форматирование, False - в противном случае.
                                                                                                                                                               .MatchCase = True                   'True, если в процессе поиска следует различать регистр символов.
                                                                                                                                                                .MatchWholeWord = True              'True, если в процессе поиска следует искать заданный текст как отдельное слово, а не как часть другого слова.
                                                                                                                                                                .MatchAllWordForms = False          'True, если требуется найти все словоформы для заданного слова.
                                                                                                                                                                .MatchSoundsLike = False            'True, если требуется найти слова похожие по звучанию на заданный текст.
                                                                                                                                                                .MatchWildcards = False             'True, если в процессе поиска используются регулярные выражения.
                                                                                                                                            
                                                                                                                                                                'MatchByte                          'True, если в процессе поиска следует различать символы полной и половинной ширины.
                                                                                                                                                                'ParagraphFormat                    'Возвращает или устанавливает объект ParagraphFormat.
                                                                                                                                                                'Found                              'True, если в результате выполнения поиска было найдено соответствие.
                                                                                                                                                                'Font                               'Возвращает или устанавливает объект Font задающий форматирование шрифта.
                                                                                                                                                                
                                                                                                                                                                '.Execute Replace:=wdReplaceAll
                                                                                                                                                                .Execute
                                                                                                                                            
                                                                                                                                                               If .Found Then  'проверяем, найдена ли Закладка в документе Word
                                                                                                                                                                    ExportWord = True           'закладка найдена
                                                                                                                                                                    .Execute Replace:=2         'wdReplaceAll = 2
                                                                                                                                                                Else
                                                                                                                                                                    ExportWord = False          'закладка НЕ найдена
                                                                                                                                                                End If
                                                                                                                                                            End With
                                                                                                                                            
                                                                                                                                                    If Err.Number <> 0 Then Err.Clear
                                                                                                                                                Next
                                                                                                                                            1. Павел 17 ноября 2023, 12:51 # 0
                                                                                                                                              А, если в колонтитулах, то какой код должен быть?
                                                                                                                                            2. Андрей 17 июля 2023, 16:06 # 0
                                                                                                                                              Добрый день, Максим!
                                                                                                                                              Макрос отличный! Обязательно поделюсь ссылкой на Ваш сайт.
                                                                                                                                              Подскажите, у макроса есть какая-то лицензия? Можем мы его использовать в организации для работы?
                                                                                                                                              1. stalkerexe 19 сентября 2023, 20:56 # 0
                                                                                                                                                не работает AppWord As Word.Application
                                                                                                                                                1. Сергей 16 марта 2024, 15:23 # 0
                                                                                                                                                  Добрый день!
                                                                                                                                                  Макрос отличный, но можно ли как то сделать, чтобы таблица с данными была не в строке, а в столбике? (Транспорировать), не совсем удобно вводить данные в таком виде (В столбце было бы удобнее)
                                                                                                                                                  1. Сергей 16 марта 2024, 16:47 # 0
                                                                                                                                                    Придумал временный костыль:
                                                                                                                                                    1. создал новый лист
                                                                                                                                                    2. Скопировал-транспорировал на нем таблицу с листа «Data»
                                                                                                                                                    3. На листе «Data» приравнял соотвествующие ячейки (столбцы) к ячейкам (Строкам) на созданном листе
                                                                                                                                                    Проверил, работает, вводить данные удобнее, но хотелось бы без лишней возни=)
                                                                                                                                                    1. Сергей 17 марта 2024, 14:05 # 0
                                                                                                                                                      А вот и решение задачи:

                                                                                                                                                      'перебираем массив
                                                                                                                                                      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