Excel VBA 实战(9) - 与Word联动自动化生成报告

一年一度的年报审计即将开幕。作为审计程序中必不可少的一环,针对应收以及应付账款的函证程序是每年审计的保留项目。动辄上百份的询证函以及相应审计工作底稿记录多少 企业财务/事务所小朋友们的血泪往事;抑或是收入相关的审计调整之后,更新所有附注披露数据时,被一百多页财报所支配的恐惧让多少财务人从噩梦中惊醒。

财务自动化提供了完美的解决方案。

定义模板与字段,从统一数据源自动更新数据是MVC设计模式给我们的启示。以询证函为例,其中的可变字段无非 客户或供应商地址,被审计单位名称,函证截止日期,函证日期,余额以及往来金额,即 手动复制粘贴的内容。

先通过Word 域 来设定模板,定义可变字段 (View, 视图层) 并通过 Excel VBA调用 Word 给模板中的字段赋值来达成动态更新 (Controller 控制层)。基于Excel的数据处理以及存储的优势,工作表提供了最简便直接的数据源(Model, 模型层)。通过Office各组件之间的联动,并且通过统一的VBA的API进行功能上的整合,从而实现财务自动化的无限可能。这种模式,根据实际需求, 也可轻易拓展至Outlook Access 以及PPT。


说完宏观思路,我们就来着手进行代码层面的实现。由于此解决方案着眼于一类处理模式,因此代码的可扩展性是我们的核心考量之一。


第一步,采用 Word 域 定义模板。

关于域的详细介绍请看官方文档。

域 本身就是一个极其强大的功能,在此不作展开。展示之用,我们只涉及到 DOCVARIABLE 这个域 。


示例中使用的DOCVARIABLE 域定义如下,对于变量名称为 addressee 的域

DOCVARIABLE addressee \* MERGEFORMAT

以普通文本形式输入DOCVARIABLE 域之后,选中该定义并按下 Ctrl + F9, 会自动将文本转换成相应的域。

演示之用,定义如下字段

addressee 被函证对象,street 街道以及门牌,city城市以及邮编,auditee 被审计单位,year 审计年度


变量名称自定,通过变量名称,将视图以及数据源进行映射。


第二步,添加数据源

此例中只是给出数据源的一种形式,

第一行为模板中的字段名称,第一列为所需要生成的最终文件名称。


实际当中字段可能上百个,并且也可能单独存放在SQL文件或是数据库中。但都可以通过VBA转化成这种基本样式。


第三步,基于数据源自动生成所需文件

Sub main()
    Dim wd As Object
    Set wd = CreateObject("Word.Application")
    Dim d As New Dicts
    d.load valCol:=d.rng(2, d.x)
    d.label = Range(Cells(1, 2), Cells(1, d.x))
    Dim k
    Dim tplPath As String
    tplPath = "tpl.docx"
    For Each k In d.keys
        Call processWdTpl(wd.documents.Open(ThisWorkbook.Path & "\" & tplPath, 0, True), k, d, ThisWorkbook.Path & "\" & k)
    Next k
End Sub
Private Sub processWdTpl(ByRef doc As Object, ByVal e, ByRef data As Dicts, ByVal saveAsFile As String)
    Dim k
    For Each k In data.label.keys
        doc.Variables.add Name:=k, Value:=data.dict(e)(data.label.dict(k))
    Next k
    doc.SaveAs2 saveAsFile