首先严重声明一下,我不是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语言,在有源码的支撑下,比葫芦画瓢拿来用并不费力,当时从最初接触到完成开发只用了一周时间。

但至今仍有许多未解决的疑惑,例如:

  1. 如何将被点击形状的名称作为参数,使其被VBA代码捕获。目前为每个形状关联不同的函数,50个形状就要写50个函数、改50个名称、关联50次……;
  2. 如何随页面载入自动运行某段函数。目前采用手动点击按钮的方式初始化。

上述问题可能在ppt vba中无解,也可能有更好的解决方法,欢迎交流。

如何用vba做答题、抽点类ppt相关推荐

  1. 论文画图-如何用Matlab做矢量图?PPT转PDF方法?

    论文画图 Q:如何用Matlab做矢量图? A:介绍一种方法:在Matlab画好图后,在Figure里面另存为emf格式,粘贴到PPT中,然后转成PDF插入论文,可以保证是矢量图. Step 1: 在 ...

  2. 怎么把ppt文字大小设置一致_课件类PPT怎么做才好看?我修改了6页PPT,总结了7个技巧...

    嗨,各位木友们好呀,我是小木. 不好意思,上周少发了一篇文章,原因是时间全用来准备今天这篇近三千字.图还巨多的超长教程了- 在写这篇教程之前,我发过一条朋友圈,询问了大家在制作课件类PPT时有什么痛点 ...

  3. 怎么把ppt文字大小设置一致_?课件类PPT怎么做才好看?我修改了6页PPT,总结了7个技巧...

    ​嗨,各位木友们好呀,我是小木. 在写这篇教程之前,我发过一条朋友圈,询问了大家在制作课件类PPT时有什么痛点: 然后我得到了50多条对课件类PPT的泣血控诉-各类沙雕问题整理如下: ▌图片问题 • ...

  4. 如何用vba在word中快速移动或选中内容区域?

    转自:http://www.exceloffice.net/archives/1598 在word中经常需要操作特定位置的文本内容,定位文本内容就显得尤为重要. 在word vba中Range. Se ...

  5. 如何用XGBoost做时间序列预测?

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 来源:Jason Brownlee,整理:数据派THU 本文约3300字 ...

  6. 独家 | 如何用XGBoost做时间序列预测?

    作者:Jason Brownlee 翻译:wwl 校对:王雨桐 本文约3300字,建议阅读10分钟 本文介绍了如何用XGBoost做时间序列预测,包括将时间序列转化为有监督学习的预测问题,使用前向验证 ...

  7. python 分类变量xgboost_如何用XGBoost做时间序列预测?

    作者:Jason Brownlee翻译:wwl校对:王雨桐本文约3300字,建议阅读10分钟本文介绍了如何用XGBoost做时间序列预测,包括将时间序列转化为有监督学习的预测问题,使用前向验证来做模型 ...

  8. 如何用Excel做一个战斗模拟器(三)战斗过程模拟

    如何用Excel做一个战斗模拟器(一)升级经验表 如何用Excel做一个战斗模拟器(二)属性表 目录索引 定义战斗子过程 定位战斗双方基础属性 利用基础属性与战斗公式进行计算 战斗过程的运算与输出 判 ...

  9. 如何用python做后端写网页-flask框架

    如何用python做后端写网页-flask框架 什么是Flask 安装flask模块 Hello World 更深一步:数据绑定 后端传入数据 从前端获取数据 数据库连接 screen 创建后台 查看 ...

最新文章

  1. 关于ajax访问本地json文件报错404的问题
  2. Xshell 更改字体配色
  3. Map-Reduce的过程解析
  4. Django2.2-LookupError No installed app with label admin
  5. checkbox居中 editor_如何在ListBoxItem中居中WPF CheckBox
  6. c++ 传入回调函数 参数没有传入_一文读懂回调函数
  7. strace命令用法
  8. php抓取多个网页合并,PHP 使用 CURL 同步抓取多个网页
  9. leetcode421. 数组中两个数的最大异或值(贪心算法)
  10. 如何变得井井有条-来之不易的秘诀来组织您的生活
  11. [Leedcode][JAVA][第974题][和可被K整除的子数组][前缀和][HashSet]
  12. 异步编程到底在说啥?
  13. android调用.Net WebService传递byte[]
  14. axios请求跨域前端解决_Vue-创建axios实例并实现跨域请求(完整过程-前端)
  15. PS的液化功能使用(瘦身,拉长专用)
  16. arcgis api for javascript 3.33 清空、删除图层
  17. 将所有程序最小化到系统托盘RBTray strokeit TrayEverything
  18. 日语开发java自我介绍,用日语自我介绍,这些你一定会用到
  19. 嫡权法赋权法_Python实现客观赋权法
  20. 写在给自己入个耳机之前

热门文章

  1. XSS笔记-来源于个人思路构造以及网络分享
  2. 数据库---四中连接查询(交叉、左连接、右连接、完整查询)
  3. 嵌入式编程入门教程,学习设计嵌入式工程师
  4. python画余弦曲线_使用python画圆以及正弦余弦曲线
  5. properties解耦数据库参数和SQL参数的传递
  6. 6v电源控制12v继电器
  7. linux下redis设置密码登录(简单易懂)
  8. 阿里双11突遭断网断电!最惊险一幕刚刚曝光
  9. cass简码大全_cass 简码识别
  10. Mac版word空格变成小点,多了很多“分节符(下一页)”和“窗体顶端”和“窗体底端”等字样,怎么解决?