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

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

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.mzph.cn/news/887820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读书分享(二)| 心智的成熟之旅

概述 人生苦难重重(承认这一现实,就不会这么痛苦了。在苦这个事儿上,人人生而平等。苦中作乐才是人生的使命)规避问题和逃避痛苦的趋向,是人类心理疾病的根源。只有心智成熟的人,才有能力改变人生。我们唯…

vue3中如何设置路由,使浏览器可以访问组件?

文章目录 1. 安装 vue-router2. 创建路由模块3. 在 main.js 中使用路由4. 注意 1. 安装 vue-router 首先,如果还没有安装 vue-router,需要在项目目录下通过命令行进行安装。假设你的项目是基于npm管理包的,使用以下命令安装: npm…

LVS-DR工作模式简介(相对nat性能更高)

LVS-DR工作模式简介(相对nat性能更高)1.工作原理:共享ip修改mac(保证识别回包的mac地址)共享ip:虚拟网卡接口lo修改mac:内核参数在这种模式下,LVS调度器(也称为Director)和后端真实服务器(Real Server)都配置有相同的V…

Libevent库-http通信不同请求方式的处理

做项目的时候用到了http通信&#xff0c;同事用libevent库写的&#xff0c;特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…

qt QToolBox详解

1、概述 QToolBox是Qt框架中的一个控件&#xff0c;它提供了一个带标签页的容器&#xff0c;用户可以通过点击标签页标题来切换不同的页面。QToolBox类似于一个带有多页选项卡的控件&#xff0c;但每个“选项卡”都是一个完整的页面&#xff0c;而不仅仅是标签。这使得QToolBo…

跨UI发送信号

如何自定义信号 1.使用signals声明 2.返回值是void 3.在需要发送的地方使用 emit 信号名字(参数); 进行发送 4.在需要链接的地方使用connect进行链4 接 signals:void sig_addOne(int value); connect(&dlg,&SetDialog::sig_addOne,[](int value){ui->lineEdit…

【LeetCode每日一题】——189.轮转数组

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【解题思路】九【时空频度】十【代码实现】十一【提交结果】 一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 189.轮转数组 四【题目描述】 …

Spring Boot英语知识网站:架构与开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

java-分而治之算法

分而治之&#xff08;Divide and Conquer&#xff09;算法是一种解决问题的策略&#xff0c;它将一个复杂的问题分解成若干个相同或相似的子问题&#xff0c;递归地解决这些子问题&#xff0c;然后将它们的解合并以解决原始问题。这种算法通常用于排序、搜索、数学计算等领域。…

Mac 系统上控制台常用性能查看命令

一、top命令显示 在macOS的控制台中&#xff0c;top命令提供了系统当前运行的进程的详细信息以及整体系统资源的利用情况。下面是对输出中各个字段的解释&#xff1a; Processes: 483 total: 系统上总共有483个进程。 2 running: 当前有2个进程正在运行。 481 sleeping: 当前有…

捉虫笔记(七)-再探谁把系统卡住了

捉虫笔记&#xff08;七&#xff09;-再探谁把系统卡住 1、内核调试 在实体物理机上&#xff0c;内核调试的第一个门槛就是如何建立调试链接。 这里我选择的建立网络连接进行内核调试。 至于如何建立网络连接后续文章再和大家分享。 2、如何分析 在上一篇文章中&#xff0c;我们…

C++设计模式-享元模式

动机(Motivation) 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中&#xff0c;从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时&#xff0c;让外部客户程序仍然能够透明地使用面向对象的方式来进行操作…

SpringBoot(四十三)SpringBoot集成xxl-job分布式任务调度平台

这里我来记录一下Springboot项目集成xxl-job分布式任务调度平台及使用的过程。 一:xxl-job介绍 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 xxl-job是一个开源的分布式定时…

Rook入门:打造云原生Ceph存储的全面学习路径(下)

文章目录 六.Rook部署云原生CephFS文件系统6.1 部署cephfs storageclass6.2 创建容器所需cephfs文件系统6.3创建容器pod使用rook-cephfs提供pvc6.4 查看pod是否使用rook-cephfs 七.Ceph Dashboard界面7.1 启用dashboard开关7.2 ceph-dashboard配置外部访问7.3 Dashboard web ad…

java:aqs实现自定义锁

aqs采用模板方式设计模式&#xff0c;需要重写方法 package com.company.aqs;import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;…

Centos 使用宝塔安装mysql详细步骤

安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh输入y 2直接在网页访问下载安装3.安装mysql 如图 输入 mysql -u root -p 然后输入密码 密码如何可以设置默认有一个可以直接用修改密…

电动工具领域可推荐的一些调速控制电路,运算放大器芯片等相关型号

电动工具调速控制电路芯片 GS069&#xff1a;该芯片是专门为电动工具调速控制而设计的芯片&#xff0c;通过调节电机的转速&#xff0c;满足不同工作场景下对电动工具转速的需求&#xff0c;从而实现诸如钻孔、拧紧螺丝等不同操作的速度控制. 运算放大器芯片 D8541/2&#xff…

ZooKeeper 基础知识总结

先赞后看&#xff0c;Java进阶一大半 ZooKeeper 官网这样介绍道&#xff1a;ZooKeeper 是一种集中式服务&#xff0c;用于维护配置信息、命名、提供分布式同步和提供组服务。 各位hao&#xff0c;我是南哥&#xff0c;相信对你通关面试、拿下Offer有所帮助。 ⭐⭐⭐一份南哥编写…

MySQL 用户与权限管理

MySQL 是一种广泛使用的关系型数据库管理系统,支持多用户访问和权限控制。在多用户环境下,数据库安全至关重要,而用户和权限管理是数据库管理中最基础也是最重要的一部分。通过合理地创建和管理用户、分配和管理权限、使用角色权限,可以有效地保护数据库,确保数据的安全性…

玩转 Burp Suite (1)

内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard&#xff08;仪表盘&#xff09;1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target&#xff08;目标&#xff09;1. SIte Map &#xff08;站点地图&#xff09;2. Scope&#xff08;范围&#…