教师备考宝典(25):Excel自动生成准考证号

软件世界

  VBA(Visual Basic For Application),是Microsoft Office中内嵌的开发工具,它在结构上与VB非常相似。它可以在Word、Excel等软件中运行,还可以在它们之间传递参数,实现自动化的操作。在Excel中,利用VBA可以非常灵活地控制整个操作过程。以下是笔者利用VBA解决实际问题的一个例子,希望能起到抛砖引玉的作用。

  一、任务要求

  用Excel中的VBA编排准考证号。条件:有来自15个不同单位的450人参加文化考试,考场设15个考室,每个考室30人,按照“7887”排列。准考证号编排的要求是:每个考生的前后左右都不得为同单位人员。使用VBA编写的程序能够自动生成准考证号,对考生座位进行快速编排,而且这种排列将是随机的,每次都完全不一样。

  二、准备工作

  新建一个Excel文件,取名“文化考试考场编排.xls”。将各单位的参考人员名单都复制到该文件中,将工作表名由“Sheet1”改为“文化考试人员名单”。在该表的左侧插入3列,列字段分别为“准考证号”、“序号”、“单位代号”。用拖动的方法在“准考证号”列中依次填入“20030001”到“20030450”(图1)。

  三、编程思路

  Step1:打散考生的排列顺序。这就好比洗牌,用Rnd函数产生一个包含1~450的无重复随机数列,输入到“序号”列中,实现过程如下:

  Dim RndNumber, TempArray(449), i As Integer

  Randomize (Timer) '初始化随机数生成器

  For i = 0 To 449 '产生包含1-450的无重复的随机数列

  TempArray(i) = i

  Next i

  For i = 449 To 0 Step -1

  RndNumber = Int(i * Rnd)

  '在“序号”列中输入这些数字,第一个考生在第七行(456-i=449-i+7)

  Cells(456 - i, 3) = TempArray(RndNumber) + 1

  TempArray(RndNumber) = TempArray(i)

  Next i

  Step2:用Sort方法来排序,即按照序号从小到大的顺序排列整个名单:

  Range(“C7:M456”).Select '按序号列从小到大排列名单

  Selection.Sort Key1:=Range(“C7”), Ord

  er1:=xlAscending, Header:=xlNo, Orientatio

  n:=xlTopToBottom

  其中Key1指定“序号”列为第一个排序字段,Order1:=xlAscending表示对 Key1 按升序排序;Header:=xlNo表示应对整个区域进行排序;Orientation:=xlTopToBottom指排序将从上到下(按行)进行。

  Step3:考室的编排:将所有考试人员每30个为一组,450人正好15组,即15个考室。对每个考室分别进行编排。方法是先产生一个包含30个数的无重复随机数列,并将考生的“单位代号”字符串按这个数列的顺序存入一个数组中,然后利用这个数组判断该数列是否符合要求。如第一考室中,前后方向的1号和2号、2号和3号……29号和30号不能相同,左右方向的1号和8号、2号和9号……23号和30号不能相同。如果有一处相同,则重新产生一个新的无重复随机数列,再次进行判断,循环往复直到符合条件为止(图2)。

  四、源程序

  用Visual Basic控件工具在表中适当的地方画一个按钮,将该按钮的Caption属性设为“开始编排”,“名称”属性取默认值为“CommandButton1”。双击该按钮,打开Visual Basic编辑器,在代码窗口中输入源程序。最后,回到“文化考试人员名单”表中,退出设计状态,单击按钮运行程序,很快就可以完成一次编排。源程序如下(此处刊登初始化源代码,完整代码请在文末所给链接下载):

  '文化考试准考证号编排程序,Excel2000/2002/2003中运行通过。

  Option Explicit

  Private ExamRoom As Integer '变量ExamRoom用来指定考室

  Private Sub CommandButton1_Click()

  Call arrange

  Range(“A3”).Select

  MsgBox “全部编排完毕!”

  End

  End Sub

  '编排整个考场

  Sub arrange()

  Dim RndNumber, TempArray(449), i As Integer

  Randomize (Timer) '初始化随机数生成器

  For i = 0 To 449 '产生包含1~450的无重复的随机数列

  TempArray(i) = i

  Next i

  For i = 449 To 0 Step -1

  RndNumber = Int(i * Rnd)

  '在“序号”列中输入这些数字,第一个考生在第七行(456-i=449-i+7)

  Cells(456 - i, 3) = TempArray(RndNumber) + 1

  TempArray(RndNumber) = TempArray(i)

  Next i

  Range(“C7:M456”).Select '按序号列从小到大排列名单

  Selection.Sort Key1:=Range(“C7”), Order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom

  For ExamRoom = 1 To 15 '对15个考室逐个进行考号编排

  Call examroom_arrange

  Next ExamRoom

  End Sub

  编后语:当本期《电脑报》出来的时候,中小学迎来了一年两次的期末考试,“教师备考宝典”也将暂时告一段落。在一个多月的时间里,我们和广大读者朋友一起参与了试卷制作、成绩统计、准考证自动生成等,如果我们的宝典能对各位教师朋友的工作有所帮助,那就让小编们心满意足了。在今后,我们还将继续关注教育行业的软件应用,将更多更好的文章奉献给大家。

  代码下载地址:http://www.cpcw.com/25/ksbh.txt