如何用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时,需勾选引用库。

点开发工具->工具->引用,勾选“Microsoft Excel 16.0 Object Library”

注意:随office版本不同,16.0可能会变成12.0等,更换版本时(比如拿office 2010做的拷到office 2016的电脑上用)需要正确勾选。

基本流程

插入形状

新建一页ppt,插入一个形状

插入按钮

点菜单栏->开发工具->“命令按钮”,在页面上拖动,插入按钮

打开选择窗格,为对象命名(很重要!)

点菜单栏->开始->选择->选择窗格,打开对象选择窗口
双击将矩形对象名,改名为shape_text,这就是VBA中关联的形状名

写代码

双击按钮,或点菜单栏->开发工具->查看代码,进入开发页面
写入如下代码,功能是在形状上显示一行文字
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页面
播放ppt,点击按钮,出现文字

方式二,在开发页面直接运行代码(常用于调试):


将光标放到希望运行的函数内,点菜单栏运行按钮

以上是ppt vba开发基本流程,下面附上部分代码。

部分关键代码

随机抽点:

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'开始
Sub RandomStart()
    F = 0
    Do While True
        If F = 1 Then Exit Do
        currentQuestionNum = Int(num3_5 * Rnd)
        Shapes("lable_text").TextFrame2.TextRange.Text = question3_5(currentQuestionNum, 0)
        Sleep 20
        DoEvents
    Loop
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 = i
    Shapes("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 Long

Private Function CreateTimer(ByVal Interval As Long) As Long
    ' 建立一个时间间隔为Interval微秒的定时器
    Dim tID As Long
    tID = SetTimer(0, 0, Interval, AddressOf TimerProc) '运行到此处出错
    CreateTimer = tID
End Function

Private 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中无解,也可能有更好的解决方法,欢迎交流。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • saturnlu阅读 247评论 0 0
  • 2016年6月15日,乘坐3小时的动车,我来到了上海。在学校的安排下,我将在这里开始我的实习生涯,上海很好,可...
    王老师你好呀阅读 190评论 0 0
  • 渐行,行在起雾的黄昏 矗立极目,却愈发模糊, 雾带来了水气,凝结, 濛濛的水汽,贴在脸上, 渐渐的变凉,明白了凉意...
    半路书生阅读 128评论 0 0
  • 身为一个自媒体写手,不会写影评显然是极大的罪过。 写影评好处有三: 1,提高自己的鉴赏电影的能力; 2,提高自己写...
    木落一阅读 335评论 0 3
  • firedbullet阅读 282评论 0 0