You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Excel VBA调用Word模板生成指定行的货运发票?

可行,这是批量生成格式化发票的标准解决方案

一、先制作带书签的Word模板

  1. 打开Word,按发票需求设计固定格式(比如开票条款、表头、落款等)。
  2. 在需要填充动态数据的位置插入书签:选中占位位置(比如输入「[运单编号]」再选中),点击「插入」→「书签」,输入唯一命名(如bm_WaybillNo、bm_Date、bm_Amount),命名别用空格或特殊字符。
  3. 保存为Word模板格式(.dotx),建议放在Excel文件同目录下,方便路径调用。

二、Excel VBA核心实现代码

以下是通用生成发票的子过程,支持传入行号参数,读取对应行数据填充到Word模板:

Sub GenerateInvoice(targetRow As Integer)
    Dim wordApp As Object
    Dim doc As Object
    Dim templatePath As String
    Dim savePath As String
    Dim waybillNo As String
    Dim invoiceDate As String
    Dim amount As String
    Dim weight As String
    
    ' 读取当前行货运数据(根据你的列位置调整,示例为A运单、B日期、C金额、D重量)
    waybillNo = ThisWorkbook.Sheets("货运数据").Cells(targetRow, "A").Value
    invoiceDate = ThisWorkbook.Sheets("货运数据").Cells(targetRow, "B").Value
    amount = ThisWorkbook.Sheets("货运数据").Cells(targetRow, "C").Value
    weight = ThisWorkbook.Sheets("货运数据").Cells(targetRow, "D").Value
    
    ' 模板路径(同Excel文件目录)
    templatePath = ThisWorkbook.Path & "\InvoiceTemplate.dotx"
    ' 发票保存路径(按运单编号命名)
    savePath = ThisWorkbook.Path & "\发票_" & waybillNo & ".docx"
    
    ' 启动Word应用
    Set wordApp = CreateObject("Word.Application")
    wordApp.Visible = True ' 调试时可见,发布后可设为False后台生成
    
    ' 基于模板创建新文档
    Set doc = wordApp.Documents.Add(Template:=templatePath, NewTemplate:=False)
    
    ' 填充书签内容
    On Error Resume Next ' 忽略不存在的书签错误
    doc.Bookmarks("bm_WaybillNo").Range.Text = waybillNo
    doc.Bookmarks("bm_Date").Range.Text = invoiceDate
    doc.Bookmarks("bm_Amount").Range.Text = amount
    doc.Bookmarks("bm_Weight").Range.Text = weight
    On Error GoTo 0
    
    ' 保存并关闭文档
    doc.SaveAs2 Filename:=savePath, FileFormat:=16 ' 16对应docx格式
    doc.Close
    
    ' 释放Word对象,避免后台残留进程
    Set doc = Nothing
    wordApp.Quit
    Set wordApp = Nothing
    
    MsgBox "发票已生成:" & savePath
End Sub

三、给每行添加触发方式

方案1:表单控件按钮

  1. 点击「开发工具」→「插入」→「表单控件(按钮)」,在某行末尾绘制按钮。
  2. 弹出宏选择框时,新建对应行的宏:
Sub GenerateInvoiceForRow5()
    GenerateInvoice 5 ' 传入目标行号
End Sub
  1. 复制按钮到每行末尾,修改每个按钮绑定的宏,替换对应行号即可。

方案2:超链接触发(更简洁)

  1. 在每行最后一列(如E列)输入「生成发票」,选中单元格后点击「插入」→「超链接」。
  2. 选择「本文档中的位置」,随便选一个单元格(如A1),确认插入超链接。
  3. 添加工作表FollowHyperlink事件,自动识别点击行:
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    If Target.TextToDisplay = "生成发票" Then
        GenerateInvoice Target.Range.Row ' 获取点击单元格所在行
    End If
End Sub

此方案无需复制多个宏,一行代码处理所有行的触发。

注意事项

  • 确保Word模板的书签名称与VBA代码完全一致,否则无法填充数据。
  • 若用早期绑定,需在VBA编辑器「工具」→「引用」中勾选「Microsoft Word xx.x Object Library」;后期绑定(代码中用CreateObject)兼容性更好,无需引用。
  • 金额、日期等数据可在VBA中格式化后填充,比如Format(amount, "¥#,##0.00")。

内容的提问来源于stack exchange,提问作者AndiB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:22:38