用VBA批量生成打印考生成绩通知单
2009-03-02向德海
向德海
在日常工作中,中小学教师经常需要将以Excel格式录入的考生成绩数据转换成Word文本的成绩通知单,并将考生成绩单批量打印后发至每一位考生手中。以往,我们是借助于Word的邮件合并功能来解决这一问题,经过笔者的探索,运用ExcelVBA,打开Word模板文件也可实现上述目的。
一、准备数据
在该程序中要使用两个文件,一是用Excel制作的学生成绩表,另一个是用Word制作的“成绩通知单”。具体步骤如下。
第一步,在工作簿中新建一个工作表,命名为“Temp”,将成绩表中第1行表头复制到Temp表第1行中保存,命名该工作簿为“成绩数据”。
第二步,打开Word2003,建立文档,并进行相应的版式和格式设置。
第三步,将光标定位在“同学的家长”前面,执行“插入→书签”命令,打开“书签”对话框,在“书签名”中输入“students”,单击“添加”按钮,在光标处添加一个书签,VBA程序可查找书签,并在书签处插入学生姓名。用同样的方法,在“学号”对应表格中插入书签“xuehao”,在“姓名”、“语文”、“数学”、“英语”、“体育”、“总分”、“名次”对应单元格中分别插入书签“xingming”、“yuwen”、“shuxue”、“yingyu”、“tiyu”、“zongfen”、“mingci”。在“教师评语”的下一行插入书签“pingyu”。
第四步,将制作好的文档和“成绩数据”工作簿保存在同一文件目录下,命名为“成绩通知单.dot”模板文件,关闭文档。
二、编写VBA代码
数据文件准备好后,就可以在Excel中编写VBA代码了,调用Word服务程序来生成并打印每个学生的成绩通知书。
打开刚才建立的“成绩数据”工作簿,在“成绩表”工作表中,执行“工具→宏→Visul Basic编辑器”命令,在Visul Basic编辑器中选择“插入→添加模块”,插入模块1,在代码窗口输入以下代码:
Dim iCount As Integer
Sub 生成打印成绩单()
Application.ScreenUpdating = False ' 关闭执行程序时发生的屏幕更新,加快运行速度。
On Error GoTo Pro1:
Sheets("成绩表").Select
iCount = [A65536].End(xlUp).Row '计算数据行数
For i = 2 To iCount
Range(Cells(i, 1), Cells(i, 9)).Select'选择单元格区域
Selection.Copy
Sheets("Temp").Select '选择Temp工作表
Range("A2").Select
ActiveSheet.Paste'粘贴到2行
Application.CutCopyMode = False
CreateWord
Sheets("成绩表").Select
Next i
Pro1:
End Sub
Sub CreateWord()
On Error GoTo Pro2:
Dim WordAPP As Object, myWord As Object '声明Word应用程序对象及文档对象
Set WordAPP = CreateObject("Word.Application")
Set myWord = WordAPP.documents.Open(Filename:=Application.ActiveWorkbook.Path & "成绩通知单.DOT") '打开模版文件
WordAPP.Visible = True'设置应用程序Word可见
With WordAPP.Selection'开始向WORD文件写入内容
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'关闭并退出当前Word文档
WordAPP.Quit
Set myWord = Nothing
Set WordAPP = Nothing
Pro2:
End Sub
输入完成后,保存关闭VBA编辑窗口,返回到“成绩表”工作表。
三、生成通知单
运行以上代码就可以自动生成并打印每位考生的成绩通知单了。为便于程序执行,我们还可在“成绩表”工作表中添加一个按钮。执行“视图→工具栏→控件工具箱”命令,单击“命令按钮”,在工作表中画出一个命令按钮。右击命令按钮,在出现的快捷菜单中,选择“属性”选项,打开“属性”设置对话框。切换到“按分类序”标签下,展开“外观”选项,将“Caption”选项右侧的字符修改为“生成打印成绩单”,为按钮设置颜色及字体属性。再展开“杂项”选项,将“PrintObject”选项设置为“False”,设置完成后,关闭“属性”对话框。
双击刚才添加的命令按钮,再次进入VBA编辑状态,将“生成打印成绩单”(上述代码中的宏名称)字符输入到已经出现的两行代码之间:
Private Sub CommandButton1_Click()
生成打印成绩单
End Sub
输入完成后,关闭VBA编辑状态,返回工作表中。调整按钮的大小,将按钮定位在表格中的适当位置,再按下“控件工具箱”上的“退出设计模式”按钮。
单击“生成打印成绩单”按钮,执行前面编写的代码,就可以自动生成并打印每一位考生的成绩通知单。
在上述程序中,通过循环对每一位学生生成一份成绩通知书。如果学生人数很多,该程序运行可能较慢。我们还可以添加代码保存所有成绩单到指定的路径,有兴趣的读者可以自己去体会。
(作者单位:湖北荆门市人事考试中心)