在很多工作中,经常需要写一些类似的报告,使用同一个模板,只是里面的数据不同,人工操作工程量大且容易出错,如果能用程序直接实现可以省去不少麻烦。
本文使用ExcelVBA实现,主要思路是使用word邮件合并功能,将word文字报告与Excel数据链接,不太了解邮件合并功能的戳:http://xinzhi.wenda.so.com/a/1517858371619706
1,创建一个word文档作为模板,存为doc格式。

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

以sheet1为源数据表

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

插入合并域

4,打开Excel的vb编辑器,插入模块,在模块中输入以下代码:
1 Sub merge()
2 Dim sh1 As Worksheet
3 Set sh1 = Worksheets("Sheet1")
4 Dim sh2 As Worksheet
5 Set sh2 = Worksheets("Sheet2")
6 ‘将sheet1的数据转换到sheet2中
7 sh2.Range("A2") = sh1.Range("B1") '姓名
8 sh2.Range("B2") = sh1.Range("B2") '年龄
9 ThisWorkbook.Save’保存
10 Call outPut’调用邮件合并程序
11 End Sub
12
13
14
15 Private Sub outPut() ’邮件合并程序
16 On Error GoTo errorhandle:
17 Dim Wordapp As Word.Application
18 Dim WordD As Word.Document
19 Dim Modelpath As String
20 Set Wordapp = New Word.Application
21 Modelpath = ThisWorkbook.Path & "\模板.doc" ’模板地址
22 ThisWorkbookPath = ThisWorkbook.Path & "\数据.xlsm" ’数据文件地址,与模板文件在同一路径下
23
24 Set WordD = Wordapp.Documents.Open(Modelpath) '打开模板
25 Wordapp.Visible = True '设置为可见
26
27 '链接数据
28 WordD.MailMerge.OpenDataSource Name:= _
29 ThisWorkbookPath _
30 , ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
31 AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
32 WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
33 Format:=wdOpenFormatAuto, Connection:= _
34 "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" _
35 , SQLStatement:="SELECT * FROM `Sheet2$`", SQLStatement1:="", SubType:= _
36 wdMergeSubTypeAccess
37 '生成文档
38 With WordD.MailMerge
39 .Destination = wdSendToNewDocument
40 .SuppressBlankLines = True
41 With .DataSource
42 .FirstRecord = wdDefaultFirstRecord
43 .LastRecord = wdDefaultLastRecord
44 End With
45 .Execute Pause:=False
46 End With
47
48 WordD.Close '关闭文档
49 Set WordD = Nothing
50 Set Wordapp = Nothing
51 Exit Sub
52 errorhandle:
53 MsgBox ("程序出现运行错误!")
54 End Sub
5,点工具-引用,引用office等工程文件

6,运行宏程序merge

-----------------------------------------------------------批量操作------------------------------------------------------------------------------
当有多个word需要用到同一个数据表时,可以在模块中使用以下代码实现批量输入,程序自动保存至excel同目录下输出文件夹中:
1 Sub merge()
2 Dim sh1 As Worksheet
3 Set sh1 = Worksheets("Sheet1")
4 Dim sh2 As Worksheet
5 Set sh2 = Worksheets("Sheet2")
6 Dim Modelpath As String
7 Dim ThisWorkbookPath As String
8 Dim SaveFilePath, SaveFileName As String
9
10 ‘将sheet1的数据转换到sheet2中
11 sh2.Range("A2") = sh1.Range("B1") '姓名
12 sh2.Range("B2") = sh1.Range("B2") '年龄
13 ThisWorkbook.Save’保存
14
15 ThisWorkbookPath = ThisWorkbook.Path & "\数据.xlsm"
16 SaveFilePath= ThisWorkbook.Path & "\输出文件夹\ "
17 Set FSO = CreateObject("Scripting.FileSystemObject")
18 If FSO.FolderExists(SaveFilePath) = False Then
19 MkDir SaveFilePath '//创建文件夹
20 End If
21 for i=1 to 3 ‘模板个数
22 Modelpath = ThisWorkbook.Path & "\模板文件夹\模板" & i & “.doc”
23 SaveFileName =”输出” & i
24 Call outPut(Modelpath, ThisWorkbookPath, SaveFilePath, SaveFileName)
25 next i
26 End Sub
27
28
29 Private Sub outPut(ByVal Modelpath As String, ByVal ThisWorkbookPath As String, ByVal SaveFilePath As String, ByVal SaveFileName As String)
30 On Error GoTo errorhandle:
31 Dim Wordapp As Word.Application
32 Dim WordD As Word.Document
33 Set Wordapp = New Word.Application
34
35 Set WordD = Wordapp.Documents.Open(Modelpath)
36 Wordapp.Visible = Visible
37
38 WordD.MailMerge.OpenDataSource Name:= _
39 ThisWorkbookPath _
40 , ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
41 AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
42 WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
43 Format:=wdOpenFormatAuto, Connection:= _
44 "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" _
45 , SQLStatement:="SELECT * FROM `Sheet2$`", SQLStatement1:="", SubType:= _
46 wdMergeSubTypeAccess
47 '生成文档
48 With WordD.MailMerge
49 .Destination = wdSendToNewDocument
50 .SuppressBlankLines = True
51 With .DataSource
52 .FirstRecord = wdDefaultFirstRecord
53 .LastRecord = wdDefaultLastRecord
54 End With
55 .Execute Pause:=False
56 End With
57
58 WordD.Close '关闭文档
59 a = Wordapp.ActiveDocument.Name
60
61 ' Wordapp.Windows("套用信函 1[兼容模式]").Activate
62 Wordapp.ChangeFileOpenDirectory SaveFilePath
63 Wordapp.ActiveDocument.SaveAs Filename:=SaveFileName, _
64 FileFormat:=wdFormatXMLDocument, LockComments:=False, Password:="", _
65 AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
66 EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
67 :=False, SaveAsAOCELetter:=False '保存
68 Wordapp.ActiveDocument.Close
69
70 Set WordD = Nothing
71 Wordapp.Quit
72 Exit Sub
73 errorhandle:
74 MsgBox ("程序出现运行错误!")
75 End Sub
如果文件名没有规律,可以逐个调用outPut方法,输出结果:

本文outPut方法可以结合更多操作方式来实现批量撰写报告~