一、引言
建立完善的题库是课程建设的一项重要工作,当数据库的形式进行题库管理,通过编写抽题程序,在分类明确、题量丰富的题库支持下,实现自动组卷并非难事。试卷一般都采用Word文档,若采用VBA编程,要用程序将试题写入到Word文档,可以通过引用 Microsoft Word 9.0 Object Library中的相关对象来实现:图片、图形、文本框及艺术字等可利用Shapes集合对象的相应方法加入到文档中;表格也可以通过Tables集合对象的Add 方法加入,其大小、位置等排版信息都可以以参数的形式传入;而文字部分的内容也能以字符串的形式通过调用Content对象的InsertAfter方法插入,排版时对其字型、字体、字号及段落格式则可以利用Font对象及Paragraph对象的属性或方式进行设置。
选择题是各类试卷中经常出现的题型,而它的排版有其特殊性,因为选择题的四个选项根据其长度有可能排成四段(行),也可能排成两行,每行两个选项,且它对段落缩进及上、下行中选项的对齐等都有一定的要求。
这里要解决的几个问题是:
1.题干部分的题号对齐,尤其是一位数题号与两位数题号(如第9题与第10题);前、后题题干内容的第一个字符对齐;题干部分作为段落要采用悬挂缩进、且缩进量应合适。
2.若选项由四段(行)构成,则每段应有左缩进、缩进量与题干部分的悬挂缩进量相同,同时,选项内容的长度也有可以超过一行(如第10题中的选项C),所以对选项也要设置悬挂缩进、且缩进量应合适。
3.若选项由两行构成(如第11题中的四个选项),则上一行的选项C与下一行的选项D应对齐。
二、定义选择题的数据结构
程序设计中为了便于将选择题作为函数的参数传递,应定义选择题的数据类型的结构,选择题的结构通常由题干及四个选项构成,具体定义如下:
Public Type Choice
Sentence As String '题干内容,不包括题号
ChoiceA As String '选项A的内容
ChoiceB As String '选项B的内容
ChoiceC As String '选项C的内容
ChoiceD As String '选项D的内容
End Type
三、页面设置与段落格式
首先进行页面设置,页面上边距、下边距、左边距、右边距分别设为1英寸、1英寸、1.25英寸、1.25英寸, 默认制表位长度为0.33英寸。
With ActiveDocument.PageSetup
.TopMargin = InchesToPoints(1)
.BottomMargin = InchesToPoints(1)
.LeftMargin = InchesToPoints(1.25)
.RightMargin = InchesToPoints(1.25)
End With
ActiveDocument.DefaultTabStop = InchesToPoints(0.33)
为了对题干部分进行排版,先自定义一个过程insTabIndent,其功能是根据第一个参数str1传入的题干内容及第二个参数Num传入的本题题号,在题干内容前加上题号,若Num为0,则表示不加题号;在题号后设置一个制表位,使前、后题的题干内容的第一个字符对齐;对题干所在段落设置悬挂缩进一个制表。
Private Sub insTabIndent(str1 As String, Num As Integer)
Dim s As String
If Num < 10 Then s = " " + Trim(str(Num)) + "." Else s = Trim(str(Num)) + "."
If Num = 0 Then s = ""
Set myRange = appObj.ActiveDocument.Content
myRange.Collapse Direction:=wdCollapseEnd
myRange.InsertAfter s & vbTab & str1
myRange.InsertParagraphAfter
myRange.Font.Name = "宋体"
myRange.Font.Size = 12
myRange.ParagraphFormat.TabHangingIndent 1 '悬挂缩进1个制表位
End Sub
为了对选项进行排版,自定义一个过程insLeftAndHangingIndent,其功能是根据参数str1传入的选项内容,将其作为段落写入Word文档,设置字型、字体、字号及左缩进和悬挂缩进。
Private Sub insLeftAndHangingIndent(str1 As String)
Set myRange = ActiveDocument.Content
myRange.Collapse Direction:=wdCollapseEnd
myRange.InsertAfter str1
myRange.InsertParagraphAfter
myRange.Font.Name = "宋体"
myRange.Font.Size = 12'小四
'设置左缩进与悬挂缩进
myRange.ParagraphFormat.FirstLineIndent = CentimetersToPoints(-0.64)
myRange.ParagraphFormat.LeftIndent = CentimetersToPoints(1.48)
End Sub