研究VBA、Word和数据库的联合编程

介绍如何利用VBA编程结合Word中的书签功能,实现从Access或FoxPro数据库中自动填充Word文档变动内容的方法。适用于批量生成个性化文档如通知书。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

摘要 本文介绍了用VBA作为开发语言,用Access或foxpro作为数据库, 用word中的书签作为媒介,实现数据库在Word中的自动替换方法,并以通知书为例给出了源程序。

VBA Word 数据库 bookmark(书签)

在实际工作中,经常需要将数据库中的数据放在Word文挡中。例如学校每期都要将学生的成绩填入到通知书中寄发给学生(家庭)。传统的实现方法是在Word手工输入或用数据库软件编写一个专门的程序(模块)来完成此项工作。本文采用VBA作为开发语言,用宏命令的方法实现了Access数据库或foxpro数据库中的数据在Word中的自动成批替换。
1 实现方法
先在Word中建立一个名为“通知书.dot”的模板,将通知书中固定的文字内容输入到该模板中, 将变动的文字内容(取数据库中的字段值)设置成书签(右图中的name、math等)。为了编程方便,书签名可取数据库表中相应的字段名。完成后存入Office的Templates(模板)目录下。
要实现VBA和数据库Microsoft Access 97的连接,在Word中选主菜单 ”工具/宏/宏名”打开Visual Basic编辑器;选VBA主菜单条上[工具菜单项下的[引用命令,激活[引用对话框,从可使用的引用列表中选择Microsoft DAO 2.5/3.5 Compatibility Libray一项,然后单击[确定按钮,把它引用到工程中来。
接下来在模板中编写出一条宏命令,直接在Word中用程序代码实现对数据库的读取。对Access数据库,用语句Set md = DBEngine. OpenDatabase (“成绩库.mdb”)打开名为“成绩库.mdb”的数据库,用语句 Set rs = md. OpenRecordset("学生成绩表", dbOpenTable) 打开数据库中的表名为"学生成绩表"的记录集,本命令只对记录集进行查询,为了提高查询速度,选择了快照dbOpenSnapShot类型的记录。对于foxpro的dbf数据库,用语句 Set md = OpenDatabase("d摘要:/grade/学生成绩表", False, False, "foxpro 2.5")打开名为“成绩库.dbf”的数据库,用语句Set rs = md.OpenRecordset("学生成绩表")的记录集。因为数据库中一条记录对应一个学生,每个学生都要打印一份通知书,都要用通知书的内容(包括书签),要将模板中的通知书全部内容复制到一个新建的临时文档中,处理完一条记录后,把通知书内容从新建的临时文挡中复制过来供下一条记录使用。对于每个通知书(对应一条记录),用循环将数据表中的字段名用数组的形式保存,再根据通知书中的书签名和保存的字段名比较,假如存在则用语句 mydoc1.Bookmarks(i).Select选择的书签名, 用数据表中相应的字段值(rs.Fields(字段名))来替代文档中的所选择的书签名。右图为运行宏命令后的一个通知书。
2 源程序清单
‘从数据题中读取数据的宏,在Word97(2000)上调试运行
‘开发者摘要:湖南工程学院 陈华光
Sub start()
Dim i, j, k, m, nrecord , txtnumber As Integer
Dim aname(1 To 20) As String
Set md = DBEngine.OpenDatabase("D摘要:/grade/成绩库.mdb")
Set rs = md.OpenRecordset("学生成绩表", dbOpenTable)
Set mydoc1 = ActiveDocument
txtnumber = mydoc1.Characters.Count
Set range1 = mydoc1.Range (start摘要:=0, End摘要:=txtnumber)
range1.Copy
mydoc2 = Documents.Add
Selection.Paste
Set range2 = mydoc2.Range(start摘要:=0, End摘要:=txtnumber)
mydoc1.Activate
On Error Resume Next
rs.MoveLast
nrecord = rs.RecordCount
On Error GoTo doerror
For k = 1 To 20
aname(k) = rs.Fields(k).name
Next k
doerror摘要:
For m = 1 To nrecord
If m = 1 Then rs.MoveFirst Else rs.MoveNext
For k = 1 To 5


totalnumber = mydoc1.Bookmarks.Count '已存在的书签数
For i = totalnumber To 1 Step -1
bname = rs.Fields(aname(k))
If UCase$(mydoc1.Bookmarks(i).name) = UCase$(aname(k)) Then
mydoc1.Bookmarks(i).Select
Selection.TypeText Text摘要:=bname
End If
Next i
Next k
Selection.MoveDown Unit摘要:=wdLine, Count摘要:=4
If m %26lt; nrecord Then
mydoc2.Activate
range2.Copy
mydoc1.Activate
Selection.Paste
End If
Next m
Documents(mydoc2).Close savechanges摘要:=wdDoNotSaveChanges
End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值