APP下载

基于Excel VBA的考试管理系统设计

2022-08-01

扬州职业大学学报 2022年2期
关键词:场次监考姓名

蒋 勇

(扬州职业大学, 江苏 扬州 225009)

考试的编排是学校教学管理中的常规工作。以往的考试编排都是教学管理人员在Excel表格中手工输入各种考试信息,不但数据量大,而且工作效率低下,有时还会出现监考人员在同一场次考试中重复编排的问题。VBA是VB语言的一个子集, VBA内嵌在Office的各应用程序中,如Word、 Excel、 Access等,其程序的编写和运行都以这些程序为平台。VBA在Excel中的应用最为广泛,可以让复杂的工作简易化,减少不必要的重复性工作,提高工作效率。

1 设计思路

本系统以Excel程序作为系统平台。在新建的Excel工作薄中新建五个表格,分别命名为“监考安排表”“监考安排表总表”“教师监考表”“学生监考表”“基本设置表”。

“监考安排表”的功能是在此表中完成同一场次一门或多门考试课程的监考编排。“监考安排表总表”是存放不同场次同一阶段考试的汇总表,它是生成教师和班级监考表的数据总表。“教师监考表”和“学生监考表”是由“监考安排表总表”自动生成的教师个人和班级的监考记录。“基本设置表”存放编排监考表必要的基本信息,如班级名称和班级人数、教室编号和座位数、课程名称、教师编号和可以参加监考的教师姓名等。其流程图如图1所示[1-2]。

图1 系统生成流程

2 同一场次考试信息的模块设计

同一场次考试信息模块是考试编排的第一步,通过选择考试的时间、教室、班级和课程一次性生成同一门课程的所有考试班级的考试安排表,并将其传送到“监考安排表”中。在日期控件和四个文本框中确定考试的时间后,再选定考试的课程,课程的选择只能在复合框选择一门课程,该功能模块只能一次安排同一门课程的多个班级,如需要安排其他课程,则再次运行该模块即可,如图2所示。

图2 考试时间、课程、班级、考场选定模块

其代码如下[3]。

Private Sub CommandButton1-Click()

Dim i%, j%, Acolm%

t=0

If ComboBox1.Value="" Then

MsgBox "请选择考试课程"

Else

For i=0 To ListBox1.ListCount-1

Acolm=Application.CountA(Sheets("监考安排表").Range("A2:A65536"))+1

For j=0 To ListBox2.ListCount-1

If ListBox1.Selected(i) Then

If ListBox2.Selected(j) Then

With Sheets("监考安排表")

.Cells(Acolm+1, 1)="'" & Left(DTPicker1.Value, 8)

.Cells(Acolm+1, 2)="'" & Right(DTPicker1.Value, 3)

.Cells(Acolm+1, 3)=TextBox1+":"+TextBox2+"—"+TextBox3+":"+TextBox4

.Cells(Acolm+1, 4)=ListBox1.List(i, 0)

.Cells(Acolm+1, 5)=ListBox1.List(i, 1)

.Cells(Acolm+1, 6)=ComboBox1.Value

.Cells(Acolm+1, 7)=ListBox2.List(j, 0)

End With

End If

End If

Next

Next

End If

End Sub

3 确定监考教师模块的设计

第二个功能模块是在“监考安排表”中确定同一场次的监考教师。本系统有两种方式来确定监考教师,一是由教学管理人员人为选定,另外一种方式是系统随机生成监考人员。在同一场次的监考教师确定完成后,就可将其内容传送到“监考安排表总表”后再安排其他场次考试的编排。重复上述操作,直到同一阶段所有考试课程的编排完成[4-5]。

3.1 人为指定监考教师代码

本模块先安排同一场次需要监考教师的人数的一半,在可参与监考教师的列表框中选择参与监考的教师。选定后点击“手动安排监考1教师”按钮,所选教师将自动填充到监考安排表的监考教师列表中,列表框中已选过的教师将自动移除。然后再在列表框中选择另一半监考教师,点击“手动安排监考2教师”按钮即可。

其代码如下:

Private Sub CommandButton3-Click()

Dim i As Integer

n=ListBox1.ListCount-1

For i=0 To n

If ListBox1.Selected(i)=True Then

With Sheets("监考安排表")

.Cells(.Range("H65536").End(xlUp).Row+1, 8)=ListBox1.List(i)

End With

End If

Next

'------将已经导入的监考老师姓名从列表框中移除

For j=ListBox1.ListCount-1 To 0 Step-1

If ListBox1.Selected(j)=True Then

ListBox1.RemoveItem (j)

End If

Next

Call 统计未安排监考教师数

End Sub

3.2 系统随机生成监考教师

该模块是在“监考安排表”中对同一场次的监考教师进行随机安排,要事先在“基本设置”表中确定能够参加本次监考的教师姓名,并重新编号,将不能参加监考的教师姓名移动到旁边单元格中。

