VBA、Word和數據庫的聯合編程

時間:2022-10-08 03:55:00

導語:VBA、Word和數據庫的聯合編程一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

VBA、Word和數據庫的聯合編程

摘要本文介紹了用vba作為開發語言,用Access或foxpro作為數據庫,用word中的書簽作為媒介,實現數據庫在Word中的自動替換方法,并以通知書為例給出了源程序。

關鍵詞VBAWord數據庫bookmark(書簽)

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

1實現方法

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

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

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

2源程序清單

‘從數據題中讀取數據的宏,在Word97(2000)上調試運行

‘開發者:湖南工程學院陳華光

Substart()

Dimi,j,k,m,nrecord,txtnumberAsInteger

Dimaname(1To20)AsString

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

Setrs=md.OpenRecordset("學生成績表",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''''已存在的書簽數

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