祝 曉
利用VBA設(shè)計(jì)課堂練習(xí)題
祝 曉
由于利用多媒體課件教學(xué)有諸多優(yōu)越性,所以在提高教學(xué)質(zhì)量方面,多媒體課件不失為一種很好的輔助工具。制作多媒體課件的軟件也很多,如Flash,Authorware,PPT等,在實(shí)際使用時(shí)要根據(jù)教學(xué)需求和對這些軟件的熟悉程度加以選用。PPT的易用性和強(qiáng)大功能得到了廣大教師的青睞,如果結(jié)合使用VBA,PPT的靈活性、功能性、交互性、可擴(kuò)展性等都會(huì)大大增強(qiáng)。
VBA是Visual Basic for Application的簡寫,它以VB(Visual Basic)語言為基礎(chǔ),經(jīng)過修改并運(yùn)行在Microsoft Office(如Excel,Word,PPT和Access)中的應(yīng)用程序,是一種完全面向?qū)ο篌w系結(jié)構(gòu)的編程語言。利用VBA可以對Office軟件進(jìn)行二次開發(fā),增強(qiáng)Office軟件的靈活性和擴(kuò)展性,例如,用VBA制作PPT課件,將會(huì)使課件別具特色。VBA是一種程序語言,有自己的語法規(guī)范,初學(xué)者可以找相關(guān)書籍或查閱VBA幫助,進(jìn)行學(xué)習(xí)。以下從練習(xí)題設(shè)計(jì)角度談VBA在PPT課件中的應(yīng)用。
VBA在PPT中的應(yīng)用很廣泛,以上是對選擇題、判斷題、填空題、連線匹配題設(shè)計(jì)方面作的概述。程序的設(shè)計(jì)算法不同,代碼的精簡程度也不一樣,系統(tǒng)的運(yùn)行效率也不同。
2011-11-27
祝曉,本科。
云南省臨滄市云縣大寨中學(xué)。
1.準(zhǔn)備工作
(1)建立數(shù)據(jù)庫
數(shù)據(jù)庫是用來存放練習(xí)題和答案的,數(shù)據(jù)庫有多種,不同的數(shù)據(jù)庫有不同的優(yōu)缺點(diǎn)和適用范圍,這里選用Microsoft Access即可。本例建一個(gè)名為test的數(shù)據(jù)庫,這個(gè)數(shù)據(jù)庫包含4個(gè)表,分別是xzt(用于存放選擇題),pdt(用于存放判斷題),tkt(用于存放填空題),ppt(用于存放匹配題)。選擇題字段設(shè)計(jì):xzt(題目,備選A,備選B,備選C,備選D,答案),其余根據(jù)需要仿此。使用數(shù)據(jù)庫的目的是使課件更具有靈活性和可擴(kuò)展性,有了數(shù)據(jù)庫,只需要更新數(shù)據(jù)庫練習(xí)題的內(nèi)容,以后調(diào)用即可;而且答題界面可以做得很簡潔,一般一種題型用一張即可。
(2)界面設(shè)計(jì)
界面的使用可以選擇大家熟知的幻燈片(Slide),也可以使用Visual Basic編輯器中添加的用戶窗體(UserForm),它們各有優(yōu)缺點(diǎn),使用幻燈片的不足之處是程序執(zhí)行結(jié)果會(huì)保留在幻燈片上(重新播放時(shí),上次結(jié)果會(huì)保留在幻燈片上,使用不太方便),要除去這些內(nèi)容,還得多寫代碼;使用用戶窗體不足之處是幻燈片啟動(dòng)時(shí)看不見。因此在這里把它們結(jié)合起來使用。使用一張幻燈片,作為導(dǎo)航界面;使用若干個(gè)用戶窗體作為答題界面。執(zhí)行【視圖】/【工具欄】/【控件工具箱】命令,打開控件工具箱,單擊控件工具箱上的命令按鈕,在幻燈片的合適位置畫出4個(gè)按鈕,右擊第一個(gè)命令按鈕,在彈出的快捷菜單中單擊【屬性】,在打開的屬性對話框中,將Caption屬性改為“選擇題”。用同樣的方法將另外三個(gè)命令按鈕的Caption屬性分別改為“判斷題”“填空題”“匹配題”。然后使用Alt+F11組合鍵(或執(zhí)行【工具】/【宏】/【Visual Basic編輯器】命令)打開Visual Basic編輯器窗口,在此窗口中,執(zhí)行【插入】/【用戶窗體】就可插入用戶窗體。在第一個(gè)用戶窗體的合適位置添加兩個(gè)命令按鈕CommandButton1和CommandButton2,Caption屬性分別為“開始”“下一題”,Enabled屬性分別為真(True)、假(False);然后在適合的位置添加一個(gè)標(biāo)簽(Label1),用于顯示題目;在適合處添加4個(gè)單選按鈕(OptionButton1,OptionButton2,OptionButton3,OptionButton4),將Caption屬性值分別設(shè)置為“A”“B”“C”“D”,(字母大小寫一定要和數(shù)據(jù)庫中“答案”中的一致),并在每個(gè)單選按鈕的后邊加一個(gè)標(biāo)簽(Label2,Label3,Label4,Label5),用于顯示備選擇答案。另外在不影響操作的位置加一個(gè)文本框(TextBox1),把其可見性(Visible)設(shè)置為假(False),用于暫存已經(jīng)做的題目數(shù)量。第一個(gè)用戶窗體作為選擇題答題界面,一般一種題型用一個(gè)窗體,按需要仿窗體一設(shè)計(jì)即可。另外,界面的設(shè)計(jì)要符合界面設(shè)計(jì)原則。
2.應(yīng)用實(shí)例
(1)鏈接數(shù)據(jù)庫
①執(zhí)行【工具】/【宏】/【Visual Basic編輯器】命令,打開“Visual Basic編輯器”窗口。
②引用VBA工程(VBAProject)。單擊【工具(T)】/【引用(R)】,打開“引用—VBAProject”窗口,在“可使用的引用(A)”窗口中找到“Microsoft ActiveX Data Object2.6”并選中,單擊【確定】。
③單擊【插入】/【模塊】,就新建了一個(gè)模塊,默認(rèn)名稱是“模塊1”。
④雙擊“模塊1”并添加以下代碼:
Public adocon As ADODB.Connection
Public adorst As ADODB.recordset '在模塊中建立公共數(shù)據(jù)對象
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設(shè)計(jì)選擇題
①單擊第一個(gè)用戶窗體中的“開始”按鈕
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
②單擊第一個(gè)用戶窗體中的“下一題”按鈕
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 "錯(cuò)了,再想想!"
End If
End Sub
④為幻燈片上的“選擇題”按鈕添加代碼,其余依此類推。
Private Sub CommandButton1_Click()
Load UserForm1
UserForm1.Show
End if
這樣就可以打開選擇題答題界面。
(3)設(shè)計(jì)判斷題
判斷題的設(shè)計(jì)和選擇題類似,只需兩個(gè)單選按鈕(OptionButton1,OptionButton2),這兩個(gè)單選按鈕的Caption屬性分別設(shè)為“正確”“錯(cuò)誤”即可,其余仿選擇題。
(4)填空題的設(shè)計(jì)
只要答案是固定的,填空題也可以智能判斷。在設(shè)計(jì)數(shù)據(jù)庫時(shí),要填空的地方用括號表示,在答題界面上用文本框(TextBox)作為答題的地方,再用一個(gè)命令按鈕(CommandButton1)來判斷。關(guān)鍵代碼示例:
Private Sub CommandButton1_Click()
If TextBox1.Text = adorst.Fields("答案") Then
MsgBox "答對了,你真棒!"
Else
MsgBox "錯(cuò)了,再想想!"
End If
End Sub
(5)連線題(匹配題)的設(shè)計(jì)
用連線的方法判斷正誤不好設(shè)計(jì),改變思路,把要和某項(xiàng)相連的對象移動(dòng)到它的右邊,再判斷正誤。這樣,問題的關(guān)鍵轉(zhuǎn)化為怎樣拖動(dòng)要匹配的對象。關(guān)鍵代碼:
Dim X1, Y1 As Integer, Down As Boolean '設(shè)置全局變量,X1,Y1等為Label1等對象的初始坐標(biāo)值
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)
'如果鼠標(biāo)已按下,設(shè)置Label1新的坐標(biāo)值
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
以上把標(biāo)簽(Label1)的內(nèi)容(需要拖動(dòng)的對象)拖放到文本框中,就可以判斷正誤:
Private Sub CommandButton1_Click()
If TextBox1.Text = adorst.Fields("答案") Then
MsgBox "做對了,恭喜你!", vbOKOnly, "提示"
Else
MsgBox "做錯(cuò)了,還得努力?。?, vbOKOnly, "提示"
End If
End Sub
從以上代碼可以看出,如果需要匹配的對象較多,就要寫很多代碼,如果一個(gè)標(biāo)簽對應(yīng)一個(gè)匹配對象,每個(gè)標(biāo)簽都寫MouseDown,MouseMove和MouseUp事件代碼。解決問題的辦法不是唯一的,另外一種思路:用文本框的Change事件為文本賦值,同時(shí)把標(biāo)簽隱藏,即可見性設(shè)置為假。具體做法是:用一個(gè)標(biāo)簽作為匹配對象的序號,一個(gè)標(biāo)簽作為匹配對象,一個(gè)文本框作為匹配對象的容器,利用文本框的Change事件,向文本框輸入序號時(shí),序號消失而將匹配對象賦予文本框,同時(shí)利用代碼使用表示序號和匹配對象的標(biāo)簽隱藏(可見性設(shè)為假)。關(guān)鍵代碼示例: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用于顯示要匹配內(nèi)容。文本框賦值后,判斷正誤方法同上。