ARTICLE · 1298173
用 VBA 把 Excel 数据灌进 Word:一份模板,一键产出几十份合同与通知
每月要给上百名客户发对账函、给几十个部门出通知、给一堆项目出验收报告——内容结构几乎一样,只是客户名、金额、日期不同。在 Word 里一份份手工改?太慢。用邮件合并?字段一多、版式一复杂就束手束脚。今天给你一套VBA 批量生成方案:一个模板 + 一段代码,几分钟把几十甚至上百份文档全部生成,还能顺手导出 PDF。
一、先想清楚:模板 + 占位符,比邮件合并更灵活
Word 自带的邮件合并(Mail Merge)适合"一行数据对应一张纸"的纯列表场景:邀请函、工资条、准考证。但它对版式控制弱,一旦要"条件段落""嵌套表格""按客户显示不同条款",数据源和域代码就会把人绕晕。
更通用的做法是用 VBA + 占位符模板:
在 Word 模板里把会变动的内容写成占位符,例如 `{{客户名}}`、`{{金额}}`、`{{日期}}`; 用一段 Excel 端的 VBA,循环读取每一行数据,把占位符替换成真实内容,再另存为一份新文档。
这种方案字段数量不限、版式完全可控——今天要批量生成什么,改模板即可,代码一行都不用动。
二、核心代码:从 Excel 读数据,循环生成 Word
下面是一段完全可运行的 Excel VBA。假设 Excel 里 A 列客户名、B 列金额、C 列日期,Word 模板 `D:\模板\对账函.docx` 中放了对应的 `{{客户名}}`、`{{金额}}`、`{{日期}}` 占位符。
Sub 批量生成对账函() Dim wdApp As Object, wdDoc As Object Dim ws As Worksheet, i As Long, lastRow As Long Dim 模板路径 As String, 输出文件夹 As String, 文件名 As String Set ws = ThisWorkbook.Sheets("数据") lastRow = ws.Cells(ws.Rows.Count, 1).End(-4162).Row 'xlUp = -4162 模板路径 = "D:\模板\对账函.docx" 输出文件夹 = "D:\输出\" ' 后期绑定启动 Word(无需引用 Word 对象库,换机器也能跑) Set wdApp = CreateObject("Word.Application") wdApp.Visible = False For i = 2 To lastRow Set wdDoc = wdApp.Documents.Open(模板路径) With wdDoc.Content.Find .ClearFormatting .Text = "{{客户名}}" .Replacement.Text = ws.Cells(i, 1).Value .Execute Replace:=2 'wdReplaceAll = 2,全部替换 .Text = "{{金额}}" .Replacement.Text = ws.Cells(i, 2).Value .Execute Replace:=2 .Text = "{{日期}}" .Replacement.Text = ws.Cells(i, 3).Value .Execute Replace:=2 End With 文件名 = 输出文件夹 & ws.Cells(i, 1).Value & "_对账函.docx" ' 16 = wdFormatDocumentDefault(.docx);17 = wdFormatPDF 可直接出 PDF wdDoc.SaveAs2 文件名, 16 wdDoc.Close SaveChanges:=0 'wdDoNotSaveChanges = 0 Next i wdApp.Quit Set wdDoc = Nothing Set wdApp = Nothing MsgBox "已生成 " & lastRow - 1 & " 份文档。" End Sub要点:
`CreateObject("Word.Application")` 是后期绑定,换台没装 VBA 引用库的机器也能跑; `Content.Find.Execute ... Replace:=2` 就是全部替换,对应常量 `wdReplaceAll = 2`; `SaveAs2 文件名, 16` 另存为 docx,`17` 则直接导出 PDF,无需再装虚拟打印机。
三、三个必须知道的"坑"
1. 后期绑定下不要写带 wd 前缀的常量。 `wdReplaceAll`、`wdFormatPDF` 这些常量来自 Word 类型库,后期绑定拿不到,直接写数字最稳:`wdReplaceAll = 2`、`wdFormatPDF = 17`、`wdFormatDocumentDefault = 16`、`wdDoNotSaveChanges = 0`。下面是常用格式枚举,存好备查:
2. 占位符要防"短名覆盖长名"。 若模板同时有 `{{客户名}}` 和 `{{客户名称}}`,先替换长的,再替换短的,否则短占位符可能把长占位符拆坏。更稳妥的做法是用统一包裹符(如 `{{ }}`),替换后做一次"残留占位符检查",漏掉的及时报警。
3. 一定要释放 Word 进程。 循环里每份文档 `wdDoc.Close`,最后 `wdApp.Quit` 并 `Set wdApp = Nothing`。否则后台会堆一堆 `WINWORD.EXE`,越跑越卡,甚至锁住文件让下次打不开。
四、进阶:用 VBA 做合同比对(审阅修订)
做合同、标书时,经常要把"修订版"和"原版"比出差异。Word 的 `Application.CompareDocuments` 能一键生成带修订痕迹的新文档,比人工逐段翻找靠谱得多:
Sub 比对两份合同() Dim wdApp As Object, docOrg As Object, docRev As Object, docDiff As Object Set wdApp = CreateObject("Word.Application") wdApp.Visible = True Set docOrg = wdApp.Documents.Open("D:\合同\原版.docx", ReadOnly:=True) Set docRev = wdApp.Documents.Open("D:\合同\修订版.docx", ReadOnly:=True) ' Destination:=2 即 wdCompareDestinationNew,结果存为新文档,不动原文件 Set docDiff = wdApp.CompareDocuments(OriginalDocument:=docOrg, _ RevisedDocument:=docRev, _ Destination:=2) docDiff.SaveAs2 "D:\合同\差异_对比结果.docx", 16 docDiff.Close docOrg.Close: docRev.Close wdApp.Quit End Sub`CompareDocuments` 默认就会比对格式、大小写、表格、页眉页脚、批注等,`Destination:=2`(`wdCompareDestinationNew`)保证差异落在新建文档里,原文件安然无恙。
五、AI 角度:Copilot 写初稿,VBA 做量产
很多人问:有了 Microsoft 365 Copilot in Word,还要 VBA 吗?我的答案是——分工。
Copilot in Word 很擅长"从零起草、改写润色、摘要长文、统一语气",还能从 Excel、PowerPoint 等 Microsoft 365 应用拉取数据生成表格和图表(官方称为 Data merging)。2025 年 10 月微软还公布了 Word 中的 Agent Mode:用对话方式直接创建文档,Copilot 会自动套用 Word 原生样式排版,11 月起逐步推送。这些都是手写 VBA 很难替代的"创意型"能力。
但有一个 Copilot 替代不了的场景:同一套模板、产出 N 份确定一致的文件。Copilot 每次生成结果都不同,而 VBA 是"数据驱动、结果可复现"的量产工具。所以最佳组合是——Copilot 先把模板文案写漂亮,VBA 负责把真实数据批量灌进去。
如果你的环境没有本机 Office,也可以走跨平台路线:用 Python 的 `openpyxl` 读 Excel、`python-docx` 写 Word,思路和上面的占位符替换完全一致,还能在服务器上无人值守跑。下面是一段示意代码:
from docx import Document import openpyxl wb = openpyxl.load_workbook("数据.xlsx") ws = wb["数据"] for row in ws.iter_rows(min_row=2, values_only=True): 新文档 = Document("模板.docx") # 占位符同样用 {{客户名}} 等 for p in 新文档.paragraphs: if "{{客户名}}" in p.text: for r in p.runs: r.text = r.text.replace("{{客户名}}", str(row[0])) 新文档.save(f"输出/{row[0]}_对账函.docx")一句话:Copilot 负责"写得好看",VBA 负责"做得又快又准"。
---
金句:真正的高手,不是比别人更会加班,而是让电脑替自己把重复的事一遍遍做对。
互动话题:你平时用 Word 最烦的重复性工作是什么?批量生成、格式统一、还是合同比对?评论区聊聊,下期可以专门写你需要的那一种。















































































