如何结合Mail Merge根据单元格值打印含对应产品描述的Word文档?
解决Mail Merge中根据产品值匹配专属描述并打印对应文档的问题
刚好之前帮朋友处理过类似的发货单需求,给你几个实用的方案,根据你的产品数量多少选就行:
方法一:用Word内置IF域直接匹配(适合产品少的情况)
如果你的产品种类不多(比如3-5种),直接用Word的IF域就能搞定,不用额外操作Excel:
- 打开你的Mail Merge主模板(就是用来生成发货单的Word文件)
- 把光标放到需要显示产品描述的位置
- 点击「插入」→「文档部件」→「域」,在弹出的窗口里找到IF域
- 填写域代码的时候,按照这个格式来(注意替换成你的实际列名和描述):
这里的{ IF { MERGEFIELD 产品名称 } = "产品A" "产品A专属描述:XX材质,发货需注意防潮" { IF { MERGEFIELD 产品名称 } = "产品B" "产品B专属描述:易碎品,需贴易碎标签" "默认描述(如果有未匹配的产品)" } }产品名称必须和你Excel里的列标题完全一致,包括大小写和空格;如果产品更多,可以继续嵌套IF语句 - 设置完后,预览Mail Merge确认每个订单的描述都对应正确,然后批量打印就行
方法二:Excel新增描述列,直接合并(适合产品多的情况)
如果产品种类多,写一堆IF太麻烦,不如直接在Excel里把描述匹配好,再合并到Word:
- 打开你的客户订单Excel,新增一列,命名为产品专属描述
- 用Excel的
XLOOKUP或者VLOOKUP函数,根据「产品名称」自动匹配描述。比如你可以在同一个Excel里新建一个「产品对照表」工作表,A列放产品名,B列放对应描述,然后在订单表的「产品专属描述」列写公式:
(B2是当前行的产品名称单元格,根据你的实际列位置调整)=XLOOKUP(B2, 产品对照表!A:A, 产品对照表!B:B, "暂无描述") - 刷新所有公式,确保每一行订单都有对应的描述
- 回到Word的Mail Merge模板,插入新的合并域「产品专属描述」到对应位置,直接合并就能自动带出每个产品的专属内容,之后批量打印即可
方法三:用VBA宏实现按产品调用不同模板打印(适合需要不同模板的场景)
如果不同产品需要用完全不同的Word模板(比如产品A的发货单有特殊格式,产品B的不一样),可以用VBA宏自动处理:
- 打开Word,按
Alt + F11打开VBA编辑器 - 插入一个新模块,粘贴下面的代码(记得修改里面的文件路径、工作表名、列位置,匹配你的实际情况):
Sub MergeAndPrintByProduct() Dim objExcel As Object Dim objWorkbook As Object Dim strExcelPath As String Dim iRow As Integer Dim strProduct As String Dim strTemplatePath As String ' 替换成你的客户Excel文件路径 strExcelPath = "C:\Users\XXX\Documents\客户订单.xlsx" ' 连接Excel并打开文件 Set objExcel = CreateObject("Excel.Application") Set objWorkbook = objExcel.Workbooks.Open(strExcelPath) ' 从第2行开始遍历(假设第1行是表头) iRow = 2 Do While objWorkbook.Sheets("订单表").Cells(iRow, 1).Value <> "" ' 获取当前行的产品名称(假设产品名称在第2列,即B列) strProduct = objWorkbook.Sheets("订单表").Cells(iRow, 2).Value ' 根据产品名称匹配对应的模板路径 Select Case strProduct Case "产品A" strTemplatePath = "C:\Users\XXX\Documents\产品A发货模板.docx" Case "产品B" strTemplatePath = "C:\Users\XXX\Documents\产品B发货模板.docx" Case Else strTemplatePath = "C:\Users\XXX\Documents\默认发货模板.docx" End Select ' 打开模板并执行邮件合并打印 Documents.Open strTemplatePath With ActiveDocument.MailMerge .MainDocumentType = wdFormLetters .OpenDataSource Name:=strExcelPath, SQLStatement:="SELECT * FROM `订单表$` WHERE `产品名称` = '" & strProduct & "' AND `客户ID` = '" & objWorkbook.Sheets("订单表").Cells(iRow, 1).Value & "'" .Destination = wdSendToPrinter .Execute End With ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges iRow = iRow + 1 Loop ' 清理资源 objWorkbook.Close objExcel.Quit Set objWorkbook = Nothing Set objExcel = Nothing End Sub - 修改完代码后,运行宏,它会自动遍历每个订单,根据产品调用对应模板,合并客户信息后直接打印
内容的提问来源于stack exchange,提问作者Al Nikolaj




