ExcelVBA一键生成Word对账函
Excel信息生成Word文档,是很多朋友经常遇到的场景,一条两条信息还好,但是如果有几百上千条信息,手动的去把excel内部的数据挪到Word里面,就很麻烦而且不现实了。这个时候,用VBA来支持,就能极大的提高效率。
今天就来讲一个典型的案例,本案例涉及知识点较多,例如:修改Word的页眉页脚内容(包含页码)、修改Word中的表格、新建文件夹等等,非常的经典。
可以说,把这个案例搞清楚了,Excel与Word数据交互的需求基本都不在话下了。

需求描述
我有这样两个文件:
Excel数据源

Word模板

我的具体需求:
取数据源表中的供应商,填至供应商名称栏位(尊敬的:后面);
思路:找到关键字之后,光标挪动写入内容
取数据源表中的供应商的往来业务数据,插入至格式中的“1. 本公司与贵公司的往来账项”下的表格;表格后的内容自动下移。
思路:根据每个供应商的数据条数来新增不同行数。
保存文件时以供应商名称保存为文件名称,每个供应商独立一个文件
思路:保存文件的时候,文件名注意一下
帮我加上页脚的页数“第几页,共几页
思路:修改页眉页脚内容

具体代码和效果
具体代码如下:
Public info() '定义动态数组,存储每个供应商的具体信息Public 供应商Public docPublic wdPublic PathGPublic iPublic docnamePublic 贷方合计Public 借方合计Sub 拆分excel至word()Call 创建文件夹= 0= 0Set doc = CreateObject("word.application") '创建Word对象arr = Sheet2.UsedRange '把数据2中的数据赋值给数组arr,这里也可以写成arr=worksheets("数据2")Set d = CreateObject("scripting.dictionary") '创建字典,为了去重获取供应商名称For i = 2 To UBound(arr)13)) = "" '去重写入字典Next= d.keys '这里供应商就是所有供应商的数组'显示进度条On Error GoTo 1For i = 0 To UBound(供应商)'-------------------------------Set wd = doc.Documents.Open(ThisWorkbook.Path & "\模板.docx") '打开模板= TrueFor j = 1 To UBound(arr)If arr(j, 13) = 供应商(i) Thendocname = arr(j, 12) '供应商编码,作为文档保存时候的命名k = k + 1ReDim Preserve info(1 To 6, 1 To k)k) = arr(j, 1) '制单日期k) = arr(j, 9) '科目名称k) = arr(j, 3) '摘要k) = arr(j, 4) '借方k) = arr(j, 5) '贷方k) = arr(j, 6) '会计期间= Val(info(4, k)) + 借方合计= Val(info(5, k)) + 贷方合计End IfNext jCall 写入word= 0= 0k = 0Next i1: doc.Quit '关闭Word程序窗口MsgBox "完成!"End SubSub 写入word() 'endkey方法'//写入供应商= TrueWith doc.Selection.Find.ClearFormatting= True= Falset = .Execute(FindText:="尊敬的") '查找尊敬的三个字的位置End Withunit:=5供应商(i) & ":"'//写入往来账项'--调整表格--Set tbl = wd.Tables(1)'选中需要填入数据的表格'不选中,后面无法插入行,InsertRowsBelow是selection的方法If UBound(info, 2) > 1 Then doc.Selection.InsertRowsBelow UBound(info, 2) - 1 '根据总数据条数插入行,如果只有一条数据,不插入行UBound(info, 2) '根据总数据条数插入行,如果只有一条数据,不插入行= "网格型"'--写入数据--For r = 1 To UBound(info, 2)+ 1, 1).Range = info(1, r)+ 1, 2).Range = info(2, r)+ 1, 3).Range = info(3, r)+ 1, 4).Range = info(4, r)+ 1, 5).Range = info(5, r)+ 1, 6).Range = info(6, r)Next+ 1, 4).Range = 借方合计+ 1, 5).Range = 贷方合计+ 1, 6).Range = 借方合计 - 贷方合计Call 添加页眉页脚Filename:=PathG & "\" & docname & ".docx" '----保存到C盘0End SubSub 创建文件夹()'FSO方式PathG = ThisWorkbook.Path & "\往来对账函"Set fso = CreateObject("Scripting.FileSystemObject")If fso.FolderExists(PathG) = True Then'//删除文件夹MkDir PathGElseMkDir PathG '//创建文件夹End IfEnd SubSub 添加页眉页脚()'//添加页眉With wd.Sections(1).Headers(1)Set Rng = .Range= 供应商(i).Range.Fields.Update= 2End With'删除页眉横线With wd.Styles("页眉").ParagraphFormat= 0End With'//添加页脚With wd.Sections(1).Footers(1)Set Rng = .Range= "第 "0Rng, 33, "Page"Set Rng = .Range0= " 页 共 "0Rng, 26, "Pages"Set Rng = .Range0= " 页 " & 供应商(i) '页脚要求,第几页共几页+供应商名称.Range.Fields.Update= 2End WithEnd Sub
效果如下:

几百条数据,一杯咖啡的时间就搞定了。
现在Python大炒办公自动化,其实上述效果这不就是办公自动化吗?VBA内置于Office才是最优选择。

参考文章

课程附件
👍🏽Excel VBA/Word VBA/VSTO








评论
