巧用Excel VBA编程进行成绩分析统计

标签:
excel经验技巧vba成绩统计成绩分析考试成绩管理 |
分类: excel技巧 |
本软件下载地址
小学初高中考试成绩统计分析管理系统
http://wenku.baidu.com/view/4c148eea647d27284a735167
高中考试成绩统计分析管理系统(有文理班)
http://wenku.baidu.com/view/c6c8c3062cc58bd63086bd60
【摘要】为了保证学生成绩录入和处理的公平性,为了防止考试改卷中的不正当竞争,学校一般都会将同一年级的学生打乱,混合编班进行测试和录入分数。为了提高数据分析的效率,避免不必要的重复工作,本文利用Excel VBA编程方法轻松实现了不破坏原始表,且不受班数和人数限制的前提下,及时准确地对成绩进行处理和分析。
【关键词】教学成绩 统计 分析 Excel VBA
在学校的教学活动中,通过统计分析学生的考试成绩,以便确定学生的接受效果和教学的方法是否得当,为教学方法的改进提供依据,是每一位任课教师所要做的重要教学工作之一。有了Excel,我们可用不用躬着身、驼着背、拿着计算器一个一个算着学生的成绩了,大大提高工作效率、规范处理过程、减少差错。
为了保证学生成绩录入和处理的公平性,为了防止考试改卷中的不正当竞争,很多学校采用全年级混合编班考试,而统计成绩时,则是将已判分但未拆封的考卷统一交到教务处,按座位号顺序(每本考卷的自然顺序)统一录入成绩。也就是说,把同年级多个班的学生成绩统一录入到一个Excel工作表中,再分析统计出全年级各科成绩。这种情况下,想在不破坏原始工作表的情况下统计分析各科各班成绩,采用排序、筛选等人工干预完成统计是一件很枯燥、很繁琐、工作量很大的事。那么,能不能用相对比较简单的办法来解决问题呢?答案显然是肯定的。
Excel是微软公司的Microsoft office的组件之一,它可以进行各种数据的处理、统计分析,在学校工作中有着广泛的应用。例如花名册、座位表、登分表等的电子文档都是使用它来创建的。Excel不仅具有强大的制表功能,同时还内置了系统开发工具VBA。VBA是指Visual Basic for Application,它是在Office中广泛应用的宏语言,可以直接对Excel对象进行编程,从而提高Excel的利用效率。使用它可以增强Excel的自动化能力,使用户更高效地完成特定任务。因此,笔者空闲时用VBA编了个程序,轻松快速地统计分析成绩(如个人总分,按班或年级排名、总分、平均分、最高分、最低分、名次或分数段人数、年级或班级前XX名等,并可输出打印),不破坏原始工作表,不受班数和人数限制,可自定义作弊、缺考、0分是否参与统计分析,经实际应用,操作简单,方便实用。
程序分为排名、统计、查询、打印四大模块,设计完成后,工作人员只需导入原始成绩表:第一行为列标题且有班级一列和不合并单元格即可,其它不受任何限制(如存在空行或空列;可以任意增加删除科目;可以任意增加删除辅助列如:学号、年级、座位号等;而且各列位置任意;不受班数、人数、科目数限制,行列不受限制等,如图1)。在设置工作表中设置各科满分、优秀线、及格线、低分线、分数段、名次段、任课教师后,即可进行成绩统计、查询及打印输出。
http://s10/mw690/001LTkQegy71Jda0kdP69&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图1
一、个人总分计算
因原始成绩表不限制科目数且各列位置任意,而且还想任意搭配科目计算总分,如:文综(政史地)、理综(理化生),为了方便缺考、作弊的统计,原始成绩表录入-2代表缺考,计0分、-1代表作弊,计0分,不能用自动求和公式SUM计算总分。本软件按照设置的总分科目采用循环方式计算总分。
http://s2/mw690/001LTkQegy71JdcveZH11&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图2 总分科目
代码:利用VBA数组加快代码运行速度
Arr = Worksheets
("原始成绩").UsedRange.Value
Arr1 = Worksheets
("总分设置").UsedRange.Value
For y = 2 To UBound(Arr1
,2)
Next
运行结果如图3:
http://s3/mw690/001LTkQegy71JdeoHrIa2&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图3
二、排名
原始成绩表有可能录入-1、-2但又要按0分排名,除以年级为单位排名外还要能以班为单位排名,因此本软件不使用工作表排名公式Rank进行排名,而是将排序科目先降序排序再按顺序写入名次,排名操作窗口如图4。
http://s11/mw690/001LTkQegy71JdfU2OSaa&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图4
年级排名代码:
For i = 0 To ListBox1.ListCount - 1 '循环排名科目
Next i
班级排名先以班级及排名科目为关键字进行多条件排序,找出某班开始行号及结束行号,然后按上述方式循环班级所在行进行排名。代码如下:省略重复部分
For i = 0 To ListBox2.ListCount - 1 '循环排名科目
start = x
Next x
Next i
运行结果如图5。
http://s1/mw690/001LTkQegy71Jdh3fI400&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图5
三、统计各项指标
本软件以班级列统计应考人数,科目列统计该科实考人数,单元格为空不参与统计。以班级为关键字排序后通过For循环某科目列的各行,计算各班总分、平均分,统计优秀人数、及格人数、低分人数、各分数段及名次段人数、最高分、最低分。统计窗口如图6。
http://s7/mw690/001LTkQegy71Jdi4stMc6&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图6
代码:
ArrSht6 = .UsedRange
.Value
ArrSht7 = .UsedRange
.Value
.UsedRange.Sort Key1:=
"班级", Order1:=xlAscending, Header:=xlYes,
Orientation:=xlSortColumns
ArrSht5 = .UsedRange
.Value
For i = 0 To ListBox1.ListCount - 1 '循环统计科目
For x = 3 To UBound(ArrSht5,1)
Next x
Next i
……
'年级数据统计************
tjL = tjL + 1
ReDim Preserve ArrTJ(1 To ArrbtCount, 1 To tjL)
ArrTJ(1, tjL) = "合计"
ArrTJ(13, tjL) = 200000
For x = 1 To UBound(ArrTJ, 2) - 1
Next x
ArrTJ(5, tjL) = Val(ArrTJ(4, tjL)) / Val(ArrTJ(3, tjL)) '平均分
ArrTJ(7, tjL) = Val(ArrTJ(6, tjL)) / Val(ArrTJ(3, tjL)) '优秀率
ArrTJ(9, tjL) = Val(ArrTJ(8, tjL)) / Val(ArrTJ(3, tjL)) '及格率
ArrTJ(11, tjL) = Val(ArrTJ(10, tjL)) / Val(ArrTJ(3, tjL)) '低分率
'***************
名次段及分数段人数统计因频率不确定,不能用Select Case语句而改用循环统计。代码:
'分数段频数读入数组************
For x1 = 7 To 36
Next x1
'***************
……
'统计分数段或名次段***********
For x1 = start + 1 To over
Next j
Next x1
'***************
运行结果:
http://s13/mw690/001LTkQegy71JdjHyNK8c&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图7
http://s14/mw690/001LTkQegy71JdkMBhb9d&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图8
http://s9/mw690/001LTkQegy71JdlN5SU48&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图9
http://s10/mw690/001LTkQegy71JdmIlChb9&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图10
http://s6/mw690/001LTkQegy71JdnysKh25&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图11
四、查询
本软件通过查询窗口巧妙设置排序关键字及高级筛选条件,以AdvancedFilter高级筛选方法实现多条件查询。可按姓名查询、按班级查询(分班);按某学科(含总分)某分数段查询;按班内名次(年级名次)段查询(如某班前XX名、年级前XX-XX名)等,各种查询条件还可自由组合。对查询结果,可按某关键字排序后显示,如按班级排名升序可组合出某班全部或班前XX名、年级前XX名排名等,按年级排名升序可组合出年级前XX名排名或全部排名等。窗口如图12。
http://s5/mw690/001LTkQegy71Jdoxiza64&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图12
代码:
.UsedRange.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheet2.Range("M1:Q2"), copytorange:=.Range("A2"), unique:=False '高级筛选
If OptionButton3
Then
ElseIf OptionButton2 Then
End If
运行结果:
http://s14/mw690/001LTkQegy71JdpvwD3ad&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图13
五、打印
各项统计表册生成完毕后,由于是每个科目或班级一张表,需要将这些表作为一个组才能一次性打印,而且可以选择打印部分科目或班级,否则操作比较麻烦,有违简洁高效的目的,因此,在打印和预览上,在界面用两个ListBox列表框提供选择需打印的工作簿及相应的工作表,程序智能根据不同的表格设置页面,当然也可以在界面更改页面设置,以适应打印输出。然后根据界面上的数据设置工作表页面,再对这些表利用数组一次性选择输出打印和预览。打印窗口如图14所示。
http://s7/mw690/001LTkQegy71JdqCWH4e6&690VBA编程进行成绩分析统计" TITLE="巧用Excel
图14
代码:
For i = 0 To Me.ListBox2.ListCount - 1
Next
Worksheets(ArrSht).PrintOut
到此,VBA编写的考试成绩统计分析程序初步完成,加上稍许美化和容错处理,如图15所示,一个高效简洁的成绩统计程序就完成了。
图15
参考文献:
罗刚君,EXCEL 2010 VBA编程与实践 北京:电子工业出版社,2010.12