ppt VBA 实现随机抽题
目标/最终效果
目标是制作一个ppt,实现随机抽题,具体描述:
- 第一页幻灯片中:点击开始按钮后,右边的文本框快速滚动 显示随机数字;点击停止按钮后,滚动停止,抽取到的题号会显示到第二个文本框中,并append到第三个文本框的内容中;然后点击跳转按钮,会跳转至相应题目的幻灯片。
- 跳转题目幻灯片后,点击返回键,可返回到第一页幻灯片继续抽题。
- 第一页幻灯片中,重置按钮将清除所有文本框的内容。



PS:本文适合具有一定编程基础的读者。
最终效果链接:https://pan.baidu.com/s/1C9gmVtLDvTbOOYabEqVlng 提取码:hxt7
注意应将文件保存为.pptm(启用宏)形式。
关于VBA
- VBA,即Visual Basic for Application,是一种程序设计语言,集成在某个具体应用软件中(比如最常用的是Excel VBA,我们将Excel称为宿主应用程序)。
- VBA与VB(Visual Basic):在开发环境、基本语法、支持的对象和属性和方法等都十分相似。不同之处在于,VBA代码需要宿主应用程序的支持,因此只能与宿主应用程序一起使用,不能使用VBA创建独立运行的应用程序。
- VBA与宏:一组VBA指令的集合形成了宏,宏能够自动执行宿主应用程序的功能,实现一次性完成多项操作,或,扩展现有功能。
- ppt VBA:= VBA的基础语法 + ppt对象模型。对于本文目标任务的实现来说,可以不掌握ppt对象模型。不过这里仍然给出完整的学习框架,供有兴趣的读者拓展:
【拓展】以Excel VBA为例说明VBA的学习框架:
VBA简单示例
首先介绍命令按钮控件的简单示例,通过本部分,读者应掌握:
- 如何创建控件、设置属性。
- 熟悉VBA编辑器。
- 一个控件对某个动作的响应函数的编写。
- 运行。
检查环境
- 版本:office 最新版 PowerPoint (其它版本或者WPS或许也行)
- 开发工具:看看顶部有没有“开发工具”菜单。没有的话,在“文件”——“选项”——“自定义功能区”——勾选“开发工具”

VBA编辑器:检查能否正常调出VBA编辑器
- 法一:快捷键alt + F11
- 法二:“开发工具”——“宏”——随便输入一个宏名,点击创建。
- 看能否正常调出如下的VBA编辑器。若不能调出,弹窗提示错误(内存溢出啥的),很可能是你之前安装过WPS,请参考这篇博客修改注册表。

步骤
- 创建控件:“开发工具”——选择“命令按钮控件”——在幻灯片上画出控件。 (还有很多其它类型的控件,请自行探索)

编辑控件属性:右键点击画出来的丑陋控件——“属性表”。
- “(名称)”属性:这个控件的名字,编程时用到,建议用英文认真命名,这里使用hello_btn。
- “Caption”属性:命令按钮控件显示的文字。
- 另,调整样式时,建议选择“按分类序”,请自行探索如何改变控件的字体大小、前景背景颜色、对齐方式等。
编写控件响应函数:双击控件,或,右键——“查看代码”,从而调出VBA编辑器(也可直接按快捷键 alt+F11)。
- 双击选择所在幻灯片,这里是slide8
- 选择控件名称,这里是hello_btn
- 选择控件响应的事件,这里是单击事件click
- 然后会自动生成函数头尾,我们需要在中间补充函数的内容

