利用VBA设计课堂练习题
2012-01-29祝晓
祝 晓
利用VBA设计课堂练习题
祝 晓
由于利用多媒体课件教学有诸多优越性,所以在提高教学质量方面,多媒体课件不失为一种很好的辅助工具。制作多媒体课件的软件也很多,如Flash,Authorware,PPT等,在实际使用时要根据教学需求和对这些软件的熟悉程度加以选用。PPT的易用性和强大功能得到了广大教师的青睐,如果结合使用VBA,PPT的灵活性、功能性、交互性、可扩展性等都会大大增强。
一、VBA简介
VBA是Visual Basic for Application的简写,它以VB(Visual Basic)语言为基础,经过修改并运行在Microsoft Office(如Excel,Word,PPT和Access)中的应用程序,是一种完全面向对象体系结构的编程语言。利用VBA可以对Office软件进行二次开发,增强Office软件的灵活性和扩展性,例如,用VBA制作PPT课件,将会使课件别具特色。VBA是一种程序语言,有自己的语法规范,初学者可以找相关书籍或查阅VBA帮助,进行学习。以下从练习题设计角度谈VBA在PPT课件中的应用。
二、VBA在PPT中的应用实例
三、结束语
VBA在PPT中的应用很广泛,以上是对选择题、判断题、填空题、连线匹配题设计方面作的概述。程序的设计算法不同,代码的精简程度也不一样,系统的运行效率也不同。
2011-11-27
祝晓,本科。
云南省临沧市云县大寨中学。
1.准备工作
(1)建立数据库
数据库是用来存放练习题和答案的,数据库有多种,不同的数据库有不同的优缺点和适用范围,这里选用Microsoft Access即可。本例建一个名为test的数据库,这个数据库包含4个表,分别是xzt(用于存放选择题),pdt(用于存放判断题),tkt(用于存放填空题),ppt(用于存放匹配题)。选择题字段设计:xzt(题目,备选A,备选B,备选C,备选D,答案),其余根据需要仿此。使用数据库的目的是使课件更具有灵活性和可扩展性,有了数据库,只需要更新数据库练习题的内容,以后调用即可;而且答题界面可以做得很简洁,一般一种题型用一张即可。
(2)界面设计
界面的使用可以选择大家熟知的幻灯片(Slide),也可以使用Visual Basic编辑器中添加的用户窗体(UserForm),它们各有优缺点,使用幻灯片的不足之处是程序执行结果会保留在幻灯片上(重新播放时,上次结果会保留在幻灯片上,使用不太方便),要除去这些内容,还得多写代码;使用用户窗体不足之处是幻灯片启动时看不见。因此在这里把它们结合起来使用。使用一张幻灯片,作为导航界面;使用若干个用户窗体作为答题界面。执行【视图】/【工具栏】/【控件工具箱】命令,打开控件工具箱,单击控件工具箱上的命令按钮,在幻灯片的合适位置画出4个按钮,右击第一个命令按钮,在弹出的快捷菜单中单击【属性】,在打开的属性对话框中,将Caption属性改为“选择题”。用同样的方法将另外三个命令按钮的Caption属性分别改为“判断题”“填空题”“匹配题”。然后使用Alt+F11组合键(或执行【工具】/【宏】/【Visual Basic编辑器】命令)打开Visual Basic编辑器窗口,在此窗口中,执行【插入】/【用户窗体】就可插入用户窗体。在第一个用户窗体的合适位置添加两个命令按钮CommandButton1和CommandButton2,Caption属性分别为“开始”“下一题”,Enabled属性分别为真(True)、假(False);然后在适合的位置添加一个标签(Label1),用于显示题目;在适合处添加4个单选按钮(OptionButton1,OptionButton2,OptionButton3,OptionButton4),将Caption属性值分别设置为“A”“B”“C”“D”,(字母大小写一定要和数据库中“答案”中的一致),并在每个单选按钮的后边加一个标签(Label2,Label3,Label4,Label5),用于显示备选择答案。另外在不影响操作的位置加一个文本框(TextBox1),把其可见性(Visible)设置为假(False),用于暂存已经做的题目数量。第一个用户窗体作为选择题答题界面,一般一种题型用一个窗体,按需要仿窗体一设计即可。另外,界面的设计要符合界面设计原则。
2.应用实例
(1)链接数据库
①执行【工具】/【宏】/【Visual Basic编辑器】命令,打开“Visual Basic编辑器”窗口。
②引用VBA工程(VBAProject)。单击【工具(T)】/【引用(R)】,打开“引用—VBAProject”窗口,在“可使用的引用(A)”窗口中找到“Microsoft ActiveX Data Object2.6”并选中,单击【确定】。
③单击【插入】/【模块】,就新建了一个模块,默认名称是“模块1”。
④双击“模块1”并添加以下代码:
Public adocon As ADODB.Connection
Public adorst As ADODB.recordset '在模块中建立公共数据对象
Sub MAIN()
Set adocon = New ADODB.Connection
If adocon.State= adStateOpen And Not IsEmpty(adStateOpen) Then adocon.Close
adocon.Provider ="microsoft.jet.oledb.4.0"
adocon.ConnectionString ="test.mdb"
adocon.Open
'建立记录集
Set adorst = New ADODB.Recordset
adorst.ActiveConnection = adocon
adorst.CursorLocation = adUseClient
adorst.CursorType = adOpenDynamic
adorst.LockType = adLockOptimistic
End Sub
(2)利用VBA设计选择题
①单击第一个用户窗体中的“开始”按钮
Private Sub CommandButton1_Click() '开始按钮
CommandButton1.Enabled False
CommandButton2.Enabled True
TextBox1.Text = 1 '初始化题目量
Call MAIN
adorst.Source = "xzt"
adorst.Open , , , , adCmdTable
Label1.Caption = adorst.Fields(0)
Label2.Caption = adorst.Fields(1)
Label3.Caption = adorst.Fields(2)
Label4.Caption = adorst.Fields(3)
Label5.Caption = adorst.Fields(4)
End Sub
②单击第一个用户窗体中的“下一题”按钮
Private Sub CommandButton2_Click()
Dim i As Integer
CommandButton3.Enabled = True
TextBox1.Text = TextBox1.Text + 1
i = TextBox1.Text
Call MAIN
adorst.Source ="xzt"
adorst.Open , , , , adCmdTable
If i <= adorst.RecordCount Then
adorst.AbsolutePosition =i
'指向第i条记录
Label1.Caption = adorst.Fields(0)
Label2.Caption = adorst.Fields(1)
Label3.Caption = adorst.Fields(2)
Label4.Caption = adorst.Fields(3)
Label5.Caption = adorst.Fields(4)
End If
End Sub
③为第一单选按钮添加代码,其余依此类推。
Private Sub OptionButton1_Click()
If OptionButton1.Caption = adorst.Fields("答案") Then
MsgBox "答对了,你真棒!"
Else
MsgBox "错了,再想想!"
End If
End Sub
④为幻灯片上的“选择题”按钮添加代码,其余依此类推。
Private Sub CommandButton1_Click()
Load UserForm1
UserForm1.Show
End if
这样就可以打开选择题答题界面。
(3)设计判断题
判断题的设计和选择题类似,只需两个单选按钮(OptionButton1,OptionButton2),这两个单选按钮的Caption属性分别设为“正确”“错误”即可,其余仿选择题。
(4)填空题的设计
只要答案是固定的,填空题也可以智能判断。在设计数据库时,要填空的地方用括号表示,在答题界面上用文本框(TextBox)作为答题的地方,再用一个命令按钮(CommandButton1)来判断。关键代码示例:
Private Sub CommandButton1_Click()
If TextBox1.Text = adorst.Fields("答案") Then
MsgBox "答对了,你真棒!"
Else
MsgBox "错了,再想想!"
End If
End Sub
(5)连线题(匹配题)的设计
用连线的方法判断正误不好设计,改变思路,把要和某项相连的对象移动到它的右边,再判断正误。这样,问题的关键转化为怎样拖动要匹配的对象。关键代码:
Dim X1, Y1 As Integer, Down As Boolean '设置全局变量,X1,Y1等为Label1等对象的初始坐标值
Private Sub Label1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Not Down Then
X1=X
Y1=Y
Down = True
End If
End Sub
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'如果鼠标已按下,设置Label1新的坐标值
If Down Then
Label1.Left = Label1.Left + X - X1
Label1.Top = Label1.Top + Y - Y1
X1=X
Y1=Y
End If
End Sub
Private Sub Label1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Down = False
TextBox1.Text = Label1.Caption
End Sub
以上把标签(Label1)的内容(需要拖动的对象)拖放到文本框中,就可以判断正误:
Private Sub CommandButton1_Click()
If TextBox1.Text = adorst.Fields("答案") Then
MsgBox "做对了,恭喜你!", vbOKOnly, "提示"
Else
MsgBox "做错了,还得努力啊!", vbOKOnly, "提示"
End If
End Sub
从以上代码可以看出,如果需要匹配的对象较多,就要写很多代码,如果一个标签对应一个匹配对象,每个标签都写MouseDown,MouseMove和MouseUp事件代码。解决问题的办法不是唯一的,另外一种思路:用文本框的Change事件为文本赋值,同时把标签隐藏,即可见性设置为假。具体做法是:用一个标签作为匹配对象的序号,一个标签作为匹配对象,一个文本框作为匹配对象的容器,利用文本框的Change事件,向文本框输入序号时,序号消失而将匹配对象赋予文本框,同时利用代码使用表示序号和匹配对象的标签隐藏(可见性设为假)。关键代码示例:Private Sub TextBox1_Change()
If TextBox1.Text = “1” Then
TextBox1.Text = Label2.Caption
Label1.Visible = False
Label2.Visibl= False
End If
End Sub
以上Label1用于表示序号,即Label1.Caption ="1",Label2用于显示要匹配内容。文本框赋值后,判断正误方法同上。