向德海
在日常工作中,中小學(xué)教師經(jīng)常需要將以Excel格式錄入的考生成績(jī)數(shù)據(jù)轉(zhuǎn)換成Word文本的成績(jī)通知單,并將考生成績(jī)單批量打印后發(fā)至每一位考生手中。以往,我們是借助于Word的郵件合并功能來解決這一問題,經(jīng)過筆者的探索,運(yùn)用ExcelVBA,打開Word模板文件也可實(shí)現(xiàn)上述目的。
一、準(zhǔn)備數(shù)據(jù)
在該程序中要使用兩個(gè)文件,一是用Excel制作的學(xué)生成績(jī)表,另一個(gè)是用Word制作的“成績(jī)通知單”。具體步驟如下。
第一步,在工作簿中新建一個(gè)工作表,命名為“Temp”,將成績(jī)表中第1行表頭復(fù)制到Temp表第1行中保存,命名該工作簿為“成績(jī)數(shù)據(jù)”。
第二步,打開Word2003,建立文檔,并進(jìn)行相應(yīng)的版式和格式設(shè)置。
第三步,將光標(biāo)定位在“同學(xué)的家長(zhǎng)”前面,執(zhí)行“插入→書簽”命令,打開“書簽”對(duì)話框,在“書簽名”中輸入“students”,單擊“添加”按鈕,在光標(biāo)處添加一個(gè)書簽,VBA程序可查找書簽,并在書簽處插入學(xué)生姓名。用同樣的方法,在“學(xué)號(hào)”對(duì)應(yīng)表格中插入書簽“xuehao”,在“姓名”、“語(yǔ)文”、“數(shù)學(xué)”、“英語(yǔ)”、“體育”、“總分”、“名次”對(duì)應(yīng)單元格中分別插入書簽“xingming”、“yuwen”、“shuxue”、“yingyu”、“tiyu”、“zongfen”、“mingci”。在“教師評(píng)語(yǔ)”的下一行插入書簽“pingyu”。
第四步,將制作好的文檔和“成績(jī)數(shù)據(jù)”工作簿保存在同一文件目錄下,命名為“成績(jī)通知單.dot”模板文件,關(guān)閉文檔。
二、編寫VBA代碼
數(shù)據(jù)文件準(zhǔn)備好后,就可以在Excel中編寫VBA代碼了,調(diào)用Word服務(wù)程序來生成并打印每個(gè)學(xué)生的成績(jī)通知書。
打開剛才建立的“成績(jī)數(shù)據(jù)”工作簿,在“成績(jī)表”工作表中,執(zhí)行“工具→宏→Visul Basic編輯器”命令,在Visul Basic編輯器中選擇“插入→添加模塊”,插入模塊1,在代碼窗口輸入以下代碼:
Dim iCount As Integer
Sub 生成打印成績(jī)單()
Application.ScreenUpdating = False ' 關(guān)閉執(zhí)行程序時(shí)發(fā)生的屏幕更新,加快運(yùn)行速度。
On Error GoTo Pro1:
Sheets("成績(jī)表").Select
iCount = [A65536].End(xlUp).Row '計(jì)算數(shù)據(jù)行數(shù)
For i = 2 To iCount
Range(Cells(i, 1), Cells(i, 9)).Select'選擇單元格區(qū)域
Selection.Copy
Sheets("Temp").Select '選擇Temp工作表
Range("A2").Select
ActiveSheet.Paste'粘貼到2行
Application.CutCopyMode = False
CreateWord
Sheets("成績(jī)表").Select
Next i
Pro1:
End Sub
Sub CreateWord()
On Error GoTo Pro2:
Dim WordAPP As Object, myWord As Object '聲明Word應(yīng)用程序?qū)ο蠹拔臋n對(duì)象
Set WordAPP = CreateObject("Word.Application")
Set myWord = WordAPP.documents.Open(Filename:=Application.ActiveWorkbook.Path & "成績(jī)通知單.DOT") '打開模版文件
WordAPP.Visible = True'設(shè)置應(yīng)用程序Word可見
With WordAPP.Selection'開始向WORD文件寫入內(nèi)容
myWord.Bookmarks("students").Range = Worksheets("Temp").Range("B2")
myWord.Bookmarks("xuehao").Range = Worksheets("Temp").Range("A2")
myWord.Bookmarks("xingming").Range = Worksheets("Temp").Range("B2")
myWord.Bookmarks("yuwen").Range = Worksheets("Temp").Range("C2")
myWord.Bookmarks("shuxue").Range = Worksheets("Temp").Range("D2")
myWord.Bookmarks("yingyu").Range = Worksheets("Temp").Range("E2")
myWord.Bookmarks("tiyu").Range = Worksheets("Temp").Range("F2")
myWord.Bookmarks("zongfen").Range = Worksheets("Temp").Range("G2")
myWord.Bookmarks("mingci").Range = Worksheets("Temp").Range("H2")
myWord.Bookmarks("pingyu").Range = Worksheets("Temp").Range("I2")
End With
WordAPP.PrintOut Copies:=1, Collate:=True 5打印文檔
myWord.Saved = True5不保存文檔
myWord.Close'關(guān)閉并退出當(dāng)前Word文檔
WordAPP.Quit
Set myWord = Nothing
Set WordAPP = Nothing
Pro2:
End Sub
輸入完成后,保存關(guān)閉VBA編輯窗口,返回到“成績(jī)表”工作表。
三、生成通知單
運(yùn)行以上代碼就可以自動(dòng)生成并打印每位考生的成績(jī)通知單了。為便于程序執(zhí)行,我們還可在“成績(jī)表”工作表中添加一個(gè)按鈕。執(zhí)行“視圖→工具欄→控件工具箱”命令,單擊“命令按鈕”,在工作表中畫出一個(gè)命令按鈕。右擊命令按鈕,在出現(xiàn)的快捷菜單中,選擇“屬性”選項(xiàng),打開“屬性”設(shè)置對(duì)話框。切換到“按分類序”標(biāo)簽下,展開“外觀”選項(xiàng),將“Caption”選項(xiàng)右側(cè)的字符修改為“生成打印成績(jī)單”,為按鈕設(shè)置顏色及字體屬性。再展開“雜項(xiàng)”選項(xiàng),將“PrintObject”選項(xiàng)設(shè)置為“False”,設(shè)置完成后,關(guān)閉“屬性”對(duì)話框。
雙擊剛才添加的命令按鈕,再次進(jìn)入VBA編輯狀態(tài),將“生成打印成績(jī)單”(上述代碼中的宏名稱)字符輸入到已經(jīng)出現(xiàn)的兩行代碼之間:
Private Sub CommandButton1_Click()
生成打印成績(jī)單
End Sub
輸入完成后,關(guān)閉VBA編輯狀態(tài),返回工作表中。調(diào)整按鈕的大小,將按鈕定位在表格中的適當(dāng)位置,再按下“控件工具箱”上的“退出設(shè)計(jì)模式”按鈕。
單擊“生成打印成績(jī)單”按鈕,執(zhí)行前面編寫的代碼,就可以自動(dòng)生成并打印每一位考生的成績(jī)通知單。
在上述程序中,通過循環(huán)對(duì)每一位學(xué)生生成一份成績(jī)通知書。如果學(xué)生人數(shù)很多,該程序運(yùn)行可能較慢。我們還可以添加代碼保存所有成績(jī)單到指定的路徑,有興趣的讀者可以自己去體會(huì)。
(作者單位:湖北荊門市人事考試中心)