VBA在Office自测系统开发中的应用

来源:互联网 发布:七天网络查分注册登录 编辑:程序博客网 时间:2024/04/30 01:27

    为了适应高职学校教学改革的需要,逐步实现基础课程考试选题随机化,考点全面化,评分自动化的目标,主讲教师结合自身教学经验和学科特点,开发一个用于学生自学、自测、考核的系统是很必要的。本文结合Office自测系统WordExcel部分的开发的实例,介绍了利用VBA进行高效开发的方法。

一、     Microsoft WordExcel对象

Visual Basic支持一个对象集合,该集合中的对象直接对应于Microsoft Word 97中的元素,并且通过用户界面,用户熟悉这些元素中的绝大多数。例如,Document对象代表了一个打开的文档,sheets对象代表了一个工作簿中的工作表,而Selection对象则代表了在一个文档或工作表中的选定内容。在WordExcel中,每一类元素都可以用Visual Basic的对象来表示。

对象名

说明

Word常用

对象

Application对象

在用户启动一个Word 时段的同时,也创建了一个Application对象。用户可以使用Application 对象的属性或方法来控制或返回应用程序范围内的特性、控制应用程序窗口的外观或者调整Word 对象模型的其他方面。可以使用Application属性来返回Word Application 对象。

Document对象

当用户在Word中打开或创建一个文件的同时,也创建了一个Document对象。用户可以使用Document对象或Documents集合的属性或方法来打开、创建、保存、激活或者关闭文件。

Range对象

当使用Visual Basic时一个常见的任务就是在文档中指定一块区域,然后对它进行处理,比如插入文字或应用格式等。

Selection对象

用户想要自己的代码对选定内容做出响应或是改变选定内容,可以通过Selection对象来完成任务。

FindReplacement对象

可以使用FindReplacement对象来查找并且替换文档中文字的特定范围。

Table, Column, RowCell对象

Word对象模型包含了表格对象,也包含了表格中各种不同元素的对象。可以随同Document对象、Range对象、Selection对象使用Table属性来返回Table集合。可以随同Column对象、 Range 对象、Row对象或 Selection对象使用Cells属性来返回Cells集合。


对象名

说明

Excel常用

对象

Application对象

Excel Application 对象表示 Excel 应用程序本身。Application 对象提供了大量有关正在运行的应用程序、应用于该实例的选项以及在该实例中打开的当前用户的对象的信息。

Workbook 对象

Workbook 类表示 Excel 应用程序内的单个工作簿。Application 类的许多成员同时也是 Workbook 类的成员。在这种情况下,属性应用于特定的工作簿(而非应用于活动工作簿)。

Worksheet 对象

虽然 Worksheet 类提供了大量成员,但大部分属性、方法和事件都与 Application / Workbook 类提供的成员相同或相似。Excel 提供 Sheets 集合作为 Workbook 对象的属性。

Range 对象

Range 对象是 Excel 应用程序中最常用的对象。在能够处理 Excel 内的任何范围之前,必须将它表示为 Range 对象,并处理该对象的方法和属性。Range 对象表示一个单元格、一行、一列、包含一个或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个工作表中的一组单元格。

PivotTable Chart对象

PivotTable对象是数据透视表对象。

Chart对象是图表对象。

 

二、     Office开发工具集

VBA Visual Studio Tools for Office是最常用的两种构建office解决方案的技术。对于多种解决方案,通常可以选择任意一种技术,甚至可以同时使用这两种技术(不过这一方法有可能限制在随着时间的推移要从VBA进行迁移的过渡项目)。

Visual Studio Tools for Office理所当然地占据了高端,并向下扩展到低端,但它不提供宏录制功能。这也是VBA仍然充当基于用户交互的非专业解决方案的唯一工具的领域的原因之一。在本例中,仍然采用VBA作为基本开发工具,然后将其代码移植到VB中,加快开发进度。

以上简要地介绍了WordExcel中的对象以及Office开发工具,下面我们来探究一下如何将Word中自动录制的宏代码转换为自动评分的代码。

三、     Word自测模块开发实例

第一步:录制制作标准答案文档过程的宏代码。

VBA1

注:下面只列出考试题目要求的部分代码,其他代码略。

Sub Macro1()

      

       Selection.TypeText Text := “斑马世界                '插入标题“斑马世界”

      

       Selection.Font.Name = “隶书                       '标题字体为隶书

       Selection.Font.Size = 22                           '标题字号为二号

       Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter

'标题对齐方式为居中

      

       With Selection.ParagraphFormat

             

              .CharacterUnitFirstLineIndent = 3                                '正文首行缩进3个字符

             

       End With

      

End Sub

第二步:在第一步的基础上,编制新宏。在新宏中,针对考试原始文档中的位置,按考试题目要求创建新宏。运行此宏,即可将原始文档变为标准答案文档。

VBA2

Sub test1()

'标题字体设为隶书,字号二号,居中

       Set myRange1 = ActionDocument.Range (Start:=0, End:=4)

       With myRange1

       .Font.Name = “隶书

       .Font.Size = 22

       .ParagraphFormat.Alignment = wdAlignParagraphCenter

       End With

