基于Excel VBA的讲课竞赛抽签系统设计与实现
- 格式:doc
- 大小:18.50 KB
- 文档页数:5
【原创】ExcelVBA实现不重复、多次抽奖⼩程序在活动中,我们常会有抽奖,抽奖箱准备繁琐,现在多采⽤线上抽奖⽅式,下⾯⽤Excel VBA写了⼀个简单的抽奖⼩程序简单测试效果如下,可实现:多次抽奖,且每次抽奖都不重复抽奖界⾯滚动⼈员信息,点击抽奖按钮锁定中奖⼈员中奖⼈员信息在右侧公⽰区域展⽰,最新中奖⼈员展⽰在最上⽅设置了⼀部分误点、误操作提⽰,以及抽奖完成提⽰等已优化,⽀持万⼈级抽奖做了⼀个抽奖简单演⽰,演⽰GIF如下:实现代码如下,按需⾃取,转载请备注出处:'申明Flag、d、e三个模块变量,跨进程引⽤,实现滚动和抽奖数据传递Dim Flag As Boolean '屏幕停⽌滚动并抽奖的判断参数Dim d As Object '将随机抽取的中奖⼈员按⾃增键储存Dim e As Object '将随机抽取的中奖⼈员按原键储存Dim dict_id As Object '本轮参与抽奖⼈员⼯号Sub 重置()'清空上次抽奖内容,将⼈员名单复制到辅助列Application.ScreenUpdating = False '屏幕刷新禁⽤,不展⽰清空数据过程Sheets("抽奖界⾯").SelectSheets("抽奖界⾯").Range("E2") = 0Sheets("抽奖界⾯").Range(Range("B6"), Range("F15")).ClearContentsSheets("抽奖界⾯").Range(Range("J3"), Range("P3").End(xlDown)).ClearContentsSheets("⼈员名单").SelectSheets("⼈员名单").Range(Range("H3"), Range("H3").End(xlDown)).ClearContentsSheets("⼈员名单").Range(Range("A3"), Range("A3").End(xlDown)).Copy _Sheets("⼈员名单").Range("H3")Sheets("抽奖界⾯").SelectApplication.ScreenUpdating = True '屏幕刷新开启,为滚动抽奖做准备End SubSub 准备() '准备开始抽奖,灰⾊区域滚动更新中奖⼈员Set d = NothingSet e = NothingSet dict_id = NothingFlag = Truetext_level = Sheets("抽奖界⾯").Range("A2") '抽取奖项lottery_target = Sheets("抽奖界⾯").Range("D2") '抽奖次数⽬标'判断该奖项是否已经抽取过,当变更了抽取奖项时,⾃动重置已抽取次数为0If Application.WorksheetFunction.CountIfs(Sheets("抽奖界⾯").Range("J:J"), _text_level) = 0 ThenSheets("抽奖界⾯").Range("E2") = 0End If'判断剩余参与⼈数是否⾜够抽奖If Sheets("抽奖界⾯").Range("F2") < Sheets("抽奖界⾯").Range("C2") ThenMsgBox ("剩余参与⼈数不⾜,请修改抽奖参数或停⽌抽奖")Exit SubEnd If'判断该奖项是否已抽取完,提⽰操作⼈员是选择加抽还是变更抽奖奖项If Sheets("抽奖界⾯").Range("E2") >= lottery_target ThenQS_Return = MsgBox(text_level & "抽奖" & lottery_act & "已完成!" & _Chr(10) & "要变更奖项请选择是" & Chr(10) & "要再次抽取" & text_level & _"请选择否", vbYesNo + vbQuestion, "提⽰")If QS_Return = vbYes ThenMsgBox (text_level & "请重新选择奖项,输⼊抽奖次数和单次抽奖⼈数!")Exit SubElseSheets("抽奖界⾯").Range("D2") = Sheets("抽奖界⾯").Range("D2") + _Sheets("抽奖界⾯").Range("E2")End IfEnd If'清空抽奖滚动区域Sheets("抽奖界⾯").Range(Range("B6"), Range("F15")).ClearContentsnum_agent = Sheets("抽奖界⾯").Range("F2")'字典赋值Set dict_id = CreateObject("Scripting.Dictionary")For i = 1 To num_agentdict_id(i) = Sheets("⼈员名单").Cells(i + 2, 8)Nextnum = Sheets("抽奖界⾯").Range("C2")'持续滚动抽奖界⾯,等待点击抽奖后停⽌DoSet d = CreateObject("Scripting.Dictionary")Set e = CreateObject("Scripting.Dictionary")For j = 1 To numDoa = Int(Rnd * num_agent) + 1Loop Until Not e.Exists(a)d(j) = dict_id(a)e(a) = dict_id(a)NextFor m = 1 To 10For n = 1 To 5If n + (m - 1) * 5 > num ThenExit ForElseSheets("抽奖界⾯").Cells(m + 5, n + 1) = d(n + (m - 1) * 5)DoEvents '将控制权传给操作系统,实现滚动的同时可以点击抽奖按钮,⾮常关键 End IfNextNextLoop Until Flag = FalseEnd SubSub 抽奖()If Not Flag ThenMsgBox ("请先点击准备按钮,再开始抽奖")Exit SubEnd IfFlag = False '停⽌抽奖滚动,中奖⼈员确定Set f = CreateObject("Scripting.Dictionary")text_level = Sheets("抽奖界⾯").Range("A2")Sheets("抽奖界⾯").Range("E2") = Sheets("抽奖界⾯").Range("E2") + 1 '已抽取次数+1lottery_act = Sheets("抽奖界⾯").Range("E2") '已抽取次数,后⾯需要判断是否提⽰抽奖完成num = Application.WorksheetFunction.CountA(Sheets("抽奖界⾯").Range("B6:F15"))num_exist = Sheets("抽奖界⾯").Range("G2")'将新中奖⼈员信息添加⾄公⽰区域末尾For i = 1 To numSheets("抽奖界⾯").Cells(2 + num_exist + i, 10) = text_levelSheets("抽奖界⾯").Cells(2 + num_exist + i, 11) = lottery_actSheets("抽奖界⾯").Cells(2 + num_exist + i, 12) = d(i)Sheets("抽奖界⾯").Cells(2 + num_exist + i, 13) = _Application.WorksheetFunction.VLookup(d(i), Sheets("⼈员名单").Range("A:E"), 2, False)Sheets("抽奖界⾯").Cells(2 + num_exist + i, 14) = _Application.WorksheetFunction.VLookup(d(i), Sheets("⼈员名单").Range("A:E"), 3, False)Sheets("抽奖界⾯").Cells(2 + num_exist + i, 15) = _Application.WorksheetFunction.VLookup(d(i), Sheets("⼈员名单").Range("A:E"), 4, False)Sheets("抽奖界⾯").Cells(2 + num_exist + i, 16) = _Application.WorksheetFunction.VLookup(d(i), Sheets("⼈员名单").Range("A:E"), 5, False)Next'将所有中奖⼈员存放⾄字典For i = 1 To num_exist + numIf i <= num Thenf(i) = Sheets("抽奖界⾯").Range(Cells(num_exist + i + 2, 10), _Cells(num_exist + i + 2, 16))Elsef(i) = Sheets("抽奖界⾯").Range(Cells(i + 2 - num, 10), Cells(i + 2 - num, 16))End IfNextSheets("抽奖界⾯").Range(Cells(3, 10), Cells(num_exist + num + 3, 16)).ClearContentsSheets("抽奖界⾯").[J3].Resize(f.Count, 7).Value = _Application.Transpose(Application.Transpose(f.items))'奖项抽取完成后提⽰⼈员变更参数If lottery_act = Sheets("抽奖界⾯").Range("D2") ThenMsgBox (text_level & "抽取" & lottery_act & "次已完成,请变更抽奖奖项和次数")End If'更新待抽奖⼈员名单,实现不重复抽奖num_agent = Sheets("抽奖界⾯").Range("F2")Application.ScreenUpdating = False '屏幕刷新禁⽤,不展⽰清空数据过程Sheets("⼈员名单").SelectFor Each Key In edict_id.Remove (Key)NextSheets("⼈员名单").Range(Range("H3"), Range("H3").End(xlDown)).ClearContentsSheets("⼈员名单").[H3].Resize(dict_id.Count, 1).Value = _Application.Transpose(dict_id.items)Sheets("抽奖界⾯").SelectApplication.ScreenUpdating = True '屏幕刷新开启,为下⼀轮滚动抽奖做准备End Sub功能实现思路:通过随机函数Rnd产⽣[0,1)的随机数,再乘以当前参与⼈数放⼤,实现随机抽奖通过字典的Exists⽅法判断是否重复,实现去重抽奖定义模块变量,实现⼈员滚动和抽奖的分离DoEvents语句将控制权传给操作系统,实现滚动的同时可以点击抽奖按钮,是实现抽奖屏幕滚动更新的关键最初以遍历的⽅式回填数据,发现参与⼈数上万时明显卡顿,改⽤字典的items⽅法回填数据(⼀维数据回填到列:Application.Transpose(dict.items),⼆维数据回填到列:Application.Transpose(Application.Transpose(dict.items)))。
基于EXCEL二次开发的比赛评分系统的设计与实现摘要:针对目前系统的高技术和高要求,文章探讨了基于Excel,配合VB、PowerPoint实现二次开发设计的比赛评分系统,可实现调阅选手情况、评判分数,统计奖项,与比赛情况同步采用多媒体技术演示结果等功能。
快捷、高效地解决了学院在举办“校园歌手大奖赛”中的评分过程混乱,统分时间过长,评委、选手和观众等不能及时知晓比赛结果等难题。
让学生在学习当中始终充满成就感和探索精神,变被动学习为主动学习,变盲目学习和有目的学习,具有一定的理论研究和实用价值。
关键词:Excel 平台设计系统实现[中图分类号] G423 [文献标识码] A [文章编号] 1000-7326(2012)05-0135-02一、开发背景:本文根据广西水利电力职业技术学院《计算机应用基础》、《数据库应用与开发》、《办公自动化》等课程实训环节而设计。
(一)任务描述:学校要举办一个歌唱比赛,请设计一个比赛评分系统,对参赛的选手进行评分。
(二)要求系统实现以下功能:1.系统能录入参赛人员资料;参赛选手按抽签序号依次比赛,统计最后得分;2.能够随时查阅选手得分情况;3.每位选手比赛结束后,显示得分排名情况;4.比赛结束后,能够快速准确地公布一、二、三等奖的得奖选手名单。
二、系统需求分析与系统可行性分析当前关于计算机方面的考试系统很多,其中既有单机版系统,也有网络版系统,有基于.Asp 等开发的,也有基于其他各种语言(如C语言)开发的。
单机版的一般无成绩导出、分析、汇集和统计等功能,不适合比赛中统一评判与成绩分析;而网络版的判分系统又需要服务器等较专业的技术支持,并且对带宽也有一定的要求,不方便推广使用。
随着信息技术的飞速发展,掌握Office办公系统软件操作的人越来越多,其中数据处理软件Excel不失为人们统计、管理数据的好帮手,大家对它并不陌生,如何从更高级的功能入手对它加以开发应用是非常有益的。
使用Excel设计竞赛评分系统使用Excel设计竞赛评分系统,输入各种基础分值之后,其他所有需要的结果立马自动显示出来,十分方便。
机关、学校、企事业单位都会举办各种竞赛活动,竞赛的评分如果采用纯手工方式进行处理,不仅速度慢,而且可能出现差错,很大程度影响竞赛活动的实际效果。
笔者运用Excel设计了一个评分系统,只要主持人把各评委的打分宣布完毕,工作人员同步进行分数录入,系统就会自动提示错误分值;自动将最高分、最低分分别用不同的颜色和字体进行区分显示;自动去掉最高分和最低分;自动计算每位选手的最后得分;自动生成参赛选手的得分名次;自动将得分较多的前三名用红色加粗字显示。
如果此系统采用多媒体投影设备显示,能使整个竞赛评分过程显得快捷、紧凑、公开、透明,很能烘托竞赛气氛。
此系统只要根据实际评委人数和选手数量稍加修改,即可广泛运用于各类竞赛活动的评分和统计。
设计步骤如下:一、新建竞赛评分系统新建“竞赛评分系统.xls”工作簿,C2:J2单元格中为各评委,B3:B12单元格中为各选手,K3:K12单元格为最后得分,L3:L12单元格为得分排名。
C3:K12为记分区,所有的分数录入均在此区域(图1)。
二、设置数据有效性如果评分标准为百分制,当录入数据不在此范围时,可采用“数据有效性”自动提示数据错误。
(1)用鼠标选择C3:K12数据录入的单元格。
(2)在“数据”菜单中,单击“有效性”。
(3)打开在“设置”选项卡,设置数据的有效范围(图2)。
(4)打开“出错警告”选项卡(图3,设置当录入数据超出设定范围时,弹出提示窗口的标题和内容。
三、显示最高、最低分录入评委打分后,使用“条件格式”,通过字体和颜色,能将最高分、最低分与其他分值区别显示。
(1)使用鼠标选择C3:J3单元格区域,选择菜单“格式→条件格式”命令,打开“条件格式”对话框(图4)。
(2)单击“条件1”下方的下拉箭头,在弹出的下拉列表中选择“公式”。
将最高分的条件格式公式设置为:“=MAX($C3:$J3)=C3”。
比赛抽签系统 c语言课程设计一、教学目标本节课的教学目标是使学生掌握比赛抽签系统的C语言编程方法。
知识目标为学生能够理解并运用C语言的基本语法、数据类型、运算符、控制结构等知识;技能目标为学生能够运用C语言实现比赛抽签系统的基本功能,提高其逻辑思维能力和编程能力;情感态度价值观目标为学生能够体验到编程的乐趣,增强其对计算机科学的兴趣和好奇心。
二、教学内容本节课的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构等知识,以及如何运用这些知识实现比赛抽签系统。
具体的教学大纲如下:1.C语言的基本语法和数据类型2.C语言的运算符和控制结构3.比赛抽签系统的需求分析和设计4.比赛抽签系统的C语言实现三、教学方法为了达到本节课的教学目标,我们将采用以下教学方法:1.讲授法:用于讲解C语言的基本语法、数据类型、运算符、控制结构等知识。
2.案例分析法:通过分析比赛抽签系统的案例,使学生理解并掌握如何运用C语言实现相关功能。
3.实验法:让学生动手编写比赛抽签系统的C语言程序,提高其编程能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C语言程序设计》2.参考书:《C语言编程实例解析》3.多媒体资料:比赛抽签系统的案例视频教程4.实验设备:计算机、编程环境(如Visual Studio、Code::Blocks等)通过以上教学资源的使用,我们将帮助学生更好地学习本节课的知识,提高其编程能力,并激发其对计算机科学的兴趣和好奇心。
五、教学评估本节课的教学评估将采用多元化的评价方式,以全面、客观、公正地评估学生的学习成果。
评估方式包括:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现,评估其对C语言知识的掌握和运用能力。
2.作业:布置相关的编程作业,评估学生对比赛抽签系统C语言实现的理解和编程能力。
3.考试:设置期末考试,涵盖C语言的基本语法、数据类型、运算符、控制结构等知识,以及比赛抽签系统的实现。
基于ExcelVBA的讲课竞赛抽签系统设计与实现基于Excel VBA的讲课竞赛抽签系统设计与实现[摘要] 通过组织讲课竞赛等形式不断提高青年教师教学能力,是高等院校确保人才培养质量稳步提升的重要保证。
在高校讲课竞赛等活动中,需要以公正、快捷、直观的方式对参加人员、讲课题目进行抽签,文章通过实例介绍基于Excel VBA设计讲课竞赛抽签系统的实现方法。
[关键词] VBA;讲课竞赛;抽签系统;洗牌算法doi :10 . 3969 / j . issn . 1673 - 0194 . 2016. 11. 112[中图分类号] TP317.3 [文献标识码] A [文章编号] 1673 - 0194(2016)11- 0187- 041 引言在高等院校中,提高青年教师教学能力是不断提升人才培养质量的重要保证。
组织以老带新、岗位练兵、讲课竞赛等形式的教学实践活动成为促进青年教师提高教学能力的有效手段。
在讲课竞赛活动中,如何保证分组抽签环节的公开、公正、透明,成为参赛人员关注的焦点。
由于通用抽签软件无法满足特定的抽签规则,对抽签数据格式和内容的具体需求存在差异,在解放军信息工程大学校2014年组织的青年教员讲课竞赛活动中,为了高效、公正、透明地进行抽签,自行开发了讲课竞赛抽签系统。
在全年度的竞赛活动中,抽签系统发挥了重要作用。
2 需求分析在比赛前,按照竞赛规则,全校各教研室所有符合条件的青年教员均列入参赛备选人员名单,每人准备数个讲课题目。
按照学科类别,将所有教研室分为4个大组,全年组织多轮次讲课比赛,每轮次从每组人员中抽取相同数量的选手参赛,讲课题目和出场顺序随机确定。
同时,为了确保青年教员广泛参与,需要实现全年每个教研室青年教员参赛比例和覆盖面基本相当。
在此规则下,抽签系统既要保证公平、公开,又须符合各项比例要求。
系统需要实现以下功能:(1)按组别抽选参赛选手和讲课题目。
(2)按教研室人员比例进行抽选。
66 •电子技术与软件工程 Electronic Technology & Software Engineering软件应用• Software Application【关键词】Excel VBA 抽签程序1 引言某卫生学校学生在护理技能操作模拟考试前先要进行抽签,根据学校规定的考试项目及题库试题数目抽取相应的题号进行操作考试,这项工作往年都是采用人工抽签,需要耗费很多的人力和时间,然而在抽签过程中难免会出现很多问题。
随着信息化技术的不断普及,学校工作也进入了由信息技术替代人工操作的改革性阶段,实现抽签过程信息化、自动化工作迫在眉睫,为此利用Excel 对数据的便捷性,VBA 对数据的交互性设计并实现了该抽签程序。
2 VBA技术Visual Basic for Applications(VBA)是Visual Basic 的一种新一代标准宏语言,与传统的宏语言不同,传统的宏语言不具有高级语言特征,没有面向对象的程序设计概念和方法,VBA 是以伪代码的形式运行的,它的功能主要通过模块来实现,同其他面向对象的编程语言一样,VBA 中也有对象、属性、方法和事件。
VBA 易于学习,可以使用宏记录用户的操作,并将其转换为VBA 程序代码,是工作自动化。
3 需求分析某卫生学校在期末进行护理技能操作考试前,每位参加考试的学生需要根据四项考试中题库的总数量随机抽取相应的题号,由于每项操作考试题库数都不相同,而每个班的学生数与总题库数也不相同,学生在随机抽取完一基于Excel VBA 抽签程序的设计与实现文/任宇宁项操作考试的总题库试题后,该题库重新开始轮询,需要实现前后两名学生生成的四组题号不能完全相同。
4 抽签程序设计与实现根据需求分析结果,考虑到该抽签程序的实用性和简洁性,使用Excel VBA 实现,分为前台界面和后台代码,前台界面上有抽签按钮,可使用鼠标点击抽签。
为方便学生抽签,也可以使用键盘上的空格键完成抽签。
不能正常运营。
更换主板比较复杂,一般不采用该项策略。
因此,掌握正确的维修策略是必要的。
导致主板故障的原因包括人为原因、环境因素、器件质量问题等。
要提高操作人员的综合素质,避免损坏接口和芯片等构件。
重视灰尘清理和打扫,确保周围环境良好。
选购质量良好的器材,保证主板器材质量合格。
日常工作中要注重检测和维护,及时发现和处理存在的缺陷,保证主板更好发挥作用。
2.2元件接触不良的维修接触不良也是常见的质量问题,周围环境影响、不当操作、设备老化等,都可能导致元件接触不良,具体又体现在芯片和内存条接触不良两个方面。
芯片接触不良表现为显示器正常工作,但不显示任何信息,启动时驱动器指示灯不亮,扬声器发出报警信号。
维修过程中,先切断主机电源,拆下可能存在问题的芯片,观看是否存在变形现象,是否有异物堵塞。
对存在的缺陷及时处理,如果没有问题再进行芯片安装。
内存条接触不良会导致启动时发出报警信号,维修时先将内存条拆下来,用橡皮擦拭除尘后再进行安装。
如果采取这些措施后仍然没有排除故障,则需要更换损坏的元件,让医疗设备更为有效的运营和发挥作用。
2.3硬件散热技术的维修设备散热性能不佳,往往会导致死机现象发生,影响设备使用寿命,并且还可能烧坏中央处理器,影响医院各项工作开展,对患者的诊断和治疗也会带来不利影响。
因此,应该重视设备散热工作,保证设备处于良好性能和运营状态。
例如,某设备工作一段时间后经常出现死机现象,按键也没有任何反应。
维修时触摸箱体感觉温度过高,然后打开机箱,发现散热片损坏停止活动。
对散热片更换之后,设备正常运行和工作。
为保证硬件散热性能良好,一般采用除尘、更换散热器等措施进行维修,确保设备综合性能良好。
2.4显示设备故障的维修常见问题为显示混乱,无显示等。
出现故障时,应该先确定是显卡问题还是显示器问题。
用同类型显示器代替原来的显示器,再开机检查。
如果显示器正常工作,证明原来的设备存在故障。
如果没有排除故障,则更换显卡,直至故障排除。
基于Excel VBA抽签程序的设计与实现作者:任宇宁来源:《电子技术与软件工程》2018年第11期摘要随着信息化技术的不断普及,人们对Excel软件的应用由单一的表格处理、函数计算、图表制作等逐渐向更高层次的人机交互、信息处理、程序设计转变。
本文就是利用Excel VBA技术对某卫生学校护士技能模拟考试学生抽签程序的设计与实现,在设计过程中实现了前台界面和后台代码的交互,完成了由传统人工抽签到计算机信息化抽签的改变,极大提升了备考的工作效率和准确性。
[关键词]Excel VBA抽签程序1 引言某卫生学校学生在护理技能操作模拟考试前先要进行抽签,根据学校规定的考试项目及题库试题数目抽取相应的题号进行操作考试,这项工作往年都是采用人工抽签,需要耗费很多的人力和时间,然而在抽签过程中难免会出现很多问题。
随着信息化技术的不断普及,学校工作也进入了由信息技术替代人工操作的改革性阶段,实现抽签过程信息化、自动化工作迫在眉睫,为此利用Excel对数据的便捷性,VBA对数据的交互性设计并实现了该抽签程序。
2 VBA技术Visual Basic for Applications(VBA)是Visual Basic的一种新一代标准宏语言,与传统的宏语言不同,传统的宏语言不具有高级语言特征,没有面向对象的程序设计概念和方法,VBA 是以伪代码的形式运行的,它的功能主要通过模块来实现,同其他面向对象的编程语言一样,VBA中也有对象、属性、方法和事件。
VBA易于学习,可以使用宏记录用户的操作,并将其转换为VBA程序代码,是工作自动化。
3 需求分析某卫生学校在期末进行护理技能操作考试前,每位参加考试的学生需要根据四项考试中题库的总数量随机抽取相应的题号,由于每项操作考试题库数都不相同,而每个班的学生数与总题库数也不相同,学生在随机抽取完一项操作考试的总题库试题后,该题库重新开始轮询,需要实现前后两名学生生成的四组题号不能完全相同。
基于Excel VBA的讲课竞赛抽签系统设计与实现
作者:周志军窦志强朱春晓
来源:《中国管理信息化》2016年第11期
[摘要] 通过组织讲课竞赛等形式不断提高青年教师教学能力,是高等院校确保人才培养质量稳步提升的重要保证。
在高校讲课竞赛等活动中,需要以公正、快捷、直观的方式对参加人员、讲课题目进行抽签,文章通过实例介绍基于Excel VBA设计讲课竞赛抽签系统的实现方法。
[关键词] VBA;讲课竞赛;抽签系统;洗牌算法
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2016. 11. 112
[中图分类号] TP317.3 [文献标识码] A [文章编号] 1673 - 0194(2016)11- 0187- 04
1 引言
在高等院校中,提高青年教师教学能力是不断提升人才培养质量的重要保证。
组织以老带新、岗位练兵、讲课竞赛等形式的教学实践活动成为促进青年教师提高教学能力的有效手段。
在讲课竞赛活动中,如何保证分组抽签环节的公开、公正、透明,成为参赛人员关注的焦点。
由于通用抽签软件无法满足特定的抽签规则,对抽签数据格式和内容的具体需求存在差异,在解放军信息工程大学校2014年组织的青年教员讲课竞赛活动中,为了高效、公正、透明地进行抽签,自行开发了讲课竞赛抽签系统。
在全年度的竞赛活动中,抽签系统发挥了重要作用。
2 需求分析
在比赛前,按照竞赛规则,全校各教研室所有符合条件的青年教员均列入参赛备选人员名单,每人准备数个讲课题目。
按照学科类别,将所有教研室分为4个大组,全年组织多轮次讲课比赛,每轮次从每组人员中抽取相同数量的选手参赛,讲课题目和出场顺序随机确定。
同时,为了确保青年教员广泛参与,需要实现全年每个教研室青年教员参赛比例和覆盖面基本相当。
在此规则下,抽签系统既要保证公平、公开,又须符合各项比例要求。
系统需要实现以下功能:
(1)按组别抽选参赛选手和讲课题目。
(2)按教研室人员比例进行抽选。
(3)参赛人员和讲课题目随机选定。
(4)抽中人员出场顺序随机确定。
(5)抽选结果填入表格即时打印。
(6)生成各组参赛选手基本信息表用于讲课竞赛工作用表。
3 设计思路
VBA是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。
也可说是一种应用程序视觉化的Basic 脚本。
Office软件中的Word、Excel、Access、Powerpoint都可以利用VBA使这些软件的应用效率更高。
VBA 不但继承了VB 的开发机制,而且VBA 还具有与VB 相似的语言结构,它们的集成开发环境IDE也几乎相同。
由于教员和选题信息是借助Excel 来完成,因此,在 Excel 文件中嵌入 VBA 程序即可直接实现随机抽签。
在数据准备阶段,需将所有教员、分组、课程、选题等信息汇总在一个统一的Excel表格中。
在每次抽选时根据教研室所在组别确定选题抽选范围,利用随机函数在抽选范围内随机确定选手和题目。
在抽选时需检测所抽选教员是否已在之前被选中过,不能重复抽选同一教员。
对检测通过的教员,标记当前教员本次已被抽选,避免后续抽选过程中被重复抽选。
为被选中教员利用随机函数确定出场顺序,抽选完成之后保存并显示抽选结果。
利用打印按钮对抽选结果信息表进行打印,各教学单位抽签代表签字确认,并同步将各组参赛选手基本信息和选题信息从总表中提取出来,生成参赛选手基本信息表用于讲课竞赛工作用表。
系统程序逻辑结构图如图1所示。
4 软件实现
4.1 程序界面
由于系统功能单一而明确,界面设计应立足实用,尽量简洁。
在系统界面上设置必备的选项和按钮。
选项用于选择抽选组别,按钮分别设置“抽签”、“重置”、“确定”、“打印”。
“抽签”按钮用于实现抽签功能;“重置”按钮用于重置各项参数,使抽签操作可重复;“确定”按钮用于确认抽签结果,将抽签结果汇总至表格,并提取抽中的教员和题目信息填入参赛选手基本信息表;“打印”按钮用于打印抽签结果表格,供抽签人员现场确认使用。
在按钮下方设置文本域,用于实时显示各组抽签结果,界面如图2所示。
4.2 主要功能实现
抽签的核心在于随机抽取教员和题目、随机确定出场顺序。
由于教员、课程、选题等信息汇总在一个Excel表中,随机抽取教员和题目即可通过随机选择表格行号来实现。
使用Randomize函数随机选择行号的实现是很简单的,关键点在于确定选择范围。
不同教员归属于不同的教研室,不同教研室分布在不同的组中。
使抽选结果符合抽选规则的过程便转化为使抽选范围符合竞赛规则的过程。
为了合理确定抽选范围,只需将备选信息汇总表依次按照分组、教研室、教员、课程、选题的顺序排序,便可按照抽选要求确定一个连续的行号范围作为抽选范围赋值给边界变量。
Private Sub confirmRange() '确定抽选范围
Dim i As Integer
totalT = 0'备选教研室选题总行数
startRow = 0'备选教研室选题起始行
For i = 2 To totalRow '从汇总表计算备选教研室jID抽选行号范围
If Cells(i, 20).Value = jID Then
totalT = totalT + 1
If totalT = 1 Then
startRow = i
Else
End If
Else
End If
Next i
End Sub
确定抽选范围后,即可随机抽选教员和选题:
confirmRange
Randomize
iRnd = Int(Rnd * totalT + startRow) '所抽选行号
进行冲突检测后,将iRnd行的教员、课程、选题信息等所需提取的信息赋予二维数组tInfo(x,y)的第二维变量。
选题信息抽选完毕后,需要对出场顺序进行随机,若直接使用随机数产生出场序号,可能会出现出场序号重复的情形。
因此,采用洗牌算法对出场顺序数组进行随机的方法实现。
Private Sub shuffle() '洗牌算法,随机出场顺序
Dim tmp As Integer
Dim i As Integer
Dim j As Integer
For i = 1 To gpTotal 'gpTotal为本组参赛人数
tOrder(i) = i
Next i
Randomize
For i = gpTotal To 1 Step -1
j = Int(Rnd*i) + 1
tmp = tOrder(j)
tOrder(j) = tOrder(i)
tOrder(i) = tmp
Next i
End Sub
对出场顺序随机洗牌之后将数组tOrder()的值顺序赋予tInfo(x,y)的第一维变量,再将tInfo(x,y)按照第一维变量值的顺序输出第二维变量的内容,即得到随机出场顺序后的抽签结果。
5 结论
本程序经过反复的修改和调试,运行结果达到了系统设计的目标。
以Excel作为数据源,既便于基础数据整理,又不需进行数据转换,开发调试效率可大大提高,运行效果直观明了。
VBA语法简单易学,基于Excel的VBA程序设计代码简洁、算法易懂,利用简单实用的工具便可高效快捷地实现开发需求。
使用VBA可以为Excel应用程序开发很多新的功能或增强已有的功能,也使得用户对各种数据的处理更加得心应手,大大提高工作效率。
实践证明,利用Excel软件和Excel VBA编程相结合,可高效解决很多日常工作中遇到的常见数据处理问题。
主要参考文献
[1]魏汪洋.Excel VBA语法速查手册[M].北京:化学工业出版社,2011.
[2]孙红梅. 巧用VBA编程实现电大毕业生照片的批量查找[J].福建广播电视大学学报,2014(1):85-88.
[3]门珮玉. 利用VBA编程搭建赛事自动计分系统[J].中国管理信息化,2014,17(20):87-89.。