从sub调用/ run sub时的Excel VBA错误处理

时间:2016-01-12 13:43:12

标签: excel vba excel-vba

有些问题需要了解从sub。

调用/ run sub或function时的错误处理方式。

  • 如果在被叫子中没有错误处理,源子句的错误处理是否适用?

  • 如果被叫子中的错误处理有"退出子"或"退出功能"源子继续运行吗?

ASD ASD

Sub Testing()
    On Error GoTo ErrorHandling
        Application.ScreenUpdating = False
        Application.Calculation = xlCalculationManual
        Application.EnableEvents = False

    Call TestMinorSub

        ExitHandling:
            Application.ScreenUpdating = True
            Application.Calculation = xlCalculationAutomatic
            Application.EnableEvents = True
            Exit Sub

        ErrorHandling:
            MsgBox Err.Description
            Resume ExitHandling
        End Sub

3 个答案:

答案 0 :(得分:3)

非结构化异常处理 - 正如Microsoft定义的那样(与结构化异常处理相对)并不是最好的事情,并且可能会非常复杂。

所以在这个例子中,如果从某个调用站点调用sub ...

<强> 1。没有错误 在调用TestMinorSub后,sub继续运行,直到它通过exit sub退出。

<强> 2。 TestMinorSub中存在错误,并且TestMinorSub具有错误处理程序。 这将根据其在此函数中的定义来处理错误。这个 函数可以吞下错误或使用Err.Raise将其提升回Testing sub。

第3。 TestMinorSub中存在错误,TestMinorSub没有错误处理程序。 这将遍历处理程序的调用堆栈并跳回到将处理它的Testing函数。它将跳转到ErrorHandling标签(这是此函数的偶数处理程序),它通过消息框显示错误。然后它继续到标签ExitHandling,它将在退出函数之前执行剩余的代码。

这种类型的代码路径对于VBA来说非常常见,并且可能比您的示例复杂得多。基本上,开发人员试图捕获错误,并在错误执行一些清理代码之后,在例程结束之前。

答案 1 :(得分:2)

要回答第一个问题,请查看以下代码段。 AnotherSub中没有错误处理,因此SourceSub的错误处理开始了:

Sub SourceSub()

On Error GoTo Err:

Call AnotherSub

MsgBox "Source completed"
Exit Sub

Err:

MsgBox "An error occurred in source"

End Sub

Sub AnotherSub()

'On Error GoTo Err:

MsgBox Application.WorksheetFunction.Match("1", "abcd", 0)
Exit Sub

Err:

MsgBox "An error occurred in ANotherSub"

End Sub

因此,SourceSub无法完成,因为您可以看到行MsgBox "Source completed"未执行。

要回答您的第二个问题,如果您取消注释AnotherSubOn Error Goto Err:AnotherSub的错误处理将处理错误,那么SourceSub将运行到完成显示源已完成的消息框指示完成。

这意味着,只要您在相关程序中处理错误,Exit FunctionExit Sub就无法发挥作用。

答案 2 :(得分:1)

这里开始错误处理。

  On Error GoTo ErrorHandling 

如果错误则转到ErrorHandling
如果没有错误,则下一个代码将运行。 如果没有错误,sub将在“Exit Sub”之前退出

ExitHandling:
  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
  Application.EnableEvents = True
  Exit Sub

如果出现错误,代码就会到达这个地方并运行这些行并转到“ExitHandling”:
    ErrorHandling中:       MsgBox Err.Description       恢复ExitHandling

End Sub