📎 配套资产 / Companion assets:本篇所有示例的可下载文件在仓库
配套资产/B07_邮件合并/——示例数据源 + Word 通知模板结构 + VBA 批量导出 PDF 宏,每个子目录都带中文 README 与 English README。 English: downloadable files for every example in this article live in配套资产/B07_邮件合并/— sample data source + Word notice template + a VBA macro for batch PDF export, each with a bilingual README.
【文字】用 AI + 邮件合并批量生成通知
摘要:用 Word 邮件合并 + VBA,把一封模板信批量变成几百封带名字的 PDF。
一、痛点引入
每学期发录取通知书、每月发工资条、开会前发会议邀请——这些活儿有个共同点:信的内容 90% 都一样,只有名字、金额、时间这种"填空"不一样。
你要是手动来:打开模板 → 改名字 → 另存为 PDF → 再改下一个……几百封下来,手都点麻了,还容易改错行、漏发人。
这事儿其实有个老办法能自动化:Word 的邮件合并(mail merge)。再配上一段 VBA 宏,把生成好的几百封信一键导成各自独立的 PDF。本文就带你把这条流水线跑通。
二、目标产出
读完并照做,你能得到:
- 一份 Excel 名单(数据源),列着头:姓名、专业、奖学金等级、个性化祝贺语;
- 一封 Word 模板信(主文档),里面用"合并域"占位;
- 点一下宏,输出几百个独立 PDF:通知_1.pdf、通知_2.pdf……(与下文宏代码的输出文件名一致) 每封名字和信息都对得上。
前置条件:电脑上有 Word 和 Excel(2016 及以上版本都行,本文按 Word 365 / 2019 界面写);你会基本的复制粘贴;愿意点开一次"开发者工具"(后面教你怎么开)。
三、案例实战
咱们的思路分三步:先用 AI 把"每封不一样的那句话"批量写出来;再在 Word 里做邮件合并,把模板和名单配对;最后用一段 VBA 宏把结果批量存成 PDF。
第一步:用 AI 写个性化正文,整理成 Excel 名单
邮件合并的"数据源"就是一张 Excel 表,第一行的每列就是能填进信里的"空"。咱们先把这张表准备好。
第一步(列固定信息): 在 Excel 新建一张表,第一行写表头,下面填数据:
| 姓名 | 专业 | 奖学金等级 |
|---|---|---|
| 张三 | 计算机 | 一等 |
| 李四 | 金融 | 二等 |
第二步(让 AI 补"个性化祝贺语"列): 把上表发给你常用的 AI 助手,用这段提示词(prompt):
我有一份录取名单,Excel 里有三列:姓名、专业、奖学金等级。请为每位同学写一句 25 字左右的个性化祝贺语,必须带出姓名和专业,语气真诚热烈。请严格按名单顺序输出,每行一条,不要编号,方便我直接复制粘贴进 Excel 新列。
AI 会吐出一串带名字的句子,例如:
张三同学,恭喜你被计算机专业录取,未来可期!
李四同学,金融专业向你发来邀请,愿你前程似锦!第三步(贴回 Excel): 在表里加一列"祝贺语",把 AI 给的文字一行行粘进去。
关键点:AI 生成的行数必须和名单行数一一对应,顺序不能乱,否则信里会"张冠李戴"。这一步是人工操作最容易踩坑的地方,粘完请肉眼核对一遍。
第二步:在 Word 里做邮件合并
邮件合并(mail merge)=把一封模板信和一张名单配对,自动生成 N 封内容不同的信。 下面一步步来,每步都照着点。
第一步(写模板): 打开 Word,写一封"通用"的通知书,把会变的内容先空着。比如:
亲爱的 «姓名» 同学: 恭喜你被 «专业» 专业录取,奖学金等级 «奖学金等级»。 «祝贺语» —— 招生办
第二步(连数据源): 点顶部菜单的 邮件 → 开始邮件合并 → 信函;再点 选择收件人 → 使用现有列表,挑中你刚才那张 Excel,选对工作表(一般是 Sheet1)。
第三步(插域): 把光标放到要填空的位置,点 邮件 → 插入合并域,选对应列名(姓名 / 专业 / 奖学金等级 / 祝贺语)。插好后,占位会变成 «姓名» 这种带书名号的样子——这就是"合并域",相当于信里的"填空框"。
第四步(预览): 点 预览结果,用左右箭头翻看,确认每封名字都对得上。
第五步(生成大文档): 点 完成并合并 → 编辑单个文档,选"全部",确定。Word 会生成一份新文档,里面几百封信首尾相连。
关键点:到这一步先别急着手动存 PDF。"编辑单个文档"只是为了让我们后面的宏有"一整块可切"的材料。
第三步:用 VBA 宏批量导出成独立 PDF
宏(macro)=一串你录下来/写好的操作步骤,点一下就能自动重跑。 咱们这段宏干的事很简单:把上一步那张大文档,按"每封信"切开,一封存一个 PDF。
第一步(开宏编辑器): 在 Word 里按 Alt + F11 打开 VBA 编辑器;在左侧"工程资源管理器"里,右键你的文档 → 插入 → 模块。如果看不到"开发者工具"菜单,先在 文件 → 选项 → 自定义功能区 里把"开发者工具"勾上。注意:要让宏永久保存,文档须先 另存为 .docm(启用宏的 Word 文档),普通 .docx 不存宏,关掉重开宏就没了。
第二步(贴代码并改路径): 把下面这段代码整段粘进模块窗口。VBA=Visual Basic for Applications,是 Word/Excel 自带的一套"写程序"的语言,专门用来干重复活。
vbaSub 批量导出PDF_按分节()
'功能:把"邮件合并→编辑单个文档"生成的大文档,
' 按分节符切成独立文件,逐封导出为 PDF。
'前提:邮件合并文档类型须为"信函"——信函类型会在每条记录之间
' 插入分节符,所以"一条记录 = 一个 Section"的假设可靠。
'用法:先完成邮件合并并"编辑单个文档",再运行本宏。
Dim doc As Document, newDoc As Document
Dim sec As Section
Dim i As Long
Dim outPath As String
Dim fso As Object
'★ 改成你自己的导出文件夹;不用提前手动建,宏会自动建(容错)
outPath = "C:\导出PDF\"
'★ outPath 容错:文件夹不存在就自动建(需父目录存在,如 C:\ 已存在)
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(outPath) Then fso.CreateFolder outPath
Set doc = ActiveDocument
i = 0
Application.ScreenUpdating = False
'★ 节数自检:先确认"一条记录 = 一个 Section"的假设成立再遍历,
' 避免静默只导 1 个 PDF。整篇只有 1 节,多半是没选"信函"类型
' 或还没点"编辑单个文档";单条记录时本就 1 节,属正常。
If doc.Sections.Count < 2 Then
MsgBox "检测到本文档只有 1 个节。" & vbCr & _
"请确认:『开始邮件合并』选的是『信函』类型,并已『完成并合并 → 编辑单个文档』。" & vbCr & _
"(若你本就只有 1 条记录,1 节是正常的,可继续。)", vbExclamation
End If
For Each sec In doc.Sections
i = i + 1
sec.Range.Copy '复制这一"节"(一封信)
Set newDoc = Documents.Add '开个空白新文档
newDoc.Range.Paste '粘进新文档(指定目标,不依赖光标位置,比 Selection.Paste 更稳)
'导出为 PDF,文件名带序号
newDoc.ExportAsFixedFormat _
OutputFileName:=outPath & "通知_" & i & ".pdf", _
ExportFormat:=wdExportFormatPDF
newDoc.Close SaveChanges:=False
Next sec
Application.ScreenUpdating = True
MsgBox "搞定!共导出 " & i & " 个 PDF 到 " & outPath, vbInformation
End Sub关键点(先确认再跑):上面这段宏按分节符切分(
doc.Sections一封对应一节)。是否生成分节符,取决于"开始邮件合并"时选的文档类型,而不是 Word 版本——选「信函」类型时,Word 会在每条记录之间插入分节符,所以"一条记录=一个 Section"的假设是可靠的。宏开头已加"节数自检":一旦整篇只有 1 个节,会弹窗提醒你检查是否选了信函类型、并确实点了"完成并合并 → 编辑单个文档",不会静默只导 1 个 PDF。("按页拆分"的兜底思路在此场景下并不适用,故不再沿用。)
第三步(运行): 把光标放在代码里,按 F5 运行。等弹出"搞定"提示框,去 C:\导出PDF\ 看,就是一堆 通知_1.pdf、通知_2.pdf…… 了。
关键点:
outPath填一个你有权限写的路径即可(如C:\导出PDF\),宏会**自动建文件夹**,不用手动提前建。想按人名命名文件?把& i换成读取姓名域的逻辑即可(进阶部分会讲)。
四、原理小结
一句话讲清底层:邮件合并的本质是"模板 + 数据"两样东西配对——模板负责不变的框架,数据(Excel 名单)负责每封不一样的填空,Word 帮你把两两组合刷出来;而 VBA 宏的本质是把"复制这一节、另存为 PDF、关掉、下一节"这种机械重复,写成一个循环,让电脑替你点几百次鼠标。AI 在这条链里只干一件事:替你批量写出那句"千人千面"的话,省掉你最费脑子的部分。
五、避坑指南
- 合并域显示成
«域»而不是真实名字? 那是正常的"代码视图"。点 邮件 → 预览结果 就能看到真人名;打印或导出 PDF 时也会是真实内容,不用担心。 - 宏一运行就报"路径找不到"? 宏已会自动建文件夹,若仍报错,多半是
outPath写错、磁盘不存在,或没有写入权限(如写入系统盘被拦截)。换个你有权限的路径即可。 - Excel 名单读不到 / 域是空的? 检查三点:表头那一行不能有合并单元格;不要留空行当标题;列名里别有奇怪符号。最稳的是第一行就是纯表头、下面紧跟数据。
- 祝贺语里的换行丢了? 在 Excel 单元格里想换行,要用
Alt + Enter输"单元格内换行",别直接敲回车(那会跳到下一行、变成新记录)。合并后段落会保留。 - 宏点不开 / 一打开文档就警告? Word 默认禁宏。把文档 另存为
.docm(启用宏的 Word 文档),更稳的做法是把文件放进"受信任位置"(文件 → 选项 → 信任中心 → 信任中心设置 → 受信任位置,添加你存放宏文档的文件夹),只对这个文件夹放行宏,不用全局"启用所有宏"。
六、进阶延展
- 想让名单自己"长出来"? 数据源常常要从系统导出的乱糟糟表格里清洗,这部分看 B2《用 AI 一键清洗脏数据》:用 Power Query 把原始表洗成干净的邮件合并数据源,不用手工复制粘贴。
- 想按条件发不同版本的信? 比如奖学金一等发长篇、二等发短篇,这属于带判断的批量,进阶到 L4 的"VBA 条件合并":在宏里读取
奖学金等级域,决定套用哪段正文再导出。 - 想文件名直接用人名? 把宏里的
& i改成从每节第一个合并域取值,下篇 L4 实战会给你改好的代码。