ExcelVBA实现一键生成word文字报告及批量操作[原创]
在很多工作中,经常需要写一些类似的报告,使用同一个模板,只是里面的数据不同,人工操作工程量大且容易出错,如果能用程序直接实现可以省去不少麻烦。
本文使用ExcelVBA实现,主要思路是使用word邮件合并功能,将word文字报告与Excel数据链接,不太了解邮件合并功能的戳:http://xinzhi.wenda.so.com/a/1517858371619706
本文内容适用于 快速填写word表格,快速填写一套word表格,根据excel表及一个模板文件快速生成文字报告,根据同一个excel表多个模板文件快速生成多个不同的文字报告。
本文使用office2007,最后一次使用office2016。
1,创建一个word文档作为模板,存为doc格式,命名为 模板。

2,创建一个Excel存放数据,将数据的名称输入至sheet2第一行,保存为xlsm格式,命名为 数据

以sheet1为源数据表(sheet1是之后输入数据的地方,只是为了纵向方便输入)

3,打开word采用邮件合并功能将刚刚创建的word模板与Excel数据文件链接,选择sheet2

插入合并域

4,打开Excel的vb编辑器(在设置中打开开发工具),插入模块,在模块中输入以下代码:
Sub merge()
Dim sh1 As Worksheet
Set sh1 = Worksheets("Sheet1")
Dim sh2 As Worksheet
Set sh2 = Worksheets("Sheet2")
'将sheet1的数据转换到sheet2中
'-----------------单元格对应-------------------------
sh2.Range("A2") = sh1.Range("B1") '姓名
sh2.Range("B2") = sh1.Range("B2") '年龄
'---------------------------------------------------
ThisWorkbook.Save '保存
Call outPut '调用邮件合并程序
End Sub Private Sub outPut() '邮件合并程序
On Error GoTo errorhandle:
Dim Wordapp As Word.Application
Dim WordD As Word.Document
Dim Modelpath As String
Set Wordapp = New Word.Application
Modelpath = ThisWorkbook.Path & "\模板.doc" '模板地址
ThisWorkbookPath = ThisWorkbook.Path & "\数据.xlsm" '数据文件地址,与模板文件在同一路径下 Set WordD = Wordapp.Documents.Open(Modelpath) '打开模板
Wordapp.Visible = True '设置为可见 '链接数据
WordD.MailMerge.OpenDataSource Name:= _
ThisWorkbookPath _
, ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=ThisWorkbookPath;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engin" _
, SQLStatement:="SELECT * FROM `Sheet2$`", SQLStatement1:="", SubType:= _
wdMergeSubTypeAccess
'生成文档
With WordD.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With WordD.Close '关闭文档
Set WordD = Nothing
Set Wordapp = Nothing
Exit Sub
errorhandle:
MsgBox ("程序出现运行错误!")
End Sub
5,点工具-引用,引用office等工程文件,因为是在excel中操作word,请务必引用Microsoft word

6,运行宏程序merge

做到这里,你会发现,完全可以用自己的字段去代替示例中的姓名、年龄,甚至可以用同样的方法加入更多的字段,不过一定要注意excel中的字段跟word中对应,在代码中的单元格对应部分也需要sheet1的内容跟sheet2中对应(虚线部分),当第一次执行成功之后,以后只需要修改sheet1中的内容,然后执行,就可以生成一篇文字报告了。
-----------------------------------------------------------批量操作------------------------------------------------------------------------------
当有多个word需要用到同一个数据表时,可以在模块中使用以下代码实现批量输入,程序自动保存至excel同目录下输出文件夹中(继续上面的例子,新建一个文件夹,命名为模板文件夹,分别复制刚才的模板.doc文件分别命名为模板1.doc、模板2.doc、模板3.doc,然后在数据.xlsm中执行宏程序,会发现程序会根据模板1、模板2、模板3使用数据.xlsm中的字段生成了新的对应的word文件):
Sub merge()
Dim sh1 As Worksheet
Set sh1 = Worksheets("Sheet1")
Dim sh2 As Worksheet
Set sh2 = Worksheets("Sheet2")
Dim Modelpath As String
Dim ThisWorkbookPath As String
Dim SaveFilePath, SaveFileName As String '将sheet1的数据转换到sheet2中
'-----------------单元格对应-------------------------
sh2.Range("A2") = sh1.Range("B1") '姓名
sh2.Range("B2") = sh1.Range("B2") '年龄
'----------------------------------------------------
ThisWorkbook.Save '保存 ThisWorkbookPath = ThisWorkbook.Path & "\数据.xlsm"
SaveFilePath = ThisWorkbook.Path & "\输出文件夹\ "
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FolderExists(SaveFilePath) = False Then
MkDir SaveFilePath '//创建文件夹
End If
'-----------------遍历模板-------------------------
For i = 1 To 3 '模板个数,如果模板比较多的话,这里需要修改
Modelpath = ThisWorkbook.Path & "\模板文件夹\模板" & i & ".doc" '注意文件命名规律
SaveFileName = "输出" & i '输出的文件名
Call outPut(Modelpath, ThisWorkbookPath, SaveFilePath, SaveFileName) '调用outPut方法
Next i
'--------------------------------------------------
End Sub 'Modelpath 模板路径
'ThisWorkbookPath 执行excel函数的路径
'SaveFilePath 文件保存路径
'SaveFileName 保存的文件名 Private Sub outPut(ByVal Modelpath As String, ByVal ThisWorkbookPath As String, ByVal SaveFilePath As String, ByVal SaveFileName As String)
On Error GoTo errorhandle:
Dim Wordapp As Word.Application
Dim WordD As Word.Document
Set Wordapp = New Word.Application Set WordD = Wordapp.Documents.Open(Modelpath)
Wordapp.Visible = Visible WordD.MailMerge.OpenDataSource Name:= _
ThisWorkbookPath _
, ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=ThisWorkbookPath;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engin" _
, SQLStatement:="SELECT * FROM `Sheet2$`", SQLStatement1:="", SubType:= _
wdMergeSubTypeAccess
'生成文档
With WordD.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With WordD.Close '关闭文档
a = Wordapp.ActiveDocument.Name ' Wordapp.Windows("套用信函 1[兼容模式]").Activate
Wordapp.ChangeFileOpenDirectory SaveFilePath
Wordapp.ActiveDocument.SaveAs Filename:=SaveFileName, _
FileFormat:=wdFormatXMLDocument, LockComments:=False, Password:="", _
AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
:=False, SaveAsAOCELetter:=False '保存
Wordapp.ActiveDocument.Close Set WordD = Nothing
Wordapp.Quit
Exit Sub
errorhandle:
MsgBox ("程序出现运行错误!")
End Sub
输出结果:

