閆婷婷
吉林師范大學(xué), 吉林 四平 136000
通過Access窗口進(jìn)行交互式信息選擇、錄入及外部數(shù)據(jù)導(dǎo)入,輸入工號,根據(jù)人員所屬不同類型賬號直接讀取關(guān)聯(lián)信息,實(shí)現(xiàn)了自動選擇人員賬號、變更類型、自動輸入基礎(chǔ)信息的自動填寫功能;重新填寫可通過清空記錄按鈕實(shí)現(xiàn)一鍵清除已填寫信息的功能,最終實(shí)現(xiàn)將所有停退保人員信息批量寫入新的Word表格模板,并根據(jù)記錄數(shù)量實(shí)現(xiàn)自動分頁存儲、打印預(yù)覽(打印)功能。
首先新建一個名為DbTChange.mdb的Access數(shù)據(jù)庫,并將“空白模板.doc”和數(shù)據(jù)庫DbTChange.mdb放到同一個目錄下。在庫中創(chuàng)建停退保信息表、停退保類型表、BN工號_醫(yī)保編號對照表和BW工號_醫(yī)保編號對照表,共4個表。停退保信息表是依據(jù)Word模板所需的字段信息來設(shè)計(jì)表的結(jié)構(gòu),每一個進(jìn)行變更的人員相關(guān)信息最后都存在這個表中。停退保類型表僅僅用來存儲一列有效信息,將用于存儲所有停退保類型,此表用于組合框值列表,應(yīng)用于數(shù)據(jù)錄入時的類型選擇,避免了手工輸入的麻煩[1]。BN工號-醫(yī)保編號對照表和BW工號-醫(yī)保編號對照表為兩種不同類型人員的基本信息和醫(yī)保信息關(guān)聯(lián)對照表,兩張表結(jié)構(gòu)完全相同,在實(shí)際應(yīng)用中可根據(jù)人員情況進(jìn)行相應(yīng)修改,這兩張表用于人員信息自動錄入,即在信息錄入窗口輸入工號后回車,即可將醫(yī)保編號和姓名關(guān)聯(lián)取出寫入窗口,既節(jié)省時間又準(zhǔn)確無誤。另外,根據(jù)情況不同,可分別對兩張表格的字段進(jìn)行擴(kuò)充。
根據(jù)具體情況,可以選擇通過外部數(shù)據(jù)導(dǎo)入,即將Excel導(dǎo)入Access中,也可以在Access窗體上通過文本錄入,將停退保人員信息錄入。在這個過程中,人員類型和變更類型都是通過組合框的應(yīng)用和設(shè)置來實(shí)現(xiàn)自動填充的,添加成功后在子窗體中實(shí)時顯示查看[2]。
傳統(tǒng)的方式主要是基于書簽、Word郵件合并以及插入域的方式,來實(shí)現(xiàn)將Excel或Access數(shù)據(jù)庫表中的內(nèi)容逐條按字段寫入Word模板,但僅針對每一條記錄多個字段寫入一個模板,也有通過跨數(shù)據(jù)表或數(shù)據(jù)庫聯(lián)合查詢的,但無一例外都是一條記錄的N個字段對應(yīng)Word模板,多條數(shù)據(jù)循環(huán)生成多個模板文檔。針對向一個表格模板中導(dǎo)入多條數(shù)據(jù)多個字段,并根據(jù)表格模板容量自動分頁生成新文檔的情況并沒有相關(guān)案例,本文對這種情況的模板套打提出了解決辦法并得以實(shí)現(xiàn)。
首先要創(chuàng)建一個基于Word表格模板的文檔,新建數(shù)據(jù)記錄集用于獲取待處理的所有記錄,然后將記錄集內(nèi)容按字段賦值給Word表格單元格,并根據(jù)記錄數(shù)循環(huán)分頁,最后實(shí)現(xiàn)打印預(yù)覽功能。如需要直接打印,可將代碼doc.PrintPreview改為doc.Print即可。
Private Sub CmdSave_Click()
......
MyPath=CurrentProject.Path
Set rs=CurrentDb.OpenRecordset("停退保信息表")
rs.MoveLast
rs.MoveFirst
lr=rs.RecordCount
maxRs=9
p=countPage(lr,maxRs)
m=0
For I=1 To p
Set mydoc=doc.Documents.Add(MyPath&"空白模板.doc")
doc.Visible=False
Set Ttable=doc.ActiveDocument.Tables(1)
For j=1 To maxRs
If rs.EOF Then Exit Sub
Ttable.Cell(j+1,2).Range.Text=rs.Fields.Item(1)&""
......
Ttable.Cell(j+1,8).Range.Text=rs.Fields.Item(7)&""
doc.PrintPreview
rs.MoveNext
Next
m=m+1
mydoc.SaveAs MyPath&"醫(yī)療保險參保人員停保、退保變更登記表"&m&".doc"
Next
End Sub
以上代碼中記錄集rs和doc.ActiveDocument.Tables(1)的應(yīng)用至關(guān)重要,其中的rs.fields.item(i)理解為將數(shù)據(jù)表中的內(nèi)容放入記錄集后,i相當(dāng)于字段列所處序號,然后通過rs.MoveNext實(shí)現(xiàn)數(shù)據(jù)行的變更;舍棄常用的書簽bookmark,直接采用Ttable.Cell(j+1,2).Range.Text來向模板的Word表格指定單元格中寫入內(nèi)容,這里的Cell()函數(shù)使用上需要特別注意,起點(diǎn)是從0開始而不是1。將mydoc.SaveAs MyPath&"醫(yī)療保險參保人員停保、退保變更登記表"&m&".doc"這段代碼放入循環(huán),實(shí)現(xiàn)新建Word文檔的重新命名和保存。
我們將頁碼計(jì)算單獨(dú)放在一個函數(shù)中,這樣提高了代碼的可移植性和效率,當(dāng)模板發(fā)生變更時,此功能無需修改依然可用。利用記錄總數(shù)和模板的最多容納記錄數(shù)來計(jì)算總的頁數(shù),需要注意在獲取記錄總數(shù)lr前要先把記錄集的位置移到最后,否則將得不到記錄總數(shù)。
利用組合框來實(shí)現(xiàn)職工類型選擇,組合框的值設(shè)為BN工號-醫(yī)保編號對照表和BW工號-醫(yī)保編號對照表,即存放不同賬號類型人員信息的數(shù)據(jù)庫表名,輸入工號以后程序自動匹配姓名和醫(yī)保編號。
綜上,根據(jù)固定模板填充數(shù)據(jù)的工作,一旦業(yè)務(wù)量大,信息來源多,純手工粘貼復(fù)制,或者單純的引用函數(shù)就無法滿足工作需求。文章采用記錄集循環(huán)、分頁判斷、Word表格Cell()用法解決了使用書簽、郵件合并以及域方式實(shí)現(xiàn)模板套打無法滿足多條記錄分頁填充批量打印的問題,適應(yīng)不同信息源和打印模板,簡便靈活。