由于每个考场正常需要2名监考教师,系统根据“监考安排表”同一场次安排的考场数,产生2倍于考场数的随机数,产生的每一个随机数和“基本设置”表中可参加监考教师列前的序号进行对比,如果随机数和序号相同则将这位教师的姓名复制到“监考安排表”的“监考教师1”列中,对“监考安排表”中的H列“监考教师1”和I列“监考教师2”进行随机分配,为了减少代码的复杂性,先采用了将同一场次监考教师先全部生成在“监考教师1”中,然后再将生成和监考教师的后面一半通过剪切和复制方法,将姓名复制到“监考教师2”中。

其代码如下:

Private Sub CommandButton2-Click()

Dim rngs As Range

Dim xuhao, k, i, s As Integer

Dim arr() As String

grow=Sheets("基本设置表").Range("G65536").End(xlUp).Row '---返回可参加监考教师列人数

arow=Sheets("监考安排表").Range("A65536").End(xlUp).Row '--返回监考考场数

k=0

Randomize (Time)

With Sheets("监考安排表")

s=(arow-1)*2

Do While k < s

xuhao=Int((grow-1) * Rnd)+1 '---根据基本设置表中可监考教师人数产生随机数

For Each rngs In Sheets("基本设置表").Range("G2:G" & grow) '------遍历基本设置表教师序号列

If rngs=xuhao Then '------产生随机数和基本设置表中可监考教师的序号进行比对如果相同

.Cells(k+2, 8)=rngs.Offset(, 1) '----基本设置表中可监考教师的姓名赋给监考安排表从第2行8列开始

End If

Next

k=k+1

Loop

'---------------将一列监考老师改为两列监考老师-----------------

hrow=Sheets("监考安排表").Range("H65536").End(xlUp).Row

Range("H" & ((hrow-1)/2+2) & ":" & "H" & hrow).Select

Selection.Cut

Range("I2").Select

ActiveSheet.Paste

End With

End Sub

4 教师监考表和班级考试安排表功能模块设计

第三模块是在“监考安排表总表”基础上,生成教师个人监考记录和班级的考试安排表。

以往教师或学生查阅监考安排时,一般都是看监考总表,由于表格中信息没有规律可循,有时会漏看本人的信息,造成教学事故。本模块为了方便教师和学生查阅教师本人或学生本班级监考信息,将全部的监考场次在“教师监考表”和“班级监考表”中分别形成新记录,然后分别按教师姓名和班级名称的字母读音顺序排列,记录中将一些和监考任务无关的信息去除。教师的监考表只有教师的姓名、监考时间、教室、班级和课程这5个信息,教师本人所有监考场次都集中在一起,在“教师监考表”就可以查看本人所监考的所有场次。班级的监考表也是同样原理。点击“监考安排总表”中“生成教师监考表”按钮,即可在“教师监考表”中生成以教师姓名排序的监考记录。

其代码如下(以教师监考表为例):

Private Sub CommandButton1-Click()

Application.ScreenUpdating=False

Dim zbArow, jsArow As Integer

Dim rngI, rangJ As Range

zbArow=Sheets("监考安排总表").Range("A65536").End(xlUp).Row

With Sheets("教师监考表")

For Each rngI In Sheets("监考安排总表").Range("I2:I" & zbArow)

Acol=Application.CountA(Sheets("教师监考表").Range("A1:A65536"))+1

.Cells(Acol, 1)=rngI

.Cells(Acol, 2)=rngI.Offset(,-7)

.Cells(Acol, 3)=rngI.Offset(,-6)

.Cells(Acol, 4)=rngI.Offset(,-4)

.Cells(Acol, 5)=rngI.Offset(,-2)

Next

For Each rngJ In Sheets("监考安排总表").Range("J2:J" & zbArow)

Acol=Application.CountA(Sheets("教师监考表").Range("A1:A65536"))+1

.Cells(Acol, 1)=rngJ

.Cells(Acol, 2)=rngJ.Offset(,-8)

.Cells(Acol, 3)=rngJ.Offset(,-7)

.Cells(Acol, 4)=rngJ.Offset(,-5)

.Cells(Acol, 5)=rngJ.Offset(,-3)

Next

jsArow=.Range("A65536").End(xlUp).Row

.Sort.SortFields.Clear

.Sort.SortFields.Add Key:=Range("A2:A" & jsArow),-

SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

.Sort.SortFields.Add Key:=Range("B2:B" & jsArow),-

SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

End With

'-------------------对生成记录按教师姓名进行排序------------------------

With Worksheets("教师监考表").Sort

.SetRange Range("A1:E" & jsArow):.Header=xlYes:.MatchCase=False

.Orientation=xlTopToBottom:.SortMethod=xlPinYin:.Apply

End With

5 结语

教学管理人员使用本系统来编排监考表,工作效率有了很大提高,减少了大量重复信息的输入,节省了编排时间。自动生成的教师监考表和班级监考表,更方便教师和学生查阅。

猜你喜欢

场次监考姓名
监考时……
演唱会
西安监考老师上门送考后就地隔离
这哪里是怀疑学校,分明是不信任孩子
“慢病防治健康行”三年直接受益12万人
地铁观影指南
小记者档案
一年级语文上册期末测试
第一单元综合模拟测试卷
找朋友