如果文件名没有规律,可以逐个调用outPut方法,本文outPut方法可以结合更多操作方式来实现批量撰写报告~
-----------------------------------------------------------
转载请注明出处:https://www.cnblogs.com/implementer/
ExcelVBA实现一键生成word文字报告及批量操作[原创]的更多相关文章
- 一键生成APP官网
只需要输入苹果下载地址,安卓市场下载地址,或者内测下载地址,就能一键生成APP的官网,方便在网上推广. 好推APP官网 www.hotapp.cn/app
- Aspose.Words简单生成word文档
Aspose.Words简单生成word文档 Aspose.Words.Document doc = new Aspose.Words.Document(); Aspose.Words.Documen ...
- php 生成word的三种方式
原文地址 http://www.jb51.net/article/97253.htm 最近工作遇到关于生成word的问题 现在总结一下生成word的三种方法. btw:好像只要是标题带PHP的貌似点击 ...
- Ant搭建 一键生成APP技术 平台
1.博客概要 本文详细介绍了当今流行的一键生成APP技术.介绍了这种设计思想的来源,介绍了国内外的研究背景,并介绍了这个技术体系中的一些实现细节,欢迎各路大神们多提意见.一键生成技术,说的通俗点就是, ...
- 代码批量生成WORD的遇到的问题及解决
好久没搞工具了,最近因为处理大规模公文处理单文档,自己写了个批量处理WORD的程序:在调试过程中,主要遇到两个问题 第一个是WORD的模板 数据很多,但是WORD模板只需要一个,将数据替换WORD里标 ...
- ASP.NET生成WORD文档,服务器部署注意事项
网上转的,留查备用,我服务器装的office2007所以修改的是Microsoft Office word97 - 2003 文档这一个. ASP.NET生成WORD文档服务器部署注意事项 1.Asp ...
- [转载]Matlab生成Word报告
最近在进行一批来料的检验测试,一个个手动填写报告存图片太慢了,就有了种想要使用Matlab在分析完后数据可以自动生成PDF报告的想法,于是就去网上搜索了相关的资料,发现Matlab中文论坛上有xiez ...
- POI生成WORD文档
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- 使用sencha cmd 一键生成你的应用程序代码
一键生成你的应用程序代码: ------------------------------------------------------------ 我们的出发点就是使用命令来产生一个应用程序,执行以 ...
随机推荐
- Python Socket实现简单web服务器
#!/usr/bin/python env # coding:utf-8 import socket ip_port = ('127.0.0.1', 80) back_log = 10 buffer_ ...
- 启用优酷html5播放器的办法
方法就是在浏览器中设置下sessionStorage window.sessionStorage.setItem("P_l_h5", true);
- JVM参数简述
java虚拟机启动时会带有很多的启动参数,Java命令本身就是一个多参数的启动命令.那么具体JVM启动包含哪些参数呢?这篇文章针对java8的情况做一篇汇总解读,包含大多数常见和不常见的命令参数,过于 ...
- 使用 Azure CLI 管理 Azure 虚拟网络和 Linux 虚拟机
Azure 虚拟机使用 Azure 网络进行内部和外部网络通信. 本教程将指导读者部署两个虚拟机,并为这些 VM 配置 Azure 网络. 本教程中的示例假设 VM 将要托管包含数据库后端的 Web ...
- Vue2学习笔记:过渡效果css
过渡效果 Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加 entering/leaving 过渡 <!DOCTYPE html> <html ...
- iOS7中UIView的animateKeyframesWithDuration方法讲解
iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那 ...
- django中的字段类型
from http://www.cnblogs.com/lhj588/archive/2012/05/24/2516040.html Django 通过 models 实现数据库的创建.修改.删除等操 ...
- 【matlab】 幂法 求解最大特征值
一. 算法: 1.输入矩阵A,初始向量x误差限ep,最大迭代次数N 2.置 k = 1, m1 = 0; 3.求Xr-> norm(x) abs(Xr)=max[Xi] 1<=i< ...
- 1星|《社群X平台》:没有实际工作经验的职业写手拼凑而成
社群X平台 赋能企业指数级增长 网站上介绍作者有一些身份.书中没提作者的职位,只介绍是“码字为生”.书的封底有一些名人言论的引用,咋一看以为都是推荐本书,细看只有最后李善友在推荐本书,其他人的话都是跟 ...
- ZT 安卓手机的安全性 prepare for Q
如何增强安卓手机的安全性?安卓的安全性太低了!!! 众所周知,安卓手机是非常容易破解的,刷过机的人都知道,不管你之前在手机怎么设置密码,只要进入recovery清空使用记录,手机就会恢复出厂设置,到时 ...