VBA、Word和數(shù)據(jù)庫的聯(lián)合編程

時(shí)間:2022-10-08 03:55:00

導(dǎo)語:VBA、Word和數(shù)據(jù)庫的聯(lián)合編程一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

VBA、Word和數(shù)據(jù)庫的聯(lián)合編程

摘要本文介紹了用vba作為開發(fā)語言,用Access或foxpro作為數(shù)據(jù)庫,用word中的書簽作為媒介,實(shí)現(xiàn)數(shù)據(jù)庫在Word中的自動(dòng)替換方法,并以通知書為例給出了源程序。

關(guān)鍵詞VBAWord數(shù)據(jù)庫bookmark(書簽)

在實(shí)際工作中,常常需要將數(shù)據(jù)庫中的數(shù)據(jù)放在Word文擋中。例如學(xué)校每期都要將學(xué)生的成績(jī)填入到通知書中寄發(fā)給學(xué)生(家庭)。傳統(tǒng)的實(shí)現(xiàn)方法是在Word手工輸入或用數(shù)據(jù)庫軟件編寫一個(gè)專門的程序(模塊)來完成此項(xiàng)工作。本文采用VBA作為開發(fā)語言,用宏命令的方法實(shí)現(xiàn)了Access數(shù)據(jù)庫或foxpro數(shù)據(jù)庫中的數(shù)據(jù)在Word中的自動(dòng)成批替換。

1實(shí)現(xiàn)方法

先在Word中建立一個(gè)名為“通知書.dot”的模板,將通知書中固定的文字內(nèi)容輸入到該模板中,將變動(dòng)的文字內(nèi)容(取數(shù)據(jù)庫中的字段值)設(shè)置成書簽(右圖中的name、math等)。為了編程方便,書簽名可取數(shù)據(jù)庫表中相應(yīng)的字段名。完成后存入Office的Templates(模板)目錄下。

要實(shí)現(xiàn)VBA與數(shù)據(jù)庫MicrosoftAccess97的連接,在Word中選主菜單”工具\(yùn)宏\宏名”打開VisualBasic編輯器;選VBA主菜單條上[工具]菜單項(xiàng)下的[引用]命令,激活[引用]對(duì)話框,從可使用的引用列表中選擇MicrosoftDAO2.5/3.5CompatibilityLibray一項(xiàng),然后單擊[確定]按鈕,把它引用到工程中來。

接下來在模板中編寫出一條宏命令,直接在Word中用程序代碼實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的讀取。對(duì)Access數(shù)據(jù)庫,用語句Setmd=DBEngine.OpenDatabase(“成績(jī)庫.mdb”)打開名為“成績(jī)庫.mdb”的數(shù)據(jù)庫,用語句Setrs=md.OpenRecordset("學(xué)生成績(jī)表",dbOpenTable)打開數(shù)據(jù)庫中的表名為"學(xué)生成績(jī)表"的記錄集,本命令只對(duì)記錄集進(jìn)行查詢,為了提高查詢速度,選擇了快照dbOpenSnapShot類型的記錄。對(duì)于foxpro的dbf數(shù)據(jù)庫,用語句Setmd=OpenDatabase("d:\grade\學(xué)生成績(jī)表",False,False,"foxpro2.5")打開名為“成績(jī)庫.dbf”的數(shù)據(jù)庫,用語句Setrs=md.OpenRecordset("學(xué)生成績(jī)表")的記錄集。因?yàn)閿?shù)據(jù)庫中一條記錄對(duì)應(yīng)一個(gè)學(xué)生,每個(gè)學(xué)生都要打印一份通知書,都要用通知書的內(nèi)容(包括書簽),要將模板中的通知書全部?jī)?nèi)容復(fù)制到一個(gè)新建的臨時(shí)文檔中,處理完一條記錄后,把通知書內(nèi)容從新建的臨時(shí)文擋中復(fù)制過來供下一條記錄使用。對(duì)于每個(gè)通知書(對(duì)應(yīng)一條記錄),用循環(huán)將數(shù)據(jù)表中的字段名用數(shù)組的形式保存,再根據(jù)通知書中的書簽名與保存的字段名比較,如果存在則用語句mydoc1.Bookmarks(i).Select選擇的書簽名,用數(shù)據(jù)表中相應(yīng)的字段值(rs.Fields(字段名))來替代文檔中的所選擇的書簽名。右圖為運(yùn)行宏命令后的一個(gè)通知書。

2源程序清單

‘從數(shù)據(jù)題中讀取數(shù)據(jù)的宏,在Word97(2000)上調(diào)試運(yùn)行

‘開發(fā)者:湖南工程學(xué)院陳華光

Substart()

Dimi,j,k,m,nrecord,txtnumberAsInteger

Dimaname(1To20)AsString

Setmd=DBEngine.OpenDatabase("D:\grade\成績(jī)庫.mdb")

Setrs=md.OpenRecordset("學(xué)生成績(jī)表",dbOpenTable)

Setmydoc1=ActiveDocument

txtnumber=mydoc1.Characters.Count

Setrange1=mydoc1.Range(start:=0,End:=txtnumber)

range1.Copy

mydoc2=Documents.Add

Selection.Paste

Setrange2=mydoc2.Range(start:=0,End:=txtnumber)

mydoc1.Activate

OnErrorResumeNext

rs.MoveLast

nrecord=rs.RecordCount

OnErrorGoTodoerror

Fork=1To20

aname(k)=rs.Fields(k).name

Nextk

doerror:

Form=1Tonrecord

Ifm=1Thenrs.MoveFirstElsers.MoveNext

Fork=1To5

totalnumber=mydoc1.Bookmarks.Count''''已存在的書簽數(shù)

Fori=totalnumberTo1Step-1

bname=rs.Fields(aname(k))

IfUCase$(mydoc1.Bookmarks(i).name)=UCase$(aname(k))Then

mydoc1.Bookmarks(i).Select

Selection.TypeTextText:=bname

EndIf

Nexti

Nextk

Selection.MoveDownUnit:=wdLine,Count:=4

Ifm<nrecordThen

mydoc2.Activate

range2.Copy

mydoc1.Activate

Selection.Paste

EndIf

Nextm

Documents(mydoc2).Closesavechanges:=wdDoNotSaveChanges

EndSub