错误捕获

2020-07-28 11:45:31 浏览数 (1)

再厉害的人也不敢保证写程序能考虑的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

在程序里加上错误捕获是非常有必要的,因为作为写程序的人,必须要考虑到使用者的情况,给使用者出现运行时错误是不应该的,所以写程序的过程中,一定要非常严谨,尽量在所有的程序中都加上错误捕获的代码。

vba

0 人点赞