有以下工作薄:

vba怎么批量修改excel(用Excel数据批量生成并修改用模板创建的Word文档)(1)

对每一个学生生成一个以姓名为文档名的Word文档(格式如下图所示,红色字体的数据来自Excel工作档):

vba怎么批量修改excel(用Excel数据批量生成并修改用模板创建的Word文档)(2)

1 新建如下《通知书模板.dot》

vba怎么批量修改excel(用Excel数据批量生成并修改用模板创建的Word文档)(3)

2 插入书签

在上述Word文档将光标定位在“同学的家长”文字前面,在“插入”选项卡的“链接”组中,单击“书签”按钮。在“书签”对话框的“书签名”中输入“father”,单击“添加”按钮,在光标处添加一个书签,VBA 程序可查找书签。用同样的方法,插入其它书签:

在“放假”文字前插入一个书签“date1”

在“开学”文字前插入书签“date2”

在“正式行课”文字前插入书签“date4”

在“成绩如下:”文字的下一行插入书签“results”

在“教师寄语:”文字的下一行插入书签“memo”

在文档的最后一行(最后一个回车符处)插入书签“date3”

3 code demo

Dim date1 As Date, date2 As Date, date3 As Date, date4 As Date Sub 生成通知书() Dim i As Integer, j As Integer Dim shTemp As Worksheet '保存临时表的引用 Dim shResult As Worksheet '保存成绩表的引用 With Sheets("成绩表") i = .[A65536].End(xlUp).Row date4 = .Cells(i, 2) '行课日期 date2 = .Cells(i - 1, 2) '报名日期 date1 = .Cells(i - 2, 2) '放假日期 date3 = Format(Date, "yyyy年mm月dd日") '填写日期 End With On Error GoTo err1 '判断是否有"Temp"工作表 Set shTemp = Worksheets("Temp") label1: Set shResult = Worksheets("成绩表") '获取成绩表 '取得成绩表数据的行数 j = shResult.Range("A2").CurrentRegion.Rows.Count shResult.Range("A2:L2").Copy '复制表头 shTemp.Activate shTemp.Range("A1").Select ActiveSheet.Paste '粘贴到临时表 For i = 3 To j - 3 '成绩表最后三行为辅助数据,应减去 shResult.Activate shResult.Range(Cells(i, 1), Cells(i, 13)).Copy shTemp.Activate shTemp.Range("A2").Select ActiveSheet.Paste shTemp.Range("A1:M2").Columns.AutoFit '调整列宽 If Not CreateWord() Then Exit For '调用CreateWord函数生成通知书 Next ActiveWorkbook.Sheets("成绩表").Activate Exit Sub err1: Set shTemp = Worksheets.Add '添加一个临时表 shTemp.Name = "Temp" GoTo label1 '跳到标签label1处执行 End Sub Function CreateWord() As Boolean '创建Word文档 Dim myWord As Word.Application, myDoc As Word.Document Dim str1 As String Set myWord = New Word.Application With myWord Set myDoc = .Documents.Add(Template:=ThisWorkbook.Path & _ "\通知书\通知书模板.dot", Visible:=True) With .Selection .Goto What:=wdGoToBookmark, Name:="father" '插入学生名称 .TypeText Text:=Worksheets("Temp").Cells(2, 2) .Goto What:=wdGoToBookmark, Name:="date1" '放假日期 .TypeText Text:=Format(date1, "yyyy年mm月dd日") .Goto What:=wdGoToBookmark, Name:="date2" '报名日期 .TypeText Text:=Format(date2, "yyyy年mm月dd日") .Goto What:=wdGoToBookmark, Name:="date4" '行课日期 .TypeText Text:=Format(date4, "yyyy年mm月dd日") .Goto What:=wdGoToBookmark, Name:="date3" '填表日期 .TypeText Text:=Format(date3, "yyyy年mm月dd日") .Goto What:=wdGoToBookmark, Name:="results" '成绩表 Sheets("Temp").Range("A1:L2").Copy .TypeText Text:=vbTab .PasteExcelTable False, False, False .Goto What:=wdGoToBookmark, Name:="memo" '教师评语 .TypeText Text:=Worksheets("Temp").Range("M2") End With myDoc.SaveAs ThisWorkbook.Path & "\通知书\" & _ Worksheets("Temp").Cells(2, 2) & ".doc", wdFormatDocument myDoc.Close Set myDoc = Nothing End With Set myWord = Nothing str1 = Worksheets("Temp").Cells(2, 2) & "的通知书生成完毕!" & _ "是否生成下一个学生的通知书?" If MsgBox(str1, vbInformation vbYesNo, "提示") = vbYes Then CreateWord = True Else CreateWord = False End If End Function

以上代码首先从“成绩表”中获取放假、报名、开学的日期,接着复制表头至一个临时表,再逐行数据复制到临时表,调用CreateWord 函数生成通知识书。

CreateWord 函数通过模板新建一个Word 文档,接着使用Goto 方法查找模板中的书签,再将数据表中的数据插入书签处,最后保存生成的Word 文档。

4 Word.Application对象模型

4.1 Word.Application.Selection 对象

Selection 对象代表窗口或窗格中当前所选的内容。所选内容代表文档中选定(或突出显示)的区域,如果文档中没有选定任何内容,则代表插入点。每个文档窗格只能有一个Selection 对象,并且在整个应用程序中只能有一个活动的Selection 对象。

可以使用Selection 属性返回Selection 对象。如果Selection 属性未使用对象限定符,则Word 返回活动文档窗口的活动窗格中的所选内容。

4.2 Selection.TypeText 方法

使用Selection 对象的TypeText 方法可插入指定的文本。

如果ReplaceSelection 属性为True,则用指定文本替换选定的内容。如果ReplaceSelection为False,则在选定内容之前插入指定的文本。

4.3 Selection.GoTo 方法

使用Goto 方法可将插入点移至紧靠指定项之前的字符位置,并返回一个Range 对象,其语法格式如下:

表达式.GoTo(What, Which, Count, Name)

各参数的含义如下。

● What:表示指定范围或所选内容移动到的项目的类型。可设置为如表15-1 所示的常量之一。

● Which:表示指定范围或所选内容要移动到的项目的位置。可设置为如表15-2 所示的常量之一。

● Count:文档中的项数,只有正值有效。默认值为1。

● Name:如果What 参数为wdGoToBookmark、wdGoToComment、wdGoToField 或wdGoToObject,则此参数指定一个名称。

Word层次对象模型:

vba怎么批量修改excel(用Excel数据批量生成并修改用模板创建的Word文档)(4)

相关文档:

链接:https:///s/1lQPsqgZlyt_7Ml3Y4I37ig?pwd=wuhn

提取码:wuhn

ref

吴永佩,成丽君 《征服Excel VBA:让你工作效率倍增的239 个实用技巧 》

-End-

,