潘伟珍 张 誉 卢 彤
教育部全国学生体质健康标准数据管理中心研发了一套体质健康管理系统,在全国已普遍采用。这套管理系统采用了使用较广泛的Excel进行数据导入与导出,这样提高数据的重用率和与其他软件的兼容性,为学生体质健康、体育达标评分工作提供了非常大的便利,避免了手工查询数据进行评分与登记的繁劳与人为出错的可能。同时,全国各地数据统一汇报到中国学生体质健康网后,又为各部门了解掌握与分析全国或部分地区的学生体质健康与
体育达标情况提供了依据与便利。作为在教育第一线的体育教师,更是直接的受益者。
在使用该统计表过程中,笔者发现这套管理系统美中不足的是它评分、划等级、生成Excel文档后并没有直接进行数据统计,需上传到中国学生体质健康网上后,过两天才能到网上查各种统计成绩。这样教师就不能及时地了解学生成绩情况。同时,网上的统计是分项的,一次只能生成一项的数据,使用起来不是很方便。能不能自己进行统计呢?当然,应该说由Excel文档再进行统计也不是难事,可偏偏此Excel文档每个单元格格式为“文本”,这样的格式中,数字作为文本处理,是不能进行运算的,这样平均分如何求得?改为“常规”后仍不能进行计算。左调右试,原来是改格式后,需激活方才有效。如何激活?需双击此单元格。(原表及统计表如http://flybase.51.net/体质健康统计示例.rar)这么多的数据,一个一个点是不是太机械,同时也不可能?何况,上级部门所需要的统计表复杂到分年级、分性别计算,再小计,全校再合计,如表1所示。
如何进行统计,得出上表的数据呢?体育达标工作转眼在春夏之交又将进行了,这项统计工作又将落在教师的身上,如何才能取得事半功倍甚至一劳永逸的效果呢?笔者经过摸索,寻找到以下几种解决方案与途径,因其具有广泛的适用性与参考意义,特抛出与大家共勉。
方案一 克服激活问题,进行统计
方法1:重新拷贝与选择性粘贴将需统计的表单全部拷贝,并新建一表,进行选择性粘贴。在选择性粘贴的对话框中选择运算为“加”,这样处理后的数据将可以进行计算。但非常可惜的是,除数字外,其余文字均不见了,对需要的文字应再选中其列,进行复制。显而易见,这绝非良策。
方法2:更改格式,再导入将表单另存为文本文件(在“另存为”对话框中选保存类型为“文本文件 *.txt”),再将数据导入(在菜单“数据/获取外部数据/导入文本文件”中按向导对话框提示点击“下一步”、“下一步”、“完成”即可)。
方法3:用VBA宏的方法激活进入菜单“工具/宏/Visual Basic编辑器”编写如下宏:
Sub 改格式并激活的宏()
Cells.Select
Selection.NumberFormatLocal = "G/通用格式"′改格式为常用
ActiveCell.SpecialCells(xlLastCell).Select′找到最后一格
MaxRow = ActiveCell.Row ′最大行
MaxCol = ActiveCell.Column′最大列
For i = 1 To MaxCol
CharOfCol = Chr(Asc("A") + (i - 1) Mod 26) ′列的字母
If i > 26 Then CharOfCol = Chr(Asc("A") + i 26 - 1) & CharOfCol
For j = 1 To MaxRow
Range(CharOfCol & j).Select
ActiveCell.FormulaR1C1 = ActiveCell.Text ′激活单元格
Next j,i
End Sub
以上这些方法均达到更改单元格格式,使之能进行计算的效果,还要多次进行排序、筛选、汇总、计数、用函数计算等操作。但由于本次统计数据复杂,运用这些方法仍需要做大量的工作,因此不能算是理想的方案。
方案二 运用VBA编写宏,直接得出统计数据
Excel提供了宏,可以方便地进行VBA程序编写,用机器进行计算和判断的速度与准确性是人脑所不能比拟的。根据原始表中“年级编号”在A列,分别在年级前加了个“1”,“性别”在G列,用“1”和“2”表示男女,“总分”在AG列,“等级”在AH列的特点,结合统计表所需数据,本人编写了VBA宏。您可以将之拷贝下来,放入宏中运行即可得出所需各项数据。为使之对大家有参考与借鉴意义,方便大家在另外工作中需要时进行修改,加入了较多注释。(由于篇幅原因,这里讲一下关键代码,完整示例在我的个人网站中,点击http://flybase.51.net/体质健康统计示例.rar可进行下载)主要步骤如下。
定义标题、各种计数数组、数组始化关键代码如下:
Title() = Array("学生人数", "平均分数", "达标人数", "达标率", "优秀", "优秀率", "良好", "良好率", "及格", "及格率", "不及格", "不及格率")/数组,存标题栏字串/
Dim a(7, 3, 12) As Single′6个年级加合计、3行(1男 2女 3小计)、12种数据同Title
……
由有数据的行得出全校人数及确定所需处理数据范围运用上面改格式并激活的宏的方法,找到最后一格、最后一个记录再减掉最后的空行得到范围及全校人数。
分年级、分男女生进行统计各项数据从第二行到最大行进行循环,运用Range("A" & i).Text, 1)得到年级;用Sex = Range("G" & i).Value得到性别;再分年级、性别、成绩级别进行累加,存入相应数组。
由各年级男女数相加得各年级小计数,再将各年级相加得全校总计数,再分别计算各项分率,存入相应数组中,关键代码如下:
For Grade = 1 To 7 :For Sex = 1 To 3/算各项分率/
a(Grade, Sex, 3) = a(Grade, Sex, 1) - a(Grade, Sex, 11) /合格数/
a(Grade, Sex, 2) = a(Grade, Sex, 2) / a(Grade, Sex, 1) /平均分/
For k = 4 To 12 Step 2 /算其余项分率/
a(Grade, Sex, k) = a(Grade, Sex, k - 1) / a(Grade, Sex, 1)
Next k, Sex, Grade
添加工作表,将统计数据写入添加工作表的方法:Sheets.Add;取列的字母方法:CharOfCol= Chr(Asc("A") + i)。然后进行循环,将各数组数据写到对应的单元格。
运行以上宏的方法,于是方便地得出了各项所需数据,可说是达到了一劳永逸的效果。其实,在Excel进行数据统计中,一般会选择排序、函数、自动筛选、高级筛选、分类汇总等方法,但当操作较复杂,这些方法也不太济事时,不妨考虑编写VBA宏,使之更好地为教师服务。
(作者单位:湖南省长沙县黄兴镇中心学校)