Короткий ответ: Если нужно получить десятки отдельных договоров, актов или писем, источник удобно хранить в Excel, шаблон — в Word, а формирование и сохранение файлов автоматизировать.
Что получится
Для каждой строки Excel создаётся отдельный .docx, например Акт_15_Альфа.docx. Значения подставляются в закладки шаблона.

Исходные данные
| Номер | Дата | Контрагент | Сумма |
|---|---|---|---|
| 15 | 08.08.2026 | ООО «Альфа» | 125000 |
| 16 | 09.08.2026 | ООО «Бета» | 98000 |
| 17 | 10.08.2026 | ООО «Гамма» | 154000 |
Word-шаблон содержит закладки DocNumber, DocDate, Company, Amount.

Способ 1
Если достаточно получить все документы в одном Word-файле, используйте Слияние. Если нужны отдельные файлы — управляющий Excel-файл и шаблон Word.
Способ 2
Минимальный VBA из Excel:
Option Explicit
Sub CreateWordDocuments()
Dim wdApp As Object, wdDoc As Object
Dim ws As Worksheet
Dim lastRow As Long, r As Long
Dim templatePath As String, outputPath As String, fileName As String
Application.ScreenUpdating = False
On Error GoTo ErrHandler
Set ws = ThisWorkbook.Worksheets("Данные")
templatePath = ThisWorkbook.Path & "\template.docx"
outputPath = ThisWorkbook.Path & "\Готовые\"
If Dir(outputPath, vbDirectory) = "" Then MkDir outputPath
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = False
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For r = 2 To lastRow
Set wdDoc = wdApp.Documents.Open(templatePath, ReadOnly:=True)
SetBookmarkText wdDoc, "DocNumber", ws.Cells(r, "A").Text
SetBookmarkText wdDoc, "DocDate", ws.Cells(r, "B").Text
SetBookmarkText wdDoc, "Company", ws.Cells(r, "C").Text
SetBookmarkText wdDoc, "Amount", Format(ws.Cells(r, "D").Value, "#,##0.00")
fileName = "Акт_" & CleanFileName(ws.Cells(r, "A").Text & "_" & ws.Cells(r, "C").Text) & ".docx"
wdDoc.SaveAs2 outputPath & fileName
wdDoc.Close False
Next r
CleanExit:
If Not wdApp Is Nothing Then wdApp.Quit
Set wdDoc = Nothing
Set wdApp = Nothing
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
MsgBox "Ошибка: " & Err.Description, vbExclamation
Resume CleanExit
End Sub
Private Sub SetBookmarkText(ByVal doc As Object, ByVal bookmarkName As String, ByVal value As String)
Dim rng As Object
If doc.Bookmarks.Exists(bookmarkName) Then
Set rng = doc.Bookmarks(bookmarkName).Range
rng.Text = value
doc.Bookmarks.Add bookmarkName, rng
End If
End Sub
Private Function CleanFileName(ByVal s As String) As String
Dim badChars As Variant, ch As Variant
badChars = Array("\", "/", ":", "*", "?", Chr(34), "<", ">", "|")
For Each ch In badChars
s = Replace(s, ch, "_")
Next ch
CleanFileName = Trim$(s)
End Function
Автоматизация
В рабочей системе обычно добавляют выбор шаблона, проверку обязательных полей, журнал, экспорт PDF, обработку ошибок по каждой строке и защиту от повторного создания.

Типичные ошибки
- Нет нужной закладки в Word.
- В имени контрагента запрещённые символы.
- Excel перемещён отдельно от шаблона.
- Не проверяются пустые обязательные поля.
- Один сбой останавливает пачку без журнала.
Скачать пример
ZIP: generator.xlsm, template.docx, папка Готовые и README.
Когда лучше автоматизировать
Это типичная задача автоматизации, когда документов много, шаблонов несколько, нужны PDF, именование, проверки и раскладка по папкам.
Если у вас такая же задача, но таблица отличается, файлов много или процесс приходится повторять регулярно — можно автоматизировать под ваш файл.
Похожие материалы
- Как автоматически заполнить Word данными из Excel
- Как собрать данные из нескольких Excel-файлов в один
- Как объединить все листы Excel в одну таблицу
- Как объединить две таблицы Excel в одну по совпадающему значению