目標/最終效果
目標是制作一個ppt,實現隨機抽題,具體描述:
- 第一頁幻燈片中:點擊開始按鈕后,右邊的文本框快速滾動 顯示隨機數字;點擊停止按鈕后,滾動停止,抽取到的題號會顯示到第二個文本框中,並append到第三個文本框的內容中;然后點擊跳轉按鈕,會跳轉至相應題目的幻燈片。
- 跳轉題目幻燈片后,點擊返回鍵,可返回到第一頁幻燈片繼續抽題。
- 第一頁幻燈片中,重置按鈕將清除所有文本框的內容。
PS:本文適合具有一定編程基礎的讀者。
最終效果鏈接:https://pan.baidu.com/s/1C9gmVtLDvTbOOYabEqVlng 提取碼:hxt7
注意應將文件保存為.pptm(啟用宏)形式。
關於VBA
- VBA,即Visual Basic for Application,是一種程序設計語言,集成在某個具體應用軟件中(比如最常用的是Excel VBA,我們將Excel稱為宿主應用程序)。
- VBA與VB(Visual Basic):在開發環境、基本語法、支持的對象和屬性和方法等都十分相似。不同之處在於,VBA代碼需要宿主應用程序的支持,因此只能與宿主應用程序一起使用,不能使用VBA創建獨立運行的應用程序。
- VBA與宏:一組VBA指令的集合形成了宏,宏能夠自動執行宿主應用程序的功能,實現一次性完成多項操作,或,擴展現有功能。
- ppt VBA:= VBA的基礎語法 + ppt對象模型。對於本文目標任務的實現來說,可以不掌握ppt對象模型。不過這里仍然給出完整的學習框架,供有興趣的讀者拓展:
【拓展】以Excel VBA為例說明VBA的學習框架:
VBA簡單示例
首先介紹命令按鈕控件的簡單示例,通過本部分,讀者應掌握:
- 如何創建控件、設置屬性。
- 熟悉VBA編輯器。
- 一個控件對某個動作的響應函數的編寫。
- 運行。
檢查環境
- 版本:office 最新版 PowerPoint (其它版本或者WPS或許也行)
- 開發工具:看看頂部有沒有“開發工具”菜單。沒有的話,在“文件”——“選項”——“自定義功能區”——勾選“開發工具”
-
VBA編輯器:檢查能否正常調出VBA編輯器
- 法一:快捷鍵alt + F11
- 法二:“開發工具”——“宏”——隨便輸入一個宏名,點擊創建。
- 看能否正常調出如下的VBA編輯器。若不能調出,彈窗提示錯誤(內存溢出啥的),很可能是你之前安裝過WPS,請參考這篇博客修改注冊表。
步驟
- 創建控件:“開發工具”——選擇“命令按鈕控件”——在幻燈片上畫出控件。 (還有很多其它類型的控件,請自行探索)
-
編輯控件屬性:右鍵點擊畫出來的丑陋控件——“屬性表”。
- “(名稱)”屬性:這個控件的名字,編程時用到,建議用英文認真命名,這里使用hello_btn。
- “Caption”屬性:命令按鈕控件顯示的文字。
- 另,調整樣式時,建議選擇“按分類序”,請自行探索如何改變控件的字體大小、前景背景顏色、對齊方式等。
-
編寫控件響應函數:雙擊控件,或,右鍵——“查看代碼”,從而調出VBA編輯器(也可直接按快捷鍵 alt+F11)。
- 雙擊選擇所在幻燈片,這里是slide8
- 選擇控件名稱,這里是hello_btn
- 選擇控件響應的事件,這里是單擊事件click
- 然后會自動生成函數頭尾,我們需要在中間補充函數的內容
Private Sub hello_btn_Click() '單引號表示注釋,與C語言的//含義相同 Dim str As String 'Dim 變量名 As 數據類型,能聲明一個變量,常用數據類型為Integer和String str = "hello world" MsgBox str 'MsgBox是消息框函數,這里實現了將彈出消息框並顯示"hello world"的功能 End Sub
-
運行方法:放映幻燈片,點擊按鈕,就會彈窗顯示"hello world"。或者,在VBA編輯器中,直接按F5運行。
VBA實現隨機抽題
- 創建4個命令按鈕控件,命名為start_btn, stop_btn, jump_btn, reset_btn。創建3個文本框控件,命名為rolling_num_text, result_num_text, done_nums_text。編輯控件屬性,加入一些提示性文本框。
- 創建具體題目的幻燈片,注意添加返回到首頁的按鈕(插入某個形狀,然后右鍵設置超鏈接)。復制得到7個這樣的幻燈片,表示有7道題。
- VBA中編寫4個函數:start_btn_Click、stop_btn_Click、jump_btn_Click、reset_btn_Click:
'全局變量
Dim n As Integer, stop_flag As Boolean
Private Sub start_btn_Click()
stop_flag = False
n = 7 '初始化,覺得還是放在一個init初始化函數里比較好...
stop_btn.Enabled = True '使stop按鈕有效
Dim a As Integer
Randomize '初始化Rnd函數的隨機數字生成器, 為其提供一個新的種子值。可按F1鍵查看函數解析。
Do
a = Fix(Rnd * n + 1) 'a是[1,n]的隨機整數。Fix函數返回數字的整數部分;Rnd函數沒有參數,返回[0,1)的小數。
rolling_num_text.Text = a
result_num_text.Text = ""
DoEvents '交出控制權,以便操作系統能夠處理其它事情
If stop_flag = True Then
Exit Do '退出循環,相當於break
End If
Loop
End Sub
Private Sub stop_btn_Click()
result_num_text.Text = rolling_num_text.Text
done_nums_text = done_nums_text + result_num_text + " "
stop_btn.Enabled = False '使stop按鈕無效
stop_flag = True
End Sub
Private Sub jump_btn_Click()
Dim temp As Integer
temp = result_num_text.Text + 1
ActivePresentation.SlideShowWindow.View.GotoSlide Val(temp)'GotoSlide切換到指定的幻燈片
End Sub
Private Sub reset_btn_Click()
rolling_num_text.Text = ""
result_num_text.Text = ""
done_nums_text.Text = ""
End Sub
todo challenge
- 抽題時,自動過濾已經抽過的題目。
- 需要使用數組(清空、插入、索引等操作)
- 抽題時,還能選擇題目的類型,比如從3類中選擇1類。
- 法一:使用選擇按鈕控件。
- 法二:添加文本框,可輸入題目類別號。
- 鏈接excel與ppt,實現“只需編輯excel相關數據,即快速創建ppt相應的題目幻燈片”。題庫excel中,題目類型、每類型的題目數量、題目內容字符串,都只需在excel中改動。
- 需要熟知excel和ppt的對象模型,然后學習如何鏈接excel與ppt
參考鏈接:
隨機抽題、鏈接excel與ppt、VBA基礎語法、MS官方文檔是個寶
快捷鍵小結:
alt+F11打開VBA編輯器、F5運行、F1在瀏覽器打開 光標定位處 的幫助文檔