01 工作表

Office协同问题—将表格内容批量写入Word文档

一个关于Office协同的问题

Question1:

  一个excel中有多个客户信息(例如姓名、身份证、购买物品数量),需要将每个客户的信息填到3份不同word文档中,如果有很多个客户,怎么样才能快速批量地为每位客户输出对应的3份word文档?

Answer1:

  能明白你表述的大致意思,有些细节还是需要确认?

  是一个客户的姓名、身份证、购买物品数量,输出一份Word文档;还是这三个字段需要对应写入到三个Word文档,姓名.docx、身份证.docx、购买物品数量.docx,还有三个字段只是写入到Word里就可以了?,还是有固定的填充位置?

Question2:

  1、每份word文档都需要填入客户姓名、身份证、购买物品数量,需要输出3份不同的文档(购销合同、发货订单、财务报账单,需要填充的客户信息是一样的,但每份文档的整体内容跟用途不一样,所以是输出3份);

  2、客户信息的3个字段要填充到文档固定位置(已加横线区分位置)。

Answer2:
  • 1、“2、客户信息的三个字段填充到文档的固定位置”,那么Word文档是需要有固化格式的,“姓名、身份证、购买数量”分别需要填入到哪个位置?。可以用三个“Word文档空出对应位置”作为范本,需要写入信息时,在范本中操作。
  • 2、批量的对每个客户操作,这个用循环即可。
  • 3、代码段和在本地直接运行想要得到的结果还是会有小的距离,在此基础上可自己略微调整,让它适合自己的工作需求。
最终VBA实现过程:
  • 1、新建三个Word文档模版,名称分别为:“购销合同”、“发货订单”和“财务报账单”,模版文档中有需要写入的位置;
  • 2、文档的保存路径是当前Excel工作簿文件所在的路径;
  • 3、创建Word对象,在对客户名单的循环中,嵌套3个调用Word模版文档的循环,因为它们的写入方法是一样的;
  • 4、查找判断“姓名、身份证、购买数量”三个字段的位置,在Word文档中的写入并填充;
  • 5、另存Word文档,路径是当前路径、名称是序号+姓名+Word文档名;
  • 6、不保存关闭作为范本的Word文档,以供下次循环使用,直到循环结束。

运行视频:

源码下载:

示例代码
复制成功!
1

Sub 客户信息批量写入模版文档()

    '自定义数据类型
    Dim File_Path As String, Save_Path As String
    File_Path = ThisWorkbook.Path '获取当前文件所在的路径
    Save_Path = File_Path & "\"   '文件的保存路径,即当前文件夹

    '获取员工数据
    Dim ws As Worksheet
    Dim Row_count As Long, i As Long
    Set ws = ThisWorkbook.Sheets("客户资料")                   '把数据原表赋给ws
    Row_count = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '三个word文档模版的数组
    Dim word_array As Variant
    Dim j As Integer
    word_array = Array("购销合同", "发货订单", "财务报账单")

    Dim wdap As Object, wddoc As Object, wdtab As Object
    Dim r As Long, c As Long
    Dim Rng_text As String

    ' 禁用屏幕更新和警告
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set wdap = CreateObject("Word.Application")              ' 创建 Word 应用
    wdap.Visible = False                                     ' 后台运行
    For i = 2 To Row_count             '循环处理每一条客户信息
        For j = 0 To UBound(word_array)  '循环写入每一个word文档
            Set wddoc = wdap.documents.Open(Save_Path & word_array(j) & ".docx")    '打开word模版
            Set wdtab = wddoc.tables(1)                              '获取Word表格,word表格里只有1个表格

            '在表格中查找字段并填充数据
            For r = 1 To wdtab.Rows.Count         '遍历word文档中的所有单元格行
                For c = 1 To wdtab.Columns.Count  '遍历word文档中的所有单元格列
                    Rng_text = Trim(wdtab.cell(r, c).Range.Text) '获取单元格文本

                    If InStr(1, Rng_text, "客户姓名") > 0 Then          'Word里的当内容没有Excel里规范,会有回车\空格\换行等字符,这里用是否包含部分字段来判断
                        wdtab.cell(r, c + 1).Range.Text = ws.Cells(i, 2) '在下一个单元格写入对应的客户信息
                    End If
                    If InStr(1, Rng_text, "身份证号") > 0 Then
                        wdtab.cell(r, c + 1).Range.Text = ws.Cells(i, 3)
                    End If
                    If InStr(1, Rng_text, "购买数量") > 0 Then
                        wdtab.cell(r, c + 1).Range.Text = ws.Cells(i, 4)
                    End If
                Next c
            Next r

            wddoc.SaveAs Save_Path & ws.Cells(i, 1) & "、" & ws.Cells(i, 2).Value & "_" & word_array(j) & ".docx" '保存文档,命名为 “序号 + 姓名 + 文档名”
            wddoc.Close SaveChanges:=False       '关闭文档,不保存模块
        Next j
    Next i

    ' 恢复屏幕更新和警告
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

    MsgBox "完成文档写入"  '过程结束!

End Sub

请开发者喝杯咖啡 请开发者喝杯咖啡!