在程序运行过程中,总会或多或少地遇到各种各样的错误,这些错误大致可分为以下几类:
语法错误:指程序的某一语句的语法出现错误,如左右引号或括号不匹配等。当程序设计人员输入完一行语句时,Visual Baisc编辑器会自动检测语法错误,并提醒程序员错误所在。
编译错误:指在程序的编译过程中检测出来的错误。只检测单行语句是不能发现编译错误的。例如,以For Each开始的循环结构没有Next语句。通常语法错误和编译错误是容易发现和改正的。
逻辑错误:指思维错误——导致程序运行结果与程序员的预期结果不同的编程思路错误。例如,想把工作簿的标题改为“My Workbook”,却拼写成“My Werkbook”;应该是“>=”却写成“>”等等。逻辑错误是最常见也是最麻烦的一类错误,程序调试的大部分时间都耗费在发现和纠正逻辑错误上。一般可通过设置断点、单步执行、观察值的变化来发现和纠正逻辑错误。
实时错误:指在程序运行过程中发现的错误。有时过程中的某条语句在某些条件下能正确执行,而在另一些条件下就不能正确执行。例如,有一条语句用于打开硬盘上某个文件,若文件存在,可以打开,语句执行正确;若文件不存在,怎么打开?在实时错误中,有些是Visual Baisc能指出错误所在的,有些是程序员能预料的、能让Visual Baisc自动处理的。
在程序调试过程中,VBA提供了各种强有力的调试工具来查找和纠正错误。
“代码”窗口:在中断模式下运行宏时,可以通过“代码”窗口来仔细地观察宏的执行过程,也可以通过将鼠标指针指向某变量来检测变量的值。此时,在“代码”窗口内,准备执行的语句以黄色高亮方式显示,在其左边有一个黄色箭头。
“本地”窗口:在运行一个宏时,可以通过“本地”窗口观察宏程序所使用的变量、表达式、对象的变化来寻找程序错误;也可在“本地”窗口直接改变属性值,这与用VBA语句改变属性具有同样的效果;还可以通过“本地”窗口快速浏览某个对象的所有属性。它清楚地显示了哪些是包含值的属性(在值栏中有值的属性)和哪些是包含对象引用的属性(在旁边有加号的属性)。通过单击属性的值看它能否改变,能很容易地发现具有值的属性是不是只读的。
“立即”窗口:在程序调试中,有时需要给某一变量指定一个新值,或输出显示某些变量的值,对此使用“立即”窗口最为方便。在“立即”窗口,可以输入任何语句并立即执行它。例如,要查看活动工作簿中所有工作表的名称,则可在“立即”窗口中键入语句For Each x in Workskeets: ?x.Name:Next x。通常,在“立即”窗口中,一条语句占一行,当多条语句排列在一行上时,要用冒号将其分开。并且在“立即”窗口中大都使用简短、无意义的变量名,这并不影响语句的执行。
“监视”窗口:在执行宏前,或进入中断模式后,打开“监视”窗口,添加监视表达式以便观察关键的测试变量或表达式随宏执行的变化情况。在“监视”窗口中添加监视表达式的方法是:使用鼠标选中监视表达式,再单击“调试”菜单上的“添加监视”或“快速监视”命令。要移去监视的变量,只需单击该变量,再按Del键。
Sub MakeNextStudent( )
Dim Sheet As Worksheet
Dim Base As String
Dim Suffix As Integer
Set Sheet = WorkSheets.Add
Base = “Student”
Suffix = 1
On Error Resume Next
Sheet.Name = Base & Suffix
Do Until Err.number = 0
Err.Clear
Suffix = Suffix + 1
Sheet.Name = Base & Suffix
Loop
End Sub
MakeNextStudent宏的执行过程是:先建立一个新工作表,再试着以Student为基本名、1为后缀构成的名称给新工作表命名。On Error Resume Next语句的作用是:若已有同名工作表存在,Excel不能给新工作表命名时,Visual Baisc并不终止所执行的程序,而是自动给Err对象的Number属性赋值,设置出错信息代码,执行Do Until循环。Do Until循环首先检查命名是否成功,若不成功,则增加后缀值,再试着重新命名,再检查……直到没有产生错误(即重新命名成功Err.Number=0),才结束循环。
Do语句后面的Err.Clear语句的作用是将出错信息代码重新置为0,让Visual Baisc忘记曾经发生的错误。
例2,下面宏的功能是:当试图删除打开的文件时,错误处理例程先调用MsgBox函数提示用户文件正在使用,让用户确认是否要删除该文件,再作相应的处理。
Sub KillFile( )
On Error GoTo KillFile_Err
Open "MyFile" For Output as #1
Kill "MyFile"
Exit Sub
KillFile_Err:
myCheck = MsgBox("MyFile文件正在使用,是否要删除?", vbYesNo)
If myCheck = vbYes Then
Close #1
Kill "MyFile"
End If
End Sub
综上所述,VBA为程序的调试、查错、纠错以及错误处理提供了方便的工具和方法,是一个优秀的程序设计环境。