如何用vba做答题、抽点类ppt
首先严重声明一下,我不是ppt高手,酷炫动画、美化之类一概不会,我只会写点代码,汇报ppt做得要多丑有多丑。
16年底,有幸拿到一份答题ppt模板,接手做了“XX知识问答竞赛”ppt,包含选题答题、倒计时、随机抽点等功能,初次接触到了VBA(Visual Basic for Applications)编程。
于是自那以后包办了单位各种答题类ppt……最近利用工作间隙又干了一票,感到是时候总结一下,把这项光荣而艰巨的任务传递下去了。
为了给ppt添加复杂功能,需要后台插入vba代码。下面整理一下为ppt插入、关联vba代码的基本流程,以及一些Bug的解决方法。
开发环境:Win10 x64,office 2016。
准备工作
显示“开发工具”
在菜单栏显示“开发工具”,方便后续开发。
打开ppt,点 文件->选项->自定义功能区,勾选“开发工具”。
选择引用库
当需要读写Excel时,需勾选引用库。
注意:随office版本不同,16.0可能会变成12.0等,更换版本时(比如拿office 2010做的拷到office 2016的电脑上用)需要正确勾选。
基本流程
插入形状
插入按钮
打开选择窗格,为对象命名(很重要!)
写代码
Private Sub CommandButton1_Click()
Shapes("shape_text").TextFrame2.TextRange.Text = "你好,VBA!"
End Sub
关联代码
也可以为任何形状关联一段代码。需把代码片段声明中的“Private”关键字去掉,比如:
Sub Show()
Shapes("shape_text").TextFrame2.TextRange.Text = "你好,VBA!"
End Sub
然后回到ppt页面,为形状关联代码:
运行代码
方式一,播放ppt运行代码:
方式二,在开发页面直接运行代码(常用于调试):
以上是ppt vba开发基本流程,下面附上部分代码。
部分关键代码
随机抽点:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'开始
Sub RandomStart()F = 0Do While TrueIf F = 1 Then Exit DocurrentQuestionNum = Int(num3_5 * Rnd)Shapes("lable_text").TextFrame2.TextRange.Text = question3_5(currentQuestionNum, 0)Sleep 20DoEventsLoop
End Sub'结束
Sub RandomStop()
F = 1
Shapes("shape_answer").Visible = msoTrue
End Sub
选题答题:
Sub chooseQuestion20(i As Integer)'题号消失Shapes(questionShape20(i)).TextFrame2.TextRange.Text = "" '出现"显示答案"按钮Shapes("shape_answer").Visible = msoTrue'显示题目currentQuestionNum = iShapes("lable_text").TextFrame2.TextRange.Text = question3_1(currentQuestionNum, 0)
End Sub
显示图片:
Shapes("pic1").Fill.UserPicture (ActivePresentation.Path & "\照片库\1.jpg")
各种疑难杂症
遇到过各种神奇的问题,网上对ppt vba方面问题解答较少,有些解决起来费了些功夫。
无法正常读取Excel
参考上文 “准备工作” “选择引用库” 。
出现“缺少Sub或Function”错误
这是在office2016上开发后,换到office2007电脑上运行报的错。
解决方法:尽量保持office版本一致,建议使用2010以上版本。
64位系统下,出现“类型不匹配”错误
从32位系统迁移到64位系统后,运行倒计时函数CreateTimer:
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As _Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _ByVal lpTimerFunc As Long) As LongPrivate Function CreateTimer(ByVal Interval As Long) As Long' 建立一个时间间隔为Interval微秒的定时器Dim tID As LongtID = SetTimer(0, 0, Interval, AddressOf TimerProc) '运行到此处出错CreateTimer = tID
End FunctionPrivate Sub TimerProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal idEvent As Long, ByVal dwTime As Long)' 此处放入要执行的代码CounterNumber
End Sub
出现以下错误:
解决方法:将SetTimer声明的最后一个参数类型改为LongPtr,即指针类型即可。
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As _Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _ByVal lpTimerFunc As LongPtr) As Long
结语
没有系统学过VB,但由于是类C语言,在有源码的支撑下,比葫芦画瓢拿来用并不费力,当时从最初接触到完成开发只用了一周时间。
但至今仍有许多未解决的疑惑,例如:
- 如何将被点击形状的名称作为参数,使其被VBA代码捕获。目前为每个形状关联不同的函数,50个形状就要写50个函数、改50个名称、关联50次……;
- 如何随页面载入自动运行某段函数。目前采用手动点击按钮的方式初始化。
上述问题可能在ppt vba中无解,也可能有更好的解决方法,欢迎交流。
如何用vba做答题、抽点类ppt相关推荐
- 论文画图-如何用Matlab做矢量图?PPT转PDF方法?
论文画图 Q:如何用Matlab做矢量图? A:介绍一种方法:在Matlab画好图后,在Figure里面另存为emf格式,粘贴到PPT中,然后转成PDF插入论文,可以保证是矢量图. Step 1: 在 ...
- 怎么把ppt文字大小设置一致_课件类PPT怎么做才好看?我修改了6页PPT,总结了7个技巧...
嗨,各位木友们好呀,我是小木. 不好意思,上周少发了一篇文章,原因是时间全用来准备今天这篇近三千字.图还巨多的超长教程了- 在写这篇教程之前,我发过一条朋友圈,询问了大家在制作课件类PPT时有什么痛点 ...
- 怎么把ppt文字大小设置一致_?课件类PPT怎么做才好看?我修改了6页PPT,总结了7个技巧...
嗨,各位木友们好呀,我是小木. 在写这篇教程之前,我发过一条朋友圈,询问了大家在制作课件类PPT时有什么痛点: 然后我得到了50多条对课件类PPT的泣血控诉-各类沙雕问题整理如下: ▌图片问题 • ...
- 如何用vba在word中快速移动或选中内容区域?
转自:http://www.exceloffice.net/archives/1598 在word中经常需要操作特定位置的文本内容,定位文本内容就显得尤为重要. 在word vba中Range. Se ...
- 如何用XGBoost做时间序列预测?
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 来源:Jason Brownlee,整理:数据派THU 本文约3300字 ...
- 独家 | 如何用XGBoost做时间序列预测?
作者:Jason Brownlee 翻译:wwl 校对:王雨桐 本文约3300字,建议阅读10分钟 本文介绍了如何用XGBoost做时间序列预测,包括将时间序列转化为有监督学习的预测问题,使用前向验证 ...
- python 分类变量xgboost_如何用XGBoost做时间序列预测?
作者:Jason Brownlee翻译:wwl校对:王雨桐本文约3300字,建议阅读10分钟本文介绍了如何用XGBoost做时间序列预测,包括将时间序列转化为有监督学习的预测问题,使用前向验证来做模型 ...
- 如何用Excel做一个战斗模拟器(三)战斗过程模拟
如何用Excel做一个战斗模拟器(一)升级经验表 如何用Excel做一个战斗模拟器(二)属性表 目录索引 定义战斗子过程 定位战斗双方基础属性 利用基础属性与战斗公式进行计算 战斗过程的运算与输出 判 ...
- 如何用python做后端写网页-flask框架
如何用python做后端写网页-flask框架 什么是Flask 安装flask模块 Hello World 更深一步:数据绑定 后端传入数据 从前端获取数据 数据库连接 screen 创建后台 查看 ...
最新文章
- 关于ajax访问本地json文件报错404的问题
- Xshell 更改字体配色
- Map-Reduce的过程解析
- Django2.2-LookupError No installed app with label admin
- checkbox居中 editor_如何在ListBoxItem中居中WPF CheckBox
- c++ 传入回调函数 参数没有传入_一文读懂回调函数
- strace命令用法
- php抓取多个网页合并,PHP 使用 CURL 同步抓取多个网页
- leetcode421. 数组中两个数的最大异或值(贪心算法)
- 如何变得井井有条-来之不易的秘诀来组织您的生活
- [Leedcode][JAVA][第974题][和可被K整除的子数组][前缀和][HashSet]
- 异步编程到底在说啥?
- android调用.Net WebService传递byte[]
- axios请求跨域前端解决_Vue-创建axios实例并实现跨域请求(完整过程-前端)
- PS的液化功能使用(瘦身,拉长专用)
- arcgis api for javascript 3.33 清空、删除图层
- 将所有程序最小化到系统托盘RBTray strokeit TrayEverything
- 日语开发java自我介绍,用日语自我介绍,这些你一定会用到
- 嫡权法赋权法_Python实现客观赋权法
- 写在给自己入个耳机之前
热门文章
- XSS笔记-来源于个人思路构造以及网络分享
- 数据库---四中连接查询(交叉、左连接、右连接、完整查询)
- 嵌入式编程入门教程,学习设计嵌入式工程师
- python画余弦曲线_使用python画圆以及正弦余弦曲线
- properties解耦数据库参数和SQL参数的传递
- 6v电源控制12v继电器
- linux下redis设置密码登录(简单易懂)
- 阿里双11突遭断网断电!最惊险一幕刚刚曝光
- cass简码大全_cass 简码识别
- Mac版word空格变成小点,多了很多“分节符(下一页)”和“窗体顶端”和“窗体底端”等字样,怎么解决?