返回首页
当前位置: 主页 > Excel教程 > Excel VBA教程 >

Excel/VBA的错误处理基础教程(2)

时间:2014-04-30 23:04来源:Office教程学习网 www.office68.com编辑:麦田守望者

在子函数和母函数处理错误时,有两个问题值得讨论:1)子函数的Err变量信息是否传回给母函数;2)子函数的错误是否会触发母函数的错误处理程序。

结合MSDN相关文档和各种测试案例,我发现:

  • 母函数在进入子函数时,Err变量保存不变,错误信息传入子函数,但不会触发子函数的错误处理程序。
  • 子函数在On Error Resume Next后形成的错误信息会将向上传递给母函数,但不会触发母函数的错误处理。
  • 子函数在On Error Goto Line后形成的错误信息不会向上传递给母函数,也不会触发母函数的错误处理。
  • 子函数在On Error Goto Line跳转后处理错误过程中一旦形成新错误,将触发母函数的错误处理程序;同时如果母函数的错误处理方式是On Error Resume Next,子函数继续运行,并且子函数的错误信息将传给母函数;如果母函数错误方式是On Error Goto Line,子函数终止运行,跳回母函数的错误处理处,但子函数的错误信息并不会向上传递给母函数(即这种情况下,母函数只知道子函数有错位未被处理,但不知道任何错误信息)。

第四种情况子函数错误触发母函数的错误处理程序的原因是当子函数的isErrorHanderActive == True时,子函数的错误处理将被母函数接管,此时子函数一旦出错,错误上传的方式和第二条第三条的一样的,只不过决定于母函数的错误处理方式是「On Error Resume Next」还是「On Error Goto Line

下面这几个测试案例展示了上述行为特征:

Sub Demo4()
    On Error GoTo err_hander1
    Call Demo4_Sub1
    Debug.Print "Err in sub1:" & Err.Description ' Err description = ""

    On Error GoTo err_hander2
    Call Demo4_Sub2
    Debug.Print "Err in sub2:" & Err.Description ' Err description <> ""

    On Error GoTo err_hander3
    Call Demo4_Sub3
    Debug.Print "Err in sub3:" & Err.Description ' Err description = ""

    On Error Resume Next
    Call Demo4_Sub4
    Debug.Print "Err in sub4:" & Err.Description ' Err description <> ""

    Exit Sub
err_hander1:
    Debug.Print "err_hander1 incurred"  ' not incurred
    Resume Next

err_hander2:
    Debug.Print "err_hander2 incurred" ' not incurred
    Resume Next

err_hander3:
    Debug.Print "err_hander3 incurred" ' incurred
    Resume Next

err_hander4:
    Debug.Print "err_hander4 incurred" ' incurred
    Resume Next
End Sub

Sub Demo4_Sub1()
    On Error GoTo err_hander

    Dim i As Long
    i = 1 / 0

    Exit Sub
err_hander:
    Resume Next
End Sub

Sub Demo4_Sub2()
    On Error Resume Next

    Dim i As Long
    i = 1 / 0
End Sub

Sub Demo4_Sub3()
    On Error GoTo err_hander

    Dim i As Long
    i = 1 / 0

    Exit Sub
err_hander:
    i = 1 / 0
    Resume Next
End Sub

Sub Demo4_Sub4()
    On Error GoTo err_hander

    Dim i As Long
    i = 1 / 0

    Exit Sub
err_hander:
    i = 1 / 0
    Resume Next
End Sub

6.其它一些注意点

6.1.警惕 On Error Resume Next的副作用

一旦启用On Error Resume Next,所有错误都会被自动略过。除非有足够信心,不要用它。启用之后也尽快使用On Error Goto 0关闭它。

另外还要注意副作用。比如If的条件一旦出错,If内部的语句将被执行,这和直观想象并不相符。

Sub Demo6()
    On Error Resume Next
    Dim i As Long
    i = 0
    If 0 / 0 Then i = 1

    MsgBox i  ' i = 1
End Sub

6.2.单元格错误也会触发VBA错误

在VBA中引用单元格的值,如果单元格里是一个公式并且公式出错,那么VBA中连带会抛出一个错误。

6.3.选项中可选强制发生错误时中断程序

在VB编辑器的 工具 - 选项 - 通用 - 错误捕获 选项里,可以强制在程序发生错误时中断程序。这在调试程序时非常有用。

6.4.编程小细节

1)在错误处理程序之前添加Exit Sub或Exit Function,避免程序位出错时也运行错误处理程序。

2)在每个错误程序后都添加Resume、Resume Next、Exit Sub或Exit Function,避免从当前错误处理之后继续运行后面的错误处理程序。

------分隔线----------------------------
标签(Tag):excel excel2007 excel2010 excel2013 excel2003 excel技巧 excel教程 excel实例教程
------分隔线----------------------------
推荐内容
猜你感兴趣