VBA如何用Excel数据批量生成Word文档

简介: VBA|用Excel数据批量生成并修改用模板创建的Word文档

有以下工作薄:

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

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

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 '保存成绩表的引用
//代码效果参考:http://www.zidongmutanji.com/zsjx/286629.html

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日")
        //代码效果参考:http://www.zidongmutanji.com/bxxx/28566.html

        .Goto What:=wdGoToBookmark, Name:="results"     '成绩表
        Sheets("Temp").Range("A1:L2").Copy
        .TypeText Text:=vbTab
        .PasteExcelTable False, False, False
        //代码效果参考:http://www.zidongmutanji.com/zsjx/234251.html

        .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,则此参数指定一个名称。

相关文章
|
2月前
|
Python
如何根据Excel某列数据为依据分成一个新的工作表
在处理Excel数据时,我们常需要根据列值将数据分到不同的工作表或文件中。本文通过Python和VBA两种方法实现该操作:使用Python的`pandas`库按年级拆分为多个文件,再通过VBA宏按班级生成新的工作表,帮助高效整理复杂数据。
|
2月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
4月前
|
存储 安全 大数据
网安工程师必看!AiPy解决fscan扫描数据整理难题—多种信息快速分拣+Excel结构化存储方案
作为一名安全测试工程师,分析fscan扫描结果曾是繁琐的手动活:从海量日志中提取开放端口、漏洞信息和主机数据,耗时又易错。但现在,借助AiPy开发的GUI解析工具,只需喝杯奶茶的时间,即可将[PORT]、[SERVICE]、[VULN]、[HOST]等关键信息智能分类,并生成三份清晰的Excel报表。告别手动整理,大幅提升效率!在安全行业,工具党正碾压手动党。掌握AiPy,把时间留给真正的攻防实战!官网链接:https://www.aipyaipy.com,解锁更多用法!
|
10天前
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
141 0
|
2月前
|
Python
将Excel特定某列数据删除
将Excel特定某列数据删除
|
4月前
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
161 10
|
9月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
1663 10
|
11月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
618 4
|
7月前
|
分布式计算 Hadoop 大数据
从Excel到Hadoop:数据规模的进化之路
从Excel到Hadoop:数据规模的进化之路
147 10

热门文章

最新文章