祝 曉
利用VBA設計課堂練習題
祝 曉
由于利用多媒體課件教學有諸多優越性,所以在提高教學質量方面,多媒體課件不失為一種很好的輔助工具。制作多媒體課件的軟件也很多,如Flash,Authorware,PPT等,在實際使用時要根據教學需求和對這些軟件的熟悉程度加以選用。PPT的易用性和強大功能得到了廣大教師的青睞,如果結合使用VBA,PPT的靈活性、功能性、交互性、可擴展性等都會大大增強。
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中的應用很廣泛,以上是對選擇題、判斷題、填空題、連線匹配題設計方面作的概述。程序的設計算法不同,代碼的精簡程度也不一樣,系統的運行效率也不同。
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用于顯示要匹配內容。文本框賦值后,判斷正誤方法同上。