excel 当前一个连续调用的subs出现错误时停止处理

bn31dyow  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(166)

我有三个一个接一个地运行的子程序,这些子程序被称为DataTrimmingPivotEmail

Sub AllTogether()
    DataTrimming
    Pivot
    Email
End Sub

我在Sub DataTrimming内部放置了一个错误处理程序,因此当出现错误时,将显示错误消息并退出sub。
当我运行sub AllTogether时,当Sub DataTrimming出现错误时,它会显示错误消息,并继续运行sub Pivotsub Email
sub DataTrimming中发生错误时,有没有办法退出sub AllTogether,而不运行其余的subs?

jgwigjjp

jgwigjjp1#

使用On Error语句处理运行时错误并将执行重定向到行标签:

Sub AllTogether()
    On Error GoTo CleanFail

    DataTrimming
    Pivot
    Email

CleanExit:
    Exit Sub
CleanFail:
    'break here and debug if needed; use Resume without a label to get back to the failing call.
    Resume CleanExit
End Sub

如果任何被调用的过程都有自己的错误处理子例程,那么你需要在该过程中重新抛出错误,以便在AllTogether过程的作用域中处理它,使用Err.Raise,如下所示:

Sub DataTrimming()
    On Error GoTo CleanFail
    '...do stuff...
CleanExit:
    Exit Sub
CleanFail:
    '...handle errors locally
    Err.Raise Err.Number 'rethrows the same error with the same message
End Sub

注意,这些过程有一个时间耦合问题,因为它们显然是副作用过程,必须以特定的顺序调用。要解决这个问题,您可以将DataTrimming转换为Function过程,该过程返回Pivot过程需要作为参数接收的数据;类似地,使Pivot成为一个函数,返回Email过程需要作为参数的数据,将消除耦合并减少(或消除!)对全局状态的依赖-最终它可能看起来像这样:

Dim trimmedData As Object
Set trimmedData = DataTrimming

Dim pivotedData As Object
Set pivotedData = Pivot(trimmedData)

Email pivotedData

参见this post,了解在过程之间传递数据而不涉及全局变量的各种方法。

v09wglhw

v09wglhw2#

一种方法是将DataTrimming、Pivot和Email这三个子函数改为Functions,每个子函数返回一个布尔值,每个子函数返回True,除非它们遇到错误,在这种情况下返回False。
在Allogether()中,在继续透视之前检查从DataTrimming返回的值(如果为False,则退出Sub),并在继续从透视到电子邮件时检查相同的值。

unftdfkk

unftdfkk3#

过程间错误处理

  • 您可以将DataTrimming过程重写为返回布尔值的函数(例如,如果成功,则为True),并在调用过程中使用该布尔值(尽管给予它一个更好的名称)。
Option Explicit

Sub AllTogether()
    
    If wasDataTrimmingSuccessful Then
        Pivot
        Email
    End If
    
End Sub

Function wasDataTrimmingSuccessful() As Boolean
    
    On Error GoTo clearError
    
    
    ' DataTrimming code in here
    
    
    wasDataTrimmingSuccessful = True
    
ProcExit:
    
    Exit Function

clearError:
    'Debug.Print "Run-time error '" & Err.Number & "':" & Err.Description
    Resume ProcExit

End Function

相关问题