摘 要:论述了利用EXCEL的VBA编程功能,把相当大的数据处理任务交给程序自动进行处理, 实现了表格的自动批量复制打印,实现了办公自动化,提高了EXCEL在实际应用中的工作效率及节省人力资源。
关键词:EXCEL VBA ;批量打印;登记卡;办公自动化
1 问题的提出
在体育教学过程中,体育教师每年都要对学生进行体质健康测试,还要填《国家学生体质健康标准》登记卡上报数据。比如要实现如下一项任务,见图1、图2和图3。
要求把图1中的数据按照图2、图3 《国家学生体质健康标准》登记卡的格式填写完整并打印输出。按照常规的方法,把第一个人的信息依次复制到要打印的表格中,然后打印,再复制下一个人员,依此类推。如果人很多的话,这项工作很是繁琐,也容易出错。因此,我写了一个VBA程序,让工作自动进行。
1.1什么是VBA?
在Office软件中,VBA应用程序能够在Word、Excel等之间进行交互式应用,加强了应用程序间的互动。
1.2实现方法
为了描述方便,笔者将含有数据的表格(图1)命名为数据表,其工作表标签为“成绩统计”,将要打印的《国家学生体质健康标准》登记卡(图1、图2)命名为“1-2年级打印”、“3-4年级打印”、“5-6年级打印”,其工作表标签相應命名。
2 系统设计
2.1程序设计的主要思路
假设此工作是用手工操作的话,比如从第2行记录打印到第10行记录,那么操作过程应该是这样的:把数据表中的D4单元格中的“诸葛亮”复制到登记表中的C4单元格中,把数据表中的E4复制到登记表中的I4,依此类推,直至把“诸葛亮” 的一分钟跳绳的成绩复制到登记表中对应的D16单元格中,数据复制完成后,打印输出,这样就完成了第2行记录的操作,接下来复制“夏侯惇”的数据到登记中,然后再打印。如此一直到第10 行记录“任盈盈”。根据这个工作流程,如果用程序来实现的话,可以通过循环的方式复制数据表中的数据到登记表中对应的位置,再用循环的方式处理多个不同人员的信息。
2.2程序的功能
根据工作中的需要,程序应该可以实现多种批量打印的形式,主要包括以下几种:
(1) 连续的记录,如从第5行到第50行。
(2) 不连续的记录,如第5、10、15、20行这四条记录。
(3) 根据学籍号打印某一条记录。
(4) 分年级打印记录。
(5) 分班级打印记录。
上述几种形式在某些时候可以达到相同的目的,如第(2) 种形式中,选择连续的记录就和第(1)种形式相同,选择单个的记录就与第(3)种形式相同;第(4) 种形式和第(5) 种形式结构相同。
2.3程序的关键技术
第一、由程序的设计思路可知,程序运行时用户就要告诉程序处理的是哪些数据。由于各年级的表格不尽相同,就需要分别调用对应的表格模板。
第二、由于要处理不同人员的数据,以及提取相应信息,所以要用到两个循环。处理不同人员的数据时,调用对应的学籍号就可以了;而提取相应的信息,要在各自的模板中进行,再由程序调用。
第三、程序要能与用户交互。可以由用户选择打印或不打印哪些数据。
第四、由于程序要批量打印,也让用户心中有数,因此,已经打印过的数据要做出记号,避免重复。
3 用户界面的设计和代码的编写
在新的excel工作簿里建6个工作表,标签名称分别为“成绩统计”、“评分标准”、“测试成绩”、“1-2年级打印”、“3-4年级打印”、“5-6年级打印”。前面3个工作表的内容网上有,这儿就不介绍了。后面3个工作表,分别把各自对应的模板复制过来就好,分别在右上角添加一个命令按钮,其显示为“打印登记卡”作为用户召唤打印页面的选择。在Excel中按ALT+F11,可以打开VBE界面,点击“插入”——“用户窗体”,就插入了一个窗体,为了在程序中方便地引用它,可以把它的名称改为U12print,用同样的方法再添加两个窗体,分别命名为U34print、U56print如图4。
在窗体的上部放一个文本框,作为输入口,一个命令按钮其显示为“查询”。相关的代码如下:
Private Sub cmd查询_Click()
Dim SQL$, i&
If Trim(Text1.Text) = “” Then Exit Sub
Check1.Value = False: Check2.Value = False: Check3.Value = False
SQL = "Select * from [成绩统计$A4:AM" & myR & "] where f3 like '%" & UCase(Trim(Text1.Text)) & "%'"
List1.Clear
If rs.State <> 0 Then rs.Close
rs.Open SQL, cnn, 1, 3
If rs.RecordCount > 0 Then
For i = 0 To rs.RecordCount - 1
If rs.Fields(2) <> "" Then List1.AddItem rs.Fields(2) '学籍号
rs.MoveNext
Next
End If
End Sub
在窗体的中部放一个列表框控件list1,以便显示学生学籍号。右边两个多选按钮其显示为“已打印 登记卡”、“未打印 登记卡”,下边一个多选按钮“选中全部记录”。右边两个显示为“打印”和“关闭”的命令按钮。相关的代码如下:
以上代码是打印1—2年级的,其他年级的与此相似。
值得说明的是,列表框控件的MultiSelect属性应该设置为2-fmMultiSelectExtended,这样,用户可以利用Shift和Ctrl键对列表框中的记录进行多项选择。当用户选择“未打印 登记卡”时列表框中出现所有还未打印的列表选项,用户可以自由选择打印。
要打印的数据源要从图1往图2图3的对应位置引用。如要打印图2任盈盈的资料,这样引用:在C4单元格里输入“=IF($M$4="","",INDEX(成绩统计!$A:$AL,MATCH($M$4,成绩统计!$C:$C,0),4))”其他引用的数据与此相似就不多介绍了。最后,新建一个模块1,把显示为“打印登记卡”的命令按钮与窗体联系起来,代码如下:
4 程序的测试和运行
用户在各页选择“打印登记卡”时分别召唤对应的窗体,套用对应模板打印对应数据。如图4、图5、图6。
用户在窗体选择“未打印 登记卡”时,列表框中列出当前未被打印的数据,选择“选中全部记录”时,再按“打印”就可以全部打印。
5 结语
经过试验,程序可以正常运行并实现系统设计中的功能。由此看出,在Excel中,VBA提供了广大的可自由扩展的空间,可以用VBA来编制适合自己专用的程序,大大减轻工作量,更好地利用计算机为我们服务。
参考文献
[1]崔晓宏.用VBA实现批量复制和打印任务[J].电脑编程技巧与维护,2010(21).86-89.
[2]罗刚君.EXCELVBA程序开发自学宝典(第3版)[M].北京:电子工业出版社,2014.
[3]shywkb.2014学生体质健康测试计算模板(中、小学).Excelhome论坛[M].北京:人民邮电出版社,2012.
作者简介
范拽拽(1980-),男,汉 山西省洪洞县,大专,汉语言文学。