巧用Excel VBA 快速编排考场座位
【摘要】科学的考场座位编排方法可以从根本上杜绝学生考试时的串通舞弊现象,保证考试的公平、公正及其严肃性。本文结合自己的工作经验,利用Excel VBA编程方法轻松实现了同级各班考生随机排座、且前后左右座位不是同班同学,打印考场座位表、桌贴等功能。经实际应用,操作简单,方便实用。
【关键词】随机排座;考场编排;座位表;桌贴;VBA数组
在编排考场时,既要基于学校实际,如需考虑各考场人数、组数、每组人数等出现差异,充好利用好每一个考场;还要让同级各班考生被重新随机排序后基本均匀地散布到各个考场,基本做到同一考场内同一班的考生前后左右均不相邻,从根本上杜绝学生考试时的串通舞弊现象,保证考试的公平、公正及其严肃性。随着学校办学规模逐渐扩大和学生人数的增加,考场编排的工作量不断加大。面对Excel工作表内动辄上千的数据行,通过手工多次排序和复制粘贴数据完成考场编排工作显然太麻烦了。那么,能不能用相对比较简单的办法来解决问题呢?答案显然是肯定的。
Excel是微软公司的Microsoft office的组件之一,它可以进行各种数据的处理、统计分析,在学校工作中有着广泛的应用。例如花名册、座位表、登分表等的电子文档都是使用它来创建的。Excel不仅具有强大的制表功能,同时还内置了系统开发工具VBAVBA是指Visual Basic for Application,它是在Office中广泛应用的宏语言,可以直接对Excel对象进行编程,从而提高Excel的利用效率。使用它可以增强Excel的自动化能力,使用户更高效地完成特定任务。因此,笔者空闲时用VBA编了个程序,轻松快速地编排考场,生成考场座位表、桌贴等,经实际应用,操作简单,方便实用。
一、考场编排
在中高考中各考场人数一般是30人,但基于笔者学校的实际,会出现各考场人数各异、组数各异及每组人数各异的情况。因此,编排考场前,工作人员必须将考生花名册(必须含班级)录入花名册工作表,考场基本信息(必须含考场号、各组人数等)录入考场设置工作表中,如下图所示。
花名册工作表
考场设置工作表
编排考场时,为保证考生既要随机分布,又要均匀分布,在程序设计上多次使用了随机编排。
(一)、班级内部考生的随机编排。程序在G列(辅助列)对学生生成一次随机数,再以班级和随机数为关键字段进行排序,实现班级内学生顺序的随机性。
代码:
Randomize (Timer)        '初始化随机数生成器
For x = 2 To Sht2R          '花名册行循环
    Cells(x, "G") = Rnd    'G列写入随机数
vba排序函数sort用法Next x
Worksheets("花名册").UsedRange.Sort Key1:="班级", Order1:=xlAscending, Key2:= "随机数", Order2:=xlAscending, Header:=xlYes, Orientation:=xlSortColumns    '排序
运行结果如下图:
(二)、各班人数均匀分配到各考场。程序自动从《花名册》及《考场设置》工作表获取班级人数、考生总人数及考场人数后,按比例取整的方式计算各班在各考场分配的人数,公式:各班在各考场分配的人数=班级人数*(考场人数/考生总人数)。再因取整余下的考生作二次分配。
代码:为提高程序运行速度,程序将各工作表数据读入VBA数组中处理。
For x = 2 To UBound(ArrKC, 1) '考场号循环
    j = j + 1 '考场号列号
For i = 2 To UBound(RenShuFenPei, 1)    '班级循环
RenShuFenPei(i, j) = Val(ArrBJ(i, 2)) * Val(ArrKC(i,9)) \ Val(ArrTJ(2, 2))    '按比例分配考生——班级人数*(考场设置的人数/考生总人数)
    Next i
Next x
人数分配结果如下图:
(三)、编排考场号。获得各班在各考场的人数后,对各班每考生按分配的人数编考场号,对二次分配考生编上"座位" & vbTab & "100"(键盘无法输入vbTab,可防错)。
代码:
m = 0
ArrSht2= Worksheets("花名册").UsedRange.Value '读入数组处理数据
For x = 2 To Sht2R    'x某班第一个考生行号
    k = 0
    '按分配人数按班编考场号***********
For x1 = 2 To UBound(RenShuFenPei, 1)    '班级循环
    If ArrSht2(x, Sht2BJL) = RenShuFenPei(x1, 1) Then '班级名相同
            For y = 2 To UBound(RenShuFenPei, 2)    '考场循环
                For j = 1 To Val(RenShuFenPei(x1, y))  '该班x1该考场y分配的人数
                        ArrSht2(x + k + j - 1, Sht2L + 2) = RenShuFenPei(1, y) '考场号
                    ArrSht2(x + k + j - 1, Sht2L + 3) = j + Rnd '座位号(辅助列,处理前后同班)
                Next j
                k = k + Val(RenShuFenPei(x1, y)) '该班已编排的人数
            Next y
            Exit For
        End If
    Next x1
    '*********************************
  '该班剩余考生编辅助考场号*************
    Do While k < Val(RenShuFenPei(x1, 2))    '(班级人数)该班未编考场号人数循环

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。