运用VBA技术完美解决PPT交互式单选试题的设计
wptr33 2025-09-29 13:38 15 浏览
大家好,因为家里近期发生了点事情,所以很久没有更新头条作品,在这里跟各位粉丝说声抱歉。在昨天的微头条里,我预先给大家通知了我潜心准备的一个重磅级的头条作品。说实在的,为了这个作品,我在工作之余断断续续花了几天的时间,也废了很多功夫,真正的可以说实属不易。
还好,昨天将这个作品完美收关。说道这里,肯定很多粉丝非常好奇究竟是个什么作品呢?既然说到点子上了,我不卖关子地告诉大家,它就是关于在PPT试题课件中实现强力交互问题。如何强力交互?大家看我分享作品的过程就知道了。
这个作品呢,包含五大类试题类型:单选题、多选题、判断题、填空题、简答题等等。因为每个大题都有着缜密的知识技术,所以,我们准备分五次一个一个类型来分享,便于大家容易接受这些技术。好了,我们先来分享第一种类型的交互式单选试题课件设计,希望大家喜欢哦!
单选题在日常学习中也非常重要,但是在PPT中进行课件式的制作在设计上并不难,难就难在单选后的得分情况、选择与否等情况的呈现。既然很多朋友都用PPT制作展示课件式的文档,根据PowerPoint是Office的组件,我们则可以充分利用其后台强大的VBA开发技术实施Office前端的有效控制,从而实现强大的交互效果。好了,可能大家等不及了吧,下面我们现在即刻为各位分析设计过程。希望大家认真阅读哦!
一、交互式单选题试题PPT课件前端界面设计
首先是插入必要的文本框作为每小题的题干展示,然后是在【开发工具】功能选项卡面板里找到单选按钮,插入9个单选按钮,最后插入一个命令按钮。如下图所示
同时,修改命令按钮必要的属性。如下图所示
二、交互式单选题试题PPT课件后台功能代码实现
(一)模块1的实现代码
Sub OnSlideShowPageChange() '演示文档放映时即刻触发的事件
'如果当前播放的演示文档的幻灯片显示窗口的预览下,当前的显示定位为第一张幻灯片时,做一次初始化试题工作(这样就避免了每张幻灯 _
片跳变都要执行无谓的浪费资源式的初始化工作)
If ActivePresentation.SlideShowWindow.View.CurrentShowPosition = 1 Then
Initialize_Choice '调用选择题选择题的初始选择状态
End If
End Sub
Sub Initialize_Choice() '初始化选择题的为未做任何选择状态
'单选题初始化
Dim ctr_single As Shape 'ctr_single为ActiveX控件(特别注意的是:PowerPoint幻灯片上面的控件皆作为图形的形式访问,要访问这 _
些“图形”式的ActiveX控件的属性必须采用“图形对象.OLEFormat.Object.属性”的形式进行)
singlechoice_aser_str_array = Array("A", "B", "C") '定义答案字符库数组
singlechoice_aser_str_array
little_subject_num = 0 'little_subject_num--统计试题小标题题目的个数
For Each shp In Slide1.Shapes
If InStr(shp.Name, "TextBox ") Then little_subject_num = little_subject_num + 1
Next
little_subject_num = little_subject_num - 1 'little_subject_num最终统计包含了试题大标题“一、单项选择题”,所以试题小标 _
题题目个数应该是必须减去1
'定义key_num_per_question为每个单项选择题的答案选项数目(间接获取数组上界+1)
key_num_per_question = UBound(singlechoice_aser_str_array) + 1
For k = 1 To little_subject_num 'k从1~little_subject_num道单选题的循环
'm、n分别为每一个选择题的答案选择项的起止
m = key_num_per_question * (k - 1) + 1
n = key_num_per_question * k
For i = m To n
Set ctr_single = Slide1.Shapes("OptionButton" & i)
ctr_single.OLEFormat.Object.Value = False '初始化所有答案选项为非选择状态
Next
Next
End Sub
Sub Single_Choice_Question() '单选题操作
'aswer--为暂存用户当前每题选择的答案,choice_result--几个题选择的结果,ctr_single为ActiveX控件(特别注意的是:PowerPoint _
幻灯片上面的控件皆作为图形的形式访问,要访问这些“图形”式的ActiveX控件的属性必须采用“图形对象.OLEFormat.Object.属性” _
的形式进行)
Dim aswer As String, choice_result As String, ctr_single As Shape
Dim select_key(0 To 2) As String '定义一个0~2下标范围的选择答案数组select_key
singlechoice_aser_str_array = Array("A", "B", "C") '定义答案字符库数组
singlechoice_aser_str_array
right_keys = Array("C", "A", "C") '定义并且初始化正确答案数组
aswer = "" '暂存用户当前每题选择的答案的变量,初始化为空
little_subject_num = 0 'little_subject_num--统计试题小标题题目的个数
For Each shp In Slide1.Shapes
If InStr(shp.Name, "TextBox ") Then little_subject_num = little_subject_num + 1
Next
little_subject_num = little_subject_num - 1 'little_subject_num最终统计包含了试题大标题“一、单项选择题”,所以试题小标 _
题题目个数应该是必须减去1
'定义key_num_per_question为每个选择题的答案选项数目(间接获取数组上界+1)
key_num_per_question = UBound(singlechoice_aser_str_array) + 1
For k = 1 To little_subject_num 'k从1~little_subject_num道题的循环
Unselected_Num = 0 '统计每小题未进行选择答案数目(判断是否每小题都未作任何选择的情况)
'm、n分别为每一个选择题的答案选择项的起止
m = key_num_per_question * (k - 1) + 1
n = key_num_per_question * k
For i = m To n
Set ctr_single = Slide1.Shapes("OptionButton" & i)
If
ctr_single.OLEFormat.Object.Value = True Then '如果当前控件访问的状态值为True(选中),则作如下选择的答案的在 _
singlechoice_aser_str_array数组中对应答案的下标获取存于t变量中
If i Mod key_num_per_question = 0 Then '如果当前每道题选择的答案单选钮控件序号对答案数目取余刚好为0,则直接将这个 _
答案数目赋予t
t = key_num_per_question
Else '否则,直接将余数赋予t
t = i Mod key_num_per_question
End If
aswer =
singlechoice_aser_str_array(t - 1) '获取选择的答案字符
select_key(k - 1) = aswer '同时将这个答案字符存于每题的选择答案数组中select_key
Else
Unselected_Num = Unselected_Num + 1 '每小题未进行单选答案数目统计
End If
Next
If Unselected_Num = key_num_per_question Then select_key(k - 1) = "[未进行单选]"
choice_result = choice_result & select_key(k - 1) & Space(1)
Next
right_key_num = 0 '定义并初始化一个正确答案数量变量right_key_num,初始化为0
For i = 0 To UBound(right_keys) '该循环是将所有题正确的答案从数组中转出类串联,同时统计正确的答案数量
r_key_str = r_key_str & right_keys(i) & Space(1) '将所有题正确的答案从数组中转出串联
If select_key(i) = right_keys(i) Then
right_key_num = right_key_num + 1 '统计正确的答案数量
End If
Next
r_key_str = Left(r_key_str, Len(r_key_str) - 1) '去掉尾部多余的空格
right_key_rate = "您选择的正确率为【" & Round(100 * right_key_num / (UBound(right_keys) + 1), 1) & "%】"
'以下即是间隔选择结果字符串、正确答案字符串、正确率字符串进行串接,然后显示
choice_result = "第1~" & little_subject_num & "道单项选择题您选择的答案分别是:" & Left(choice_result, Len(choice_result) - 1)
right_answers = "正确答案是:" & r_key_str
total_result = choice_result & Chr(10) & right_answers & Chr(10) & right_key_rate
MsgBox total_result, vbInformation, "答案揭晓"
End Sub
(二)Slide1里的必要代码
Private Sub Display_SingleChoince_Result_Btn_Click()
Single_Choice_Question '调用单选题操作过程
End Sub
三、交互式单选题试题PPT课件运行测试
(一)按<F5>键,进入演示文档放映状态。如下图
(二)未进行任何试题的单选时,直接点击<查看单选的结果和答案>按钮,将呈现无任何单选选择的结果状态。如下图
(三)只进行部份试题的单选时,点击<查看单选的结果和答案>按钮,将呈现部份单选选择的结果状态。如下图
(四)进行全部试题的单选后,点击<查看单选的结果和答案>按钮,将呈现全部单选选择的结果状态。如下图
四、本期技术小结
(一)特别注意的是:PowerPoint幻灯片上面的ActiveX控件皆作为图形的形式访问,要访问这些“图形”式的ActiveX控件的属性必须采用“图形对象.OLEFormat.Object.属性”的形式进行)
(二)用UBound(数组名)函数探测数组上界的方式智能获取每题的选项数目
(三)巧妙为每一个选择题的答案选择项的起止作定位。如下截图所示
(四)运用正确答案数组和单选结果答案数组比对判定得分率
好了,我们本期的内容就分享到这里,希望大家好好体味,之后我会退出对于该作品对应的头条视频,也请大家多多关注哦!
最后,还是非常感谢大家不离不弃地关注我,希望大家继续关注(头条号:跟我学Office高级办公)、推广和点评!也请大家持续关注我的下一期关于多选题的交互式作品的推出哦!
相关推荐
- 什么是Java中的继承?如何实现继承?
-
什么是继承?...
- Java 继承与多态:从基础到实战的深度解析
-
在面向对象编程(OOP)的三大支柱中,继承与多态是构建灵活、可复用代码的核心。无论是日常开发还是框架设计,这两个概念都扮演着至关重要的角色。本文将从基础概念出发,结合实例与图解,带你彻底搞懂Java...
- Java基础教程:Java继承概述_java的继承
-
继承概述假如我们要定义如下类:学生类,老师类和工人类,分析如下。学生类属性:姓名,年龄行为:吃饭,睡觉老师类属性:姓名,年龄,薪水行为:吃饭,睡觉,教书班主任属性:姓名,年龄,薪水行为:吃饭,睡觉,管...
- java4个技巧:从继承和覆盖,到最终的类和方法
-
日复一日,我们编写的大多数Java只使用了该语言全套功能的一小部分。我们实例化的每个流以及我们在实例变量前面加上的每个@Autowired注解都足以完成我们的大部分目标。然而,有些时候,我们必须求助于...
- java:举例说明继承的概念_java继承的理解
-
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物,同理,...
- 从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比
-
前情回顾前面两天我们重点调研了了一下Cursor的原理和Cursor中一个关键的工具edit_file的实现,但是其他CodingAgent也需要稍微摸一下底,看看有没有优秀之处,下...
- 学会这几个插件,让你的Notepad++使用起来更丝滑
-
搞程序开发的小伙伴相信对Notepad++都不会陌生,是一个占用空间少、打开启动快的文件编辑器,很多程序员喜欢使用Notepad++进行纯文本编辑或者脚本开发,但是Notepad++的功能绝不止于此,...
- 将 node_modules 目录放入 Git 仓库的优点
-
推荐一篇文章Whyyoushouldcheck-inyournodedependencies[1]...
- 再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测
-
“再熬一年,90%的程序员可能再也用不着写for循环。”凌晨两点半,王工还在公司敲键盘。他手里那份需求文档写了足足六页,产品经理反复改了三次。放在过去,光数据库建表、接口对接、单元测试就得写两三天。现...
- git 如何查看stash的内容_git查看ssh key
-
1.查看Stash列表首先,使用gitstashlist查看所有已保存的stash:...
- 6万星+ Git命令懒人必备!lazygit 终端UI神器,效率翻倍超顺手!
-
项目概览lazygit是一个基于终端的Git命令可视化工具,通过简易的TUI(文本用户界面)提升Git操作效率。开发者无需记忆复杂命令,即可完成分支管理、提交、合并等操作。...
- 《Gemini CLI 实战系列》(一)Gemini CLI 入门:AI 上命令行的第一步
-
谷歌的Gemini模型最近热度很高,而它的...
- deepin IDE新版发布:支持玲珑构建、增强AI智能化
-
IT之家8月7日消息,深度操作系统官方公众号昨日(8月6日)发布博文,更新推出新版deepin集成开发环境(IDE),重点支持玲珑构建。支持玲珑构建deepinIDE在本次重磅更...
- 狂揽82.7k的star,这款开源可视化神器,轻松创建流程图和图表
-
再不用Mermaid,你的技术文档可能已经在悄悄“腐烂”——图表版本对不上、同事改完没同步、评审会上被一句“这图哪来的”问得哑口无言。这不是危言耸听。GitHub2025年开发者报告显示,63%的新仓...
- 《Gemini CLI 实战系列》(五)打造专属命令行工具箱
-
在前几篇文章中,我们介绍了GeminiCLI的基础用法、效率提升、文件处理和与外部工具结合。今天我们进入第五篇...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
如何将AI助手接入微信(打开ai手机助手)
-
SparkSQL——DataFrame的创建与使用
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
redission YYDS spring boot redission 使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
-
- 什么是Java中的继承?如何实现继承?
- Java 继承与多态:从基础到实战的深度解析
- Java基础教程:Java继承概述_java的继承
- java4个技巧:从继承和覆盖,到最终的类和方法
- java:举例说明继承的概念_java继承的理解
- 从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比
- 学会这几个插件,让你的Notepad++使用起来更丝滑
- 将 node_modules 目录放入 Git 仓库的优点
- 再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测
- git 如何查看stash的内容_git查看ssh key
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)