繁体   English   中英

从子调用/运行子时,Excel VBA错误处理

[英]Excel VBA error handling when calling/run sub from sub

有一些问题可以理解当您从sub调用/运行sub或函数时如何处理错误。

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

  • 如果被调用子中的错误处理具有“退出子”或“退出功能”,则源子将继续运行吗?

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

非结构化异常处理-微软定义的结构化异常处理(与结构化异常处理相对)不是最好的事情,并且可能会令人费解。

因此,在此示例中,如果从某个调用站点调用了子对象...

1.没有错误调用TestMinorSub之后,该子程序继续前进,直到它通过exit子程序退出。

2. TestMinorSub中存在错误,并且TestMinorSub具有错误处理程序。 这将根据错误在此函数中的定义方式处理错误。 此函数可以消除错误,也可以使用Err.Raise将其重新引发到Testing子项。

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

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

要回答第一个问题,请看以下代码片段。 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"行。

要回答您的第二个问题,如果您取消注释AnotherSub的错误处理( On Error Goto Err: ), AnotherSub将处理该错误,因此, SourceSub将运行到完成,这是由显示源已完成的消息框指示的。

这意味着,只要您在相关过程中处理错误,“ Exit Function或“ Exit Sub就不会起作用。

从这里开始错误处理。

  On Error GoTo ErrorHandling 

如果有错误,请转到ErrorHandling
如果没有错误,则下一个代码将运行。 如果没有错误,子程序将在“退出子程序”之前退出

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

如果有错误,则将代码转到该位置,并将运行以下行并转到“ ExitHandling”:
错误处理:MsgBox错误描述继续退出处理

End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM