再厉害的人也不敢保证写程序能考虑的100%周全,像Windows系统、Office都不停的会有补丁更新bug,所以在程序里捕获错误就非常的有必要。
在VBA中,运行时错误发生的时候,会直接中断程序的运行,如果仅仅是程序的使用者,可能完全不会代码,那么出现这种中断程序的运行的状况,使用者就会不知所措了。如果能够在代码里捕获错误,并给出提示信息,那么使用者即使不懂代码,也能根据提示信息解决一些问题。
比如用VBA代码激活一个工作表,但这个工作表不存在的情况下:
代码语言:javascript复制Worksheets("ErrTest").Activate
程序被中断了,不懂VBA的人碰上这个肯定就不知道如何去处理了。
1、On Error语句:
在VBA里处理错误使用的是On Error语句:
代码语言:javascript复制Sub TestErr()
'出错的时候,程序跳转到标签ErrTest处
On Error GoTo ErrTest
Worksheets("ErrTest").Activate
'清除错误处理程序
On Error GoTo 0
Exit Sub
'标签ErrTest
ErrTest:
MsgBox "不存在的工作表:ErrTest"
'清除错误处理程序
On Error GoTo 0
End Sub
- 利用标签跳转
标签相当于就是在代码某一行命名,然后其他地方就可以使用GoTo进行跳转,标签使用比较简单,就像定义变量差不多,取一个合法的名字,在名字后面加上英文的冒号就可以。
上面程序的意思就是,在On Error GoTo ErrTest语句之后,一旦代码出现了错误,程序就会从出错的地方跳转到标签ErrTest,然后继续执行代码。On Error GoTo 0语句能够清除掉错误处理程序,也就是执行这个之后,On Error GoTo ErrTest就会没有效果了。
- Resume Next
另外一种方法是使用On Error Resume Next,这种方法会直接忽略掉错误语句,然后继续执行下一条语句,这个语句一定要慎用,一旦你在程序的开始使用了这条语句,那么程序是不会再提示错误了的,所有的错误语句都会被忽略掉。
2、使用举例
错误捕获上面已经有了使用的例子,这里介绍一种利用错误捕获的使用技巧。
比如需要判断一个工作表是否存在,一般这种需要循环遍历所有的工作表,然后判断是否与要查找的工作表名称相同,找到了相同的可以提前退出循环:
代码语言:javascript复制Function HasSht1(sht_name As String) As Boolean
Dim i As Long
For i = 1 To Worksheets.Count
If Worksheets(i).name = sht_name Then
'找到了相同的可以提前退出
HasSht1 = True
Exit Function
End If
Next
HasSht1 = False
End Function
使用错误捕获的方法:
代码语言:javascript复制Function HasSht2(sht_name As String) As Boolean
On Error Resume Next
'尝试激活工作表,不存在的工作表情况下会出错
ActiveWorkbook.Worksheets(sht_name).Activate
'没有错误的时候,ErrObject对象的Number等于0
If VBA.Information.Err().Number <> 0 Then
HasSht2 = False
Else
HasSht2 = True
End If
On Error GoTo 0
End Function
在程序里加上错误捕获是非常有必要的,因为作为写程序的人,必须要考虑到使用者的情况,给使用者出现运行时错误是不应该的,所以写程序的过程中,一定要非常严谨,尽量在所有的程序中都加上错误捕获的代码。