基于VBA的PPT问答式复习系统的设计与实现
2020-07-09王宏杰许丽娟
王宏杰 许丽娟
摘 要:传统的问答式课前复习是在PPT里编辑和排版题目,教师即要思考题目也要兼顾题目在PPT中的版式布局。数据与视图混为一体,导致教师核心精力分散,也使得题目维护的工作量较大。利用VBA技术能有效解决这一问题,VBA自动从Excel中读取题目展示到PPT中,实现题目数据与展示视图的分离,教师只需专注在Excel中维护题库,排版展示工作交给VBA实施。
关键词:VBA;PPT;Excel;question bank
引言
作者曾对独立院校的学情做过调查分析,并提出:在学生主动学习能力差的情况下,切实开展课前复习能有效帮助学生消化吸收上节课的知识。同时,作者通过实践发现,问答式课前复习是一种行之有效的方法:根据上一节课的知识点整理若干道题目,以问答的方式在课前展开复习。
但问答式课前复习对教师提出了更高的要求:根据章节整理出题目,并且将之排版形成PPT。后续对题目进行增删改等维护时,就得维护相应排版,也就是说,题目与展示混合在一起,使得维护的工作量增大了。
对此,本文提出基于VBA的PPT问答式复习系统,以 Microsoft Excel作为编辑、存储题目的后台“数据库”,以Microsoft PowerPoint作为前端视图,以VBA技术作为中间控制器自动读取Excel中的题目展示到PPT中,实现前后端分离。教师只需在Excel中维护题目,排版展示工作交給系统自动完成,从而减少教师工作量。同时,系统以PPT为宿主,可以集成在教师原PPT课件中,相当于为原课件扩展了复习功能。
一、技术基础
(一)VBA
VBA(Visual Basic For Application)是美国微软公司在Visual Basic基础上开发出来,应用于其桌面应用程序的一种自动化任务编程语言。1993年,VBA开始出现在Microsoft Excel和Microsoft Project中入[1],以满足用户在特定领域对Office基本功能扩展的需求。目前,VBA已集成于Microsoft Office的大多数产品中,包括Word、Excel、PowerPoint、Outlook等。
本系统使用的VBA是基于Microsoft PowerPoint 2016的Microsoft visual Basic for Application 7.1。
(二) ActiveX控件
ActiveX是微软公司对一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。ActiveX控件,是可以在应用程序中重复使用的程序对象,它的主要技术是ActiveX。VBA编辑器提供的ActiveX控件比较丰富,本系统使用到的有:命令按钮控件、标签控件、文本框控件、List Box控件等。
二、系统设计
(一)功能设计
系统以 Microsoft Excel作为编辑、存储题目的后台“数据库”,以Microsoft PowerPoint作为前端视图,以PowerPoint自带的VBA作为核心技术,实现前后端分离,如图1所示。
通过PPT上的命令按钮,用户触发系统,系统启动后读取Excel中的章节、题目信息,自动在当前PPT中新增幻灯片,并按照一定的布局版式展示每道题目。同时,每个题目幻灯片上有“查看答案”按钮,点击时动态显示答案。题目和答案的内容支持文字和图片。
(二)前端视图设计
PPT(教师原课件)作为题库的前端视图,用于展示题目。题目在Excel中有多道,系统对每道题在原PPT最前面新增一个幻灯片用于展示。Excel中每道题目由多行组成,对于每一行,幻灯片采用一个新的文本框存放其内容。题目题型(填空、判断、单选、多选)展示在答案区域的文本框中,当用户点击“查看按钮”时,答案区域的文本框内容由题型变为答案[2]。题目在幻灯片中的版式布局如图2所示。
(三)后端数据库设计
Excel作为 “数据库”,用于编辑、存储题目,形成题库。题目设计规则如下:
(1)Excel文件。题库以课程的章为单位,一章一个Excel文件,文件以“xxx复习题”格式命名,和PPT放在同一目录下。
(2)Excel工作表。一个Excel文件里面可以有多个工作表(sheet)。一个工作表为一次复习题,可以有多道题目,工作表表名要符合实际且通俗易懂,如“2.1常量与变量”或“第2章第1次复习”等。
(3)题目设计规范。为了方便VBA程序快速、准确的从表中读取题目到PPT中,设定以下规范:
①工作表的第1列为标识列。只能是以下标识:“{”是题目开始标识,标注在题目开始处;“}”是题目结束标识,标注在题目结束的下一行;大写字母A-Z是选项标识,标注在选择题处;“img”是图片标识,标注在图片顶部位置。如图3、图4所示。
②工作表的第2列为题目内容。题目内容是图片时,图片宽度不要超过第2列的列宽。当然,可以通过调整第2列的列宽,使得内容适当。如图3、图4所示。
③工作表的第3列为答案内容。其中,“FALSE”、“TRUE”,表示判断题,代表错、对;单个大写字母A-Z,表示单选题,代表单选答案;多个大写字母A-Z,表示多选题,代表多选答案;“img”,表示填空题且答案是图片,图片放在“img”标识下,不要超过题目范围。其余答案内容,视为填空题。如图3、图4所示。
三、系统实施
(一)题库初始化
按照上述规则新建Excel文件,将题目按小节或其他方式录入在工作表中。Excel文件的存放路径与PPT保持一致。
(二)修改幻灯片空白版式
为了统一采用图2的幻灯片版式布局,本系统通过修改幻灯片母版的空白版式实现。具体方法为:在PPT中通过“视图”打开“幻灯片母版”,选中“空白版式”,然后通过“开发工具”在空白版式上新增一个命令按钮(ActiveX控件),通过属性修改该控件标题为“查看答案”。其余布局通过VBA动态实现。
(三)引用Excel对象库
以PPT为宿主的VBA不能直接使用Excel相关对象和函数,需要先加载Excel对象库,具体方法为:在PPT中打开“开发工具”,点击“Visual Basic”进入VBA编辑器。通过“工具”引用“Microsoft Excel 16.0 Object Library”[3]。
(四)启动及交互确认
(1)系统触发。在教学PPT的第一页新增一个命令按钮控件“课前复习”,用于触发系统。系统启动后寻找并打开当前PPT路径下的“xxx复习题”Excel文件,读取每个工作表里第一列的标识信息,记录每道题在表格中的起止位置即 “{”、“}”标识所在的行。为了方便,本系统自定义了一个新数据类型,用于存储工作表名(章节名)以及每道题目的位置,具体代码如下:
'自定义类型,用于存放章节名以及题目在表格中的起止位置
Public Type TYPE_SAQP 'SectionAndQuestionPositon
section As String '章節名
questionpos() As Integer '所有题目的起止位置
End Type
全局变量,保存每个章节工作表的名称以及里面每道题的起止位置
Public PUB_arr_SAQP() As TYPE_SAQP
(2)章节选择窗口。从前面得到的章节名和题目起止位置数组中提取章节名,计算出题目数量,形成二维数组,加载到章节选择窗口的ListBox控件中(如图5,该控件设置为两列,需要二维数组才能初始化),以便用户选择需要生成复习题的章节。
(五)题目在幻灯片中展示
当题目内容为文本时,可以直接通过Excel的cells函数取到单元格内容,然后赋值给幻灯片的文本框。但题目内容为图片时,就不能这样直接赋值。所以,需要根据题目是否有图片分别处理:
(1)题目为纯文本时。此时表格第1列没有图片标识,系统为每道题目在原PPT最前面新增一张空白版式的幻灯片作展示。从题目的开始行到结束行,每行对应在幻灯片题目区域新建一个文本框,通过cells函数读取该行第2列的内容赋值给文本框。部分代码如下:
'幻灯片母版中空版式对应的索引是7
Set mylayout = ActivePresentation.SlideMaster.CustomLayouts(7)
'每道题目新增一个幻灯片来展示
For i = 0 To questionnum - 1
'第i+1道题新增为第i+1个幻灯片,名字为“复习x”
ActivePresentation.Slides.AddSlide(i + 1, mylayout).Name = "复习" & i
'工作表里的所有题目的位置信息依次保存在数组中
startrow = arr_QuestionPostion(i * 2) '题目开始行
endrow = arr_QuestionPostion(i * 2 + 1) '题目结束行
...
'对于每道题,xls中的每一行对应在幻灯片中新增一个文本框
mytop = 80 '第一个文本框的初始位置top值
For m = startrow To endrow - 1
imagestr = xlsSheet.Cells(m, 1) '读取第1列数据,判断是否有图片
'当本行没有图片标识时
If (imagestr <> IMAGEFLAG And xlsSheet.Cells(m, 2) <> "") Then
Set myshap = ActivePresentation.Slides(i + 1). _
Shapes.AddTextbox(1, 40, mytop, 450, 30) '新增文本框
myshap.Name = "questioncontent-" & (m - startrow) '文本框命名
If (m = startrow) Then '题目第一行需要加入序号
myshap.TextFrame2.TextRange.Text = (i + 1) & _
"、" & xlsSheet.Cells(m, 2)
Else
If typestr = "判断题" Or typestr = "填空题" Then
myshap.TextFrame2.TextRange.Text = xlsSheet.Cells(m, 2)
Else
'选题时,需要加xls中第一列的选项信息,如A、xxx
myshap.TextFrame2.TextRange.Text = _
xlsSheet.Cells(m, 1)& "、" & xlsSheet.Cells(m, 2)
…
mytop = mytop + myshap.Height '下一个文本框的位置
…
(2)题目包含图片时。此时表格第1列有图片标识,由于图片默认是浮在单元格之上的,所以无法直接获取图片。本系统采用的方法是:遍历当前工作表中的所有形状(Shapes),如果某形状的左上角坐标在某题目第2列范围内,则认为该形状是本题目的图片;然后在表格中拷贝该形状,粘贴到幻灯片中;最后在幻灯片里调整该图片的位置,使其位于题目区域。部分代码如下:
If (imagestr = IMAGEFLAG) Then '当本行有图片标识时
top1 = xlsSheet.Cells(startrow, 2).Top
top2 = xlsSheet.Cells(endrow, 2).Top
left1 = xlsSheet.Cells(startrow, 2).Left
left2 = left1 + xlsSheet.Cells(startrow, 2).Width
Set xlspicshps = xlsSheet.Shapes '当前表格里的所有形状
For n = 1 To xlspicshps.Count
'遍历xls中所有形状,判断其左上角坐标是否在范围内
If (xlspicshps(n).Top > top1 And xlspicshps(n).Top < top2 _
And xlspicshps(n).Left > left1 And xlspicshps(n).Left < left2) Then
xlsSheet.Shapes(xlspicname).Copy '对xls中的形状进行拷贝
'粘贴前幻灯片里面形状的数量
shpnum = ActivePresentation.Slides(i + 1).Shapes.Count
'向幻灯片中粘贴形状
ActivePresentation.Slides(i + 1).Shapes.Paste
'粘贴进来的形状在幻灯片里的索引值为shpnum+1 Set myshap = ActivePresentation.Slides(i + 1).Shapes(shpnum + 1)
'调整形状的位置到题目区域
myshap.Left = 40
myshap.Top = mytop
mytop = mytop + myshap.Height + 5 '图片间隔5单位
…
(3)答案为纯文本时。根据表格第3列的内容,系统依照规则判断当前题目是什么类型(填空、判断、单选、多选),并將题型写在答案文本框中。点击“查看答案”按钮时,更新答案文本框内容为题目答案。部分代码如下:
'答案区域文本框初始化
Set myshap = ActivePresentation.Slides(i + 1). _
Shapes.AddTextbox(1, 550, 140, 130, 30) '在答案区域新增文本框
myshap.Name = "typeanswer-" & i '答案文本框命名
myshap.Fill.BackColor.RGB = VBA.RGB(230, 230, 230) '答案文本框设置为灰色
myshap.TextFrame2.TextRange.Text = typestr '题型
...
' 点击“查看答案时”按钮时,答案文本框显示答案
'当前放映的幻灯片名字,如复习0
slidename = SlideShowWindows(1).View.Slide.Name
tempstr = Replace(slidename, "复习", "")
myindex = Int(tempstr)
'全局二维数组PUB_arr2_TypeAndAnswer保存了题型和答案
answerstr = PUB_arr2_TypeAndAnswer(myindex, 1) '答案
answershpname = "typeanswer-" & myindex '答案文本框对应的名字
...
'更新答案文本框内容为题目答案
ActivePresentation.Slides(slidename).Shapes(answershpname). _
TextFrame2.TextRange.Text = answerstr
...
(4)答案为图片时。表格第3列为“img”时,表示答案为图片,采用之前的图片处理方法:从工作表中拷贝答案图片,粘贴到幻灯片中,调整图片位置到答案区域,然后将图片设置为隐藏,点击“查看答案”时,使图片显示。效果如图6所示。
四、结论
本系统以Excel为题目“数据库”,以PPT为视图展示,利用VBA技术实现了数据与视图的分离。使得教师只需在Excel中专注题目本身的设计,无需关心题目在PPT中的排版展示,能有效提升教师的工作效率,从而进一步推动课前复习的实施,提升教学效果。
参考文献:
[1]朱建国. PPT新视角-VBA应用技术[M].北京:电子工业出版社,2013
[2]李永强.PowerPoint VBA技术在多媒体教学练习课件中的运用[J].江汉石油职工大学学报,2011,24(05):58-60+66.
[3]陈永强,李茜,陈海川.例学VBA—Excel/Access/PowerPoint中的VBA高效引用[M].北京:中国铁道出版社,2010
基金项目:广东财经大学华商学院计算机科学与技术一流专业建设项目(HS2019CXQX06)
作者简介:王宏杰(1982-),男,湖北襄阳人,硕士研究生,助教,研究方向为人工智能、深度学习;
许丽娟(1979-),女,青海乐都县人,硕士研究生,副教授,研究方向为图像识别 、数据挖掘。
通信作者:王宏杰