【VBA实战】使用Word制作简易的考试及阅卷系统

devtools/2024/11/30 12:20:01/

这个事源于公司想简化面试流程,希望能通过一些简单的笔试及自动阅卷来提高对候选人的初步筛选工作的效率和准确性。我当时的想法是这样的:

1. 利用AI工具生成一个笔试题库,只要选择题和填空题

2. 利用VBA工具,根据需求自动从题库里抽取响应的题目,生成试卷

3. 答完试卷后,能自动进行阅卷打分

我花了差不多半天时间,做了一个小Demo来验证这个思路。不过这个事后来“夭折”了,因为稍微调研一下就知道,现在已经有很多成熟的可以帮你生成试卷并自动阅卷的考试系统了,而且收费也不贵,确实是用不上用Word来做这样一个简陋的系统。但是Demo做都做了,那就放出来,供有需要的朋友参考。

先看看运行效果:

简易考试系统

后续可以在考卷文件里加一个倒计时,并从题库里随机抽题,在做一些界面美化。这得看心情。

实现这个系统主要用到了Word的控件功能,在这里:

代码比较简单。这块稍微说一下阅卷的逻辑,我的试题其实是以表格的形式存储的,如下图:

我在生成试卷的时候,将对应试题答案的表格行列号存到了内容控件的Tag里,这样在阅卷的时候,只需要读取相应内容控件的Tag,解析出答案所在单元格的表格序号和行列号,然后读取题库中的答案和试卷上的答案进行对比就好了。

生成试卷的核心代码如下:

Private Sub GenTest_Click()Dim cc As ContentControlDim post, level, time, cnum, jnum As StringDim rootPath As StringrootPath = ActiveDocument.PathFor Each cc In ActiveDocument.ContentControlsIf cc.Title = "Post" Thenpost = cc.Range.TextElseIf cc.Title = "Level" Thenlevel = cc.Range.TextElseIf cc.Title = "Time" Thentime = cc.Range.TextElseIf cc.Title = "ChoiceNum" Thencnum = cc.Range.TextElseIf cc.Title = "JudgeNum" Thenjnum = cc.Range.TextEnd IfNext ccDim quesDoc, newDoc As DocumentSet quesDoc = Documents.Open(rootPath + "\Database\" + "C++\" + "0" + ".docx")Set newDoc = Documents.Add()newDoc.ActivateSelection.TypeText "选择题(共" + cnum + "道)" + Chr(13)For i = 2 To CInt(cnum) + 1Selection.TypeText quesDoc.Tables(1).Cell(i, 1).Range.TextSelection.TypeText "答案:"Set cc = newDoc.ContentControls.Add(wdContentControlDropdownList)cc.Tag = "1," + CStr(i)cc.DropdownListEntries.Add "A"cc.DropdownListEntries.Add "B"cc.DropdownListEntries.Add "C"cc.DropdownListEntries.Add "D"Selection.MoveRight wdCharacter, 2Selection.TypeText Chr(13) + Chr(13)Next iSelection.TypeText "判断题(共" + cnum + "道)" + Chr(13)For i = 2 To CInt(jnum) + 1Selection.TypeText quesDoc.Tables(2).Cell(i, 1).Range.TextSelection.TypeText "答案:"Set cc = newDoc.ContentControls.Add(wdContentControlDropdownList)cc.Tag = "2," + CStr(i)cc.DropdownListEntries.Add "对"cc.DropdownListEntries.Add "错"Selection.MoveRight wdCharacter, 2Selection.TypeText Chr(13) + Chr(13)Next iquesDoc.ClosenewDoc.Protect wdAllowOnlyFormFields, False, "tianta"newDoc.SavenewDoc.CloseEnd Sub

阅卷的核心代码如下:

Sub CheckPaper()Dim rootPath As StringrootPath = ActiveDocument.PathDim dlgOpen As FileDialogSet dlgOpen = Application.FileDialog( _FileDialogType:=msoFileDialogOpen)With dlgOpen.ShowEnd WithDim paperDoc, quesDoc As DocumentSet paperDoc = Documents.Open(dlgOpen.SelectedItems(1))'paperDoc.Unprotect "tianta"Set quesDoc = Documents.Open(rootPath + "\Database\" + "C++\" + "0" + ".docx")paperDoc.ActivateDim cc As ContentControlDim all, right, wrong As IntegerFor Each cc In paperDoc.ContentControlsall = all + 1res = cc.Range.TextposArr = Split(cc.Tag, ",")i = CInt(posArr(0))j = CInt(posArr(1))ans = Left(quesDoc.Tables(i).Cell(j, 2).Range.Text, 1)If res = ans Thenright = right + 1Elsewrong = wrong + 1End IfNext ccMsgBox "共" + CStr(all) + "题" + Chr(13) + "做对" + CStr(right) + "题" + Chr(13) + "做错" + CStr(wrong) + "题" + Chr(13) + "得" + CStr(right / all * 100) + "分"paperDoc.ClosequesDoc.CloseEnd Sub

完整工程代码可以从这里下载:https://download.csdn.net/download/lc19890709/90025102


http://www.ppmy.cn/devtools/138190.html

相关文章

海康面阵、线阵、读码器及3D相机接线说明

为帮助用户快速了解和配置海康系列设备的接线方式,本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口,其功能设计包括电源输入、光耦隔离信号输入输出…

力扣--LCR 150.彩灯装饰记录II

题目 代码 if(root null){ return new ArrayList<>(); } Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();queue.add(root);while(!queue.isEmpty()){int k queue.size();List<Integer> …

网络安全之渗透测试(Penetration Testing for Network Security)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

技术模板纪要

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; openAI 的 GPT 大模型的发展历程。 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 例如&#xff1a; 在语言模型中&#xff0c;编码器和解码器…

51-基于单片机的智能语音识别与处理系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;搞L298N驱动两个电机转动&#xff0c;然后搞LCD1602显示屏&#xff0c;弄个超声波传感器实时检测距离 通过LCD1602显示距离&#xff0c;如果距离小于阈值&#xff0c;则两…

ssh的隧道连接(端口映射)

SSH 隧道&#xff08;SSH tunneling&#xff09;的命令&#xff1a;用于将本地计算机的端口与远程服务器上的端口进行映射 命令&#xff1a; ssh -L 本地端口:localhost:服务器端口 -p 22 用户名服务器ip ssh: 表示使用 SSH 协议连接远程服务器。 -L 8501:localhost:8501: 这部…

RocketMQ 常见面试题解析

一、RocketMQ 基础概念 1、什么是 RocketMQ&#xff1f; RocketMQ 是一款开源的分布式消息中间件&#xff0c;由阿里巴巴团队开发&#xff0c;后捐赠给 Apache 软件基金会。它具有高性能、高可靠、高实时性等特点&#xff0c;适用于大规模分布式系统中的异步通信、流量削峰、数…

删除word中页眉里的横线

使用快捷键‌简单粗暴&#xff1a; 双击页眉&#xff0c;将光标定位在页眉的横线上&#xff0c;按下CtrlShiftN快捷键&#xff0c;页眉横线即可删除。