'正文段落首行缩进3个字符

       Set myRange2 = ActiveDocument.Range (Start:=5, End:=339)

       With myRange2.ParagraphFormat

              .CharacterUnitFirstLineIndent = 3

       End With

       '中间代码略

End Sub

第三步:在第二步的基础上,加入条件语句。运行此宏,可在活动文档的TextBox控件中显示得分。

VBA3

       Sub test2()

       Dim n as Integer   '定义分数累加变量

       n = 0

       '标题字体设为隶书,字号二号,居中的判定

              Set myRange1 = ActiveDocument.Range (Start:=0, End:=4)

              If myRange1.Font.Name = “隶书” Then n=n+1

              If myRange1.Font.Size = 22 Then n=n+1

              If myRange1.ParagraphFormat.Alignment = wdAlignParagraphCenter Then n=n+1

       '正文段落首行缩进3个字符的判定

              Set myRange2 = ActiveDocument.Range (Start:=5, End:=339)

              With myRange2.ParagraphFormat

                     If .CharacterUnitFirstLineIndent = 3 Then n=n+1

              End With

              '中间代码略

              ThisDocument.TextBox1.Text = n       'TextBox中显示得分

       End Sub

步骤三做出的只是一个简单的自测文档,下面我们要将上面的代码移植到VB中,转化为窗体中的事件代码。只有这样VBA代码才能在Office自测系统中发挥作用。

第四步:代码移植。

VB的窗体中插入OLE控件,链接到考试原文件,然后插入一个按钮、一个文本框。单击提交按钮,就可以得到目标文档的分数。

VB1Word自测窗体的代码

Dim a As Word.Document     '定义aWord文档对象

Private Sub Command1_Click()                 

Set a = OLE1.Object      '使a指向目标文档

Dim n As Integer

n = 0

'标题字体设为隶书,字号二号,居中的判定

       Set myRange1 = a.Range (Start:=0, End:=4)

       If myRange1.Font.Name = “隶书” Then n=n+1

       If myRange1.Font.Size = 22 Then n=n+1

       If myRange1.ParagraphFormat.Alignment = wdAlignParagraphCenter Then n=n+1

'正文段落首行缩进3个字符的判定

       Set myRange2 = a.Range (Start:=5, End:=339)

       If myRange2.ParagraphFormat.CharacterUnitFirstLineIndent = 3 then n=n+1

       Text1.Text = n              '显示得分

End Sub

四、     Excel自测模块开发实例

Excel自测模块的开发步骤与Word部分的相同。这里仅提供移植后的部分代码和结果。

VB2Excel自测窗体的代码

Dim a As Excel.Workbook     '定义aExcel工作簿对象

Private Sub Command1_Click()

Set a = OLE1.Object          '使a指向目标文档

Set b = a.Sheets(1)         'ba的第一张工作表

Dim i As Integer

    i = 0

    If (b.Name = "排序") Then i = i + 1      '工作表名称判定

If (b.Range("F2").FormulaR1C1 = "=SUM(RC[-3]:RC[-1])") Then i = i + 1

'求和公式应用判定

'按班级升序、总分降序、方法笔画进行排序的判定

If (b.Range("A1:F7").Sort(Key1:=b.Range("B2"), Order1:=xlAscending, _

    Key2:=b.Range("F2"), Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, _

    MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlStroke, _

    DataOption1:=xlSortNormal, DataOption2:=xlSortNormal)) Then

    i = i + 1

End If

Label1.Caption = i    '显示得分

End Sub

五、     总结

在开发过程中,首先要会熟练地录制宏,会熟练地使用Visual Basic编辑器。这一点并不困难,在与Office相关的书籍中都有介绍。

其次,还要会精确的定位考核的位置。

例如,可以用以下代码定位Word文档的前四个字符。

    Set myRange1 = ActiveDocument.Range(Start:=0, End:=4)

用以下的代码定位示例文档的第二段。

Set myRange3 = a.Range(Start:=86, End:=143)

虽然看似麻烦,但只要配合Word工具菜单的字数统计菜单项,精确定位就会容易许多。对于Excel工作表中单元格的定位则相对简单,只要查看录制的宏即可。当然,也要清楚Excel以坐标定位的习惯和相关函数的用法。

另外,要熟悉Office中的所有与开发相关的对象的用法。这一点并不容易,我们可以选中VB编辑器中陌生的对象或方法按F1找到相关信息,或向Web上的MSDN寻求帮助,在其上有大量的官方技术文件,都非常的有建设性。

最后,就是代码移植的部分。我们都知道VBAVB本是一家,VBA的代码完全可以与VB代码实现无缝连接,这就是我们采用VBA作为中间开发工具的原因。通过录制目标文档或工作表等的宏代码,获得需要的相关数据,加入条件判定语句就可以得到自动评分的代码,再移植到VB中,就大功告成了。如果开发熟练,完全可省略开发实例中的第三步。

本文应用VBA进行快速开发的方法同样适用于Office的其它组件。