Private Sub hello_btn_Click()
'单引号表示注释,与C语言的//含义相同
Dim str As String 'Dim 变量名 As 数据类型,能声明一个变量,常用数据类型为Integer和String
str = "hello world"
MsgBox str 'MsgBox是消息框函数,这里实现了将弹出消息框并显示"hello world"的功能
End Sub
运行方法:放映幻灯片,点击按钮,就会弹窗显示"hello world"。或者,在VBA编辑器中,直接按F5运行。
VBA实现随机抽题
- 创建4个命令按钮控件,命名为start_btn, stop_btn, jump_btn, reset_btn。创建3个文本框控件,命名为rolling_num_text, result_num_text, done_nums_text。编辑控件属性,加入一些提示性文本框。
- 创建具体题目的幻灯片,注意添加返回到首页的按钮(插入某个形状,然后右键设置超链接)。复制得到7个这样的幻灯片,表示有7道题。
- VBA中编写4个函数:start_btn_Click、stop_btn_Click、jump_btn_Click、reset_btn_Click:
'全局变量
Dim n As Integer, stop_flag As Boolean
Private Sub start_btn_Click()
stop_flag = False
n = 7 '初始化,觉得还是放在一个init初始化函数里比较好...
stop_btn.Enabled = True '使stop按钮有效
Dim a As Integer
Randomize '初始化Rnd函数的随机数字生成器, 为其提供一个新的种子值。可按F1键查看函数解析。
Do
a = Fix(Rnd * n + 1) 'a是[1,n]的随机整数。Fix函数返回数字的整数部分;Rnd函数没有参数,返回[0,1)的小数。
rolling_num_text.Text = a
result_num_text.Text = ""
DoEvents '交出控制权,以便操作系统能够处理其它事情
If stop_flag = True Then
Exit Do '退出循环,相当于break
End If
Loop
End Sub
Private Sub stop_btn_Click()
result_num_text.Text = rolling_num_text.Text
done_nums_text = done_nums_text + result_num_text + " "
stop_btn.Enabled = False '使stop按钮无效
stop_flag = True
End Sub
Private Sub jump_btn_Click()
Dim temp As Integer
temp = result_num_text.Text + 1
ActivePresentation.SlideShowWindow.View.GotoSlide Val(temp)'GotoSlide切换到指定的幻灯片
End Sub
Private Sub reset_btn_Click()
rolling_num_text.Text = ""
result_num_text.Text = ""
done_nums_text.Text = ""
End Sub
todo challenge
- 抽题时,自动过滤已经抽过的题目。
- 需要使用数组(清空、插入、索引等操作)
- 抽题时,还能选择题目的类型,比如从3类中选择1类。
- 法一:使用选择按钮控件。
- 法二:添加文本框,可输入题目类别号。
- 链接excel与ppt,实现“只需编辑excel相关数据,即快速创建ppt相应的题目幻灯片”。题库excel中,题目类型、每类型的题目数量、题目内容字符串,都只需在excel中改动。
- 需要熟知excel和ppt的对象模型,然后学习如何链接excel与ppt
参考链接:
随机抽题、链接excel与ppt、VBA基础语法、MS官方文档是个宝
快捷键小结:
alt+F11打开VBA编辑器、F5运行、F1在浏览器打开 光标定位处 的帮助文档
ppt VBA 实现随机抽题的更多相关文章
- PHP实现类似题库抽题效果
PHP实现类似题库抽题效果 大家好,我顾某人又回来了,最近学了一点PHP,然后就想写个简单小例子试试,于是就写了一个类似于从题库抽题的东西,大概就是先输入需要抽题的数量,然后从数据库中随机抽取题目. ...
- HTML + JS随机抽号。
[设置第三次抽取的号码为 (张三6)]<script language="javascript"> var k = 0 ; function star(){ k++ ; ...
- bzoj 3837 (随机过题法了解一下)
3837: [Pa2013]Filary Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 395 Solved: 74[Submit][Status] ...
- B4010 菜肴制作 拓扑排序(附随机跳题代码)
今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不 ...
- 实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例) 1.namedtuple:命名元组,可以创建一个没有方法只有属性的类 from collections import namedtup ...
- 提取PPT文件中的Vba ProjectStg Compressed Atom。Extract PPT VBA Compress Stream
http://msdn.microsoft.com/en-us/library/cc313106(v=office.12).aspx 微软文档 PartI ********************* ...
- PPT vba从Execl 拷贝图表
在PPT 需要引用Execl的COM组件 Dim wkb As Workbook Sub Change() Set wkb = Workbooks.Open("D:\D2_月报基础数据.xl ...
- 【BZOJ3837】[Pa2013]Filary 随机化神题
[BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时 ...
- 软件工程课程作业(一)—20道随机四则运算题(C++)
一.编程思想: 1.定义所需要变量2.设置数组,存储运算符,3.通过随机函数random(0,100)找出运算数,random(0,4)找出运算符4.通过输出显示运算式. 二.源代码: //2016 ...
随机推荐
- Beego 学习笔记15:布局页面
页面布局 1> 一个html页面由:head部分,body部分,内部css,内部js,外联css,外联的js这几部分组成.因此,一个布局文件也就需要针对这些进行拆分. 2> ...
- ES6 字符串&正则表达式
目录 第二章 字符串和正则表达式UTF-16码位codePointAt()方法String.fromCodePoint()方法normalize()方法正则表达式u修饰符其他字符串变更字符串中的字串识 ...
- setsockopt()函数使用
closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket BOOL bReuseaddr=TRUE; setsockopt (s,SOL_SOCKET ,SO ...
- Python 集合(Set)、字典(Dictionary)
集合(Set) 集合是无序的,无序也就没有索引,不能进行索引相关的操作.无序,python解释器就不能通过索引(位置)区分集合中的相同元素,所以集合中不能有相同的元素. 集合用大括号{ }表示. 集 ...
- SpringBoot学习<二>——SpringBoot的默认配置文件application和多环境配置
一.SpringBoot的默认文件appliction 上一篇文章已经说明,springboot启动会内嵌tomcat,端口也是默认的8080,如果我们想要改变端口如果做呢? 在springboot项 ...
- 浅谈Python设计模式 - 建造者模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 建造者模式 当我们想要创建一个由多个部分构成的对象,而且他们的构建需要一步接一步 ...
- centos7.5 安装java11
jdk的下载地址如下: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 第一 ...
- Linux操作系统内核编译之NTFS文件系统模块支持案例
Linux操作系统内核编译之NTFS文件系统模块支持案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内核编译概述 单内核体系设计.但充分借鉴了微内核设计体系的优点,为内核引 ...
- 关于子类和父类中的this的用法
public class Demo { public static void main(String[] args) { Fu f = new Zi(); f.show(); } } class Fu ...
- mysql的docker版本,如何通过docker run定制服务器选项
一般用的是My.cnf文件. 如果要图省事呢? 以下的命令可供参考. 特别是--character-set-server=utf8 --collation-server=utf8_general_ci ...
