摘要:通過對ExcelVBA的研究,采用VBA的二次開發技術,設計了一個自動組卷系統,由題庫將試卷自動生成Word文檔,較好地解決了手工出卷的繁瑣和不科學性,提高了教師工作效率。
關鍵詞:題庫;VBA;自動生成試卷
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2010)11-2650-03
The Design of System about Automatic Generation of Test Paper Based on Excel VBA
WANG Fan-fan
(Hainan College of Economics and Business, Haikou 571127, China)
Abstract: Through researching the Excel VBA, using the re-development technology of VBA, has designed an automatic group for volume system, produces automatically by the question bank the examination paper the Word documents, and solved well that has made examination by hand volume tedious and unscientific, improved the teacher's work efficiency.
Key words: question bank; VBA; automatic group for volume
目前,許多老師在出卷時還是采用手工出卷方式,臨時東拼西湊試題,有時甚至將往年的試卷稍加修改而成,這樣難免造成可用試題數量極少、試題使用的重復性、對全部知識點的覆蓋面差等現象。尤其對于大多數學校都要求教考分離,如果還采用這種手工出卷的方式,費時費力不說,更重要的是難以保證其科學性和公正性。對此,本文通過Excel創建試題庫,并利用VBA工程來實現自動生成一份完整的Word 文檔試卷。
1 設計思路
1.1 VBA簡介
VBA是內嵌在Office應用套裝程序中的編程語言,VBA程序的運行需要依托于它的主應用程序(Word、Excel、Access等),VBA是Windows應用軟件的通用控制語言,利用VBA可以方便地調用和定制主應用程序的對象,通過VBA的開發,可以方便地實現辦公自動化。下面通過ExcelVBA實現考試試卷的自動生成。
1.2 功能設計
本系統要求在Excel工作簿中建設試題庫,本例中根據組卷的題型要求共創建了“選擇題”、“判斷題”、“填空題”、“簡答題”、“問答題”工作表,并創建一個“試卷生成表”工作表設置試卷模板,模板中將生成試卷的各題型的小題數目設置好,然后再通過VBA工程實現試卷隨機生成并輸出到Word 文檔。
2 系統實現
2.1 題庫設計
建立一個Excel工作簿文件,分別按題型將題目輸入相對應的工作表中,另建立一個試卷生成表的工作表,如圖1所示。
“試卷生成表”工作表中A列存放各類題題庫中的原始題號數據,B列存放各類題題型數據,C列中是具體各題所對應的題目內容數據,D列是各類題生成試卷后的小題號。在A1單元格中設置一個按鈕控制“生成試卷”,如圖2所示。
在表頭的C1單元格中輸入“=\"2009-2010年第一學期《計算機應用基礎》考試試卷\"D1”來設置生成試卷的類別“A卷”,試卷類別具體在D1單元格中列表存放,生成試卷前選擇所需類別就可;在B列中輸入公式“=IF($A2=\"\",\"\",\"一、填空題\")”來獲取與A列中相應的題號所對應的題型;在“試卷生成表”的C列存放題目內容,利用IF($A2=\"\",\"\",VLOOKUP($A2,填空題!$A:$C,2,))獲取相關聯數據,其中“VLOOKUP($A2,填空題!$A:$C,2,)”表示獲取與A2單元格中題號“21”一致的填空題表中的A~C列中第二列的數據,即通過此函數可獲取到相關的該題號所關聯的題目內容存放到C列,設置好試卷生成模板,達到了組卷的目的。
2.2 由題庫隨機生成試題
在VBA工程中對應每個題型模塊設置相應的宏代碼實現,下面是填空題的試題生成模塊代碼:
Sub 填空題()
Dim mr As Range
Dim tk As Integer
tk = Sheets(\"填空題\").[A65536].End(xlUp).Row – 1 ' 計算出所有填空題的總數
For Each mr In Range(\"a2:a11\")
Do
mr = Int(Rnd() * tk + 1)
Loop Until Application.CountIf(Range(\"a2:a11\"), mr) = 1
Next mr
選擇題 ' 調用執行選擇題模塊代碼
End Sub
其中 “Sheets(\"填空題\").[A65536].End(xlUp).Row – 1”用于計算題庫中填空題的總數目,“Range(\"a2:a11\") ”表示“生成試卷表”中填空題所存放的區域,“mr = Int(Rnd() * tk + 1)”實現在題目總數范圍內隨機獲取題號。語句“選擇題”表示在此調用執行選擇題模塊代來生成選擇題目內容,其它題型模塊代碼也是類擬的實現。執行完這些模塊代碼后就可在“試卷生成表”中生成一份試卷。
2.3 生成標準Word文檔試卷
老師的試卷最終是以Word文檔輸出打印的,“生成試卷”按鈕要完成的功能是隨機從相應題庫中抽取一定數量的題目到試卷生成表中,同時按設置格式輸出到Word文檔,生成一份可打印的Word文檔試卷。“生成試卷”按鈕單擊事件代碼實現如下:
Private Sub CommandButton1_Click()
Dim rng As Range
Dim rDATA As Range
Dim wd As Word.Application
Dim ret As Integer
ret = MsgBox(\"程序即將開始自動生成試卷!\" vbCrLf vbCrLf _
\"現在就開始嗎?\", vbYesNo + vbInformation, \"生成試卷\")
Call 填空題' 調用試卷生成模塊代碼生成試卷
If ret = vbNo Then Exit Sub
Set rDATA = Range(Range(\"Start\").Offset(1, 0), Range(\"Start\").End(xlDown))
Set wd = CreateObject(\"word.application\")' 創建 Word 實例
wd.Visible = True' 使 Word 可見
AppActivate wd.Name' 激活 Word 窗口
With wd
.Documents.Add
With .Selection
.ParagraphFormat.SpaceBeforeAuto = True
.Font.Size = 18
.Font.Bold = True
.Text = [C1]
.EndKey
.TypeParagraph
End With
With .Selection
.ParagraphFormat.SpaceBeforeAuto = True
.Font.Size = 14
.Font.Bold = False
.Text = [B1]
.EndKey
.TypeParagraph
End With
' 導入 Excel 文本
For Each rng In rDATA
With .Selection
' 插入分類
If rng.Offset(0, 1) <> rng.Offset(-1, 1) Then
.ParagraphFormat.SpaceBeforeAuto = True' 段前自動行距
.Text = rng.Offset(0, 1)
.Font.Size = 14
.Font.Bold = True 'wdToggle' 切換文本為加粗
' 設置底紋灰度級 25
.ParagraphFormat.Shading.BackgroundPatternColor = wdColorGray25
.EndKey ' 移到行末
.TypeParagraph ' 換行
.Font.Bold = wdToggle
' 取消底紋灰度級
.ParagraphFormat.Shading.BackgroundPatternColor = wdColorAutomatic
End If
' 插入問題
.ParagraphFormat.SpaceBeforeAuto = True
.Font.Size = 10.5
.Font.Bold = False ' wdToggle
.Text = rng.Offset(0, 3) \". \" rng.Offset(0, 2)
.EndKey
.TypeParagraph
End With
Next
' 設置頁腳
.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
.NormalTemplate.AutoTextEntries(\"第X頁 共Y 頁\").Insert Where:=.Selection.Range
.ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
End With
Set wd = Nothing
AppActivate Application.Name ' 激活 Excel 窗口
MsgBox \"試卷已生成, 請另行保存 Word 文檔.\"
End Sub
執行該代碼后可重新隨機在“試卷生成表”中生成試卷并按設置格式輸出到Word文檔,最終保存Word 文檔就是一份完整的試卷了,試卷界面如圖3所示。
本系統可用于期末考試的試卷生成,也能用于平時的單元測驗等,在題庫工作表中可以加入答案內容列,能類似地由本系統生成試卷答案文檔。如果要隱藏題庫工作表內容,可以通過“Sheet2.Visible = xlSheetVeryHidden”語句來實現,用這種方法隱藏的工作表無法通過“取消隱藏”來顯示工作表,能很好地保護數據。
3 結束語
本系統通過一個簡單的VBA工程實例就可完成了試題庫建設和試卷的自動生成,教師能對題庫進行編輯,修改,只需定制好每份試卷各題型的題目數,就可以自動生成試卷并輸出到Word文檔,基于ExcelVBA的試卷生成系統不需要另外選擇一種數據庫作為后臺數據庫,操作簡單,開發周期較短,有一定的實用性。
參考文獻:
[1] WZ坐標工作室.Excel函數/圖表應用技巧與綜合案例操作[M].北京:中國鐵道出版社,2008.
[2] Excel Home.Excel高效辦公公司管理[M].北京:人民郵電出版社,2008.
[3] 張智豐,張亞榮.基于ASP和VBA技術自動生成復雜word格式試卷[J].內蒙古民族大學學報:自然科學版,2009(11).