【问题标题】:Nested Error Handling in Excel VBAExcel VBA 中的嵌套错误处理
【发布时间】:2017-10-02 15:34:56
【问题描述】:

我试图在 Excel VBA 的错误处理程序中运行错误处理程序,但第二个错误处理程序从未运行。它只是给我一个错误信息。这是我的代码。

Sub func()
   On Error GoTo error1 
   'code
   Exit Sub

error1:
   On Error GoTo error2
   'code
   Resume Next

error2:
   'code
   Resume Next

基本上,该函数可能会遇到 2 个可能的错误。我尝试运行代码,如果遇到错误,它会尝试修复 error1,如果失败,则 error2 将修复它。调试适用于 error1,但如果 error2 是问题所在,代码就会失败。

【问题讨论】:

  • 我认为这是因为您还没有处理第一个错误,而且我不确定On Error 在程序主体之外是否能正常工作。但是,这么说 - 在你的 Error1: 标签之后添加 On Error GoTo -1,看起来它会继续到 Error2。在我的测试中,我将Debug.Print 1/0 放在您的第一个错误陷阱中,它跳转到Error2,然后由于Resume Next 而返回,然后再次运行Error2,因为这就是代码流程的工作原理......
  • @DarrenBartrup-Cook Yuck!一旦你将它添加到你的代码中,我认为你有麻烦了!
  • @Rory 是的,不能不同意这一点。几个月前才发现将其设置为-1,但看不到使用它的理由。我更喜欢一开始就尝试阻止代码跳转到错误例程 - 只有当它是我没有考虑的错误时。
  • 我试过了,它跑了四次 error2
  • 您对如何处理 2 个潜在错误有任何建议

标签: excel error-handling vba


【解决方案1】:

这是基于密码字符抛出两个特定错误的方法:

Sub Bar()

    Dim password As String

    On Error GoTo err1

    password = "asd^"

    If InStr(1, password, "&") Then Err.Raise 9990, Description:="No &!"
    If InStr(1, password, "^") Then Err.Raise 9991, Description:="No ^!"

    Exit Sub
err1:

Select Case Err.Number
    Case 9990:
        Debug.Print Err.Description
    Case 9991:
        Debug.Print Err.Description & ":("
End Select

End Sub

正如@Darren Bartup-Cook 在 cmets 中提到的那样,这是一种使用-1 的可能方法。但是,强烈不建议,除非您不想出于自己的原因编写糟糕的代码:

Sub Bar()

    On Error GoTo err1
    Debug.Print 0 / 0
    Exit Sub

err1:

    Debug.Print "err1"
    On Error GoTo -1
    On Error GoTo err2

    Debug.Print 5 / 0
    Debug.Print "Just testing..."

err2:
    Debug.Print "err2"

End Sub

有很多更好的方法可以做到这一点,如果您想捕获 2 个错误,请尝试以下方法:

Sub Bar()

    On Error GoTo err1

    Debug.Print 4 / 0

    On Error Resume Next
    Exit Sub

err1:
    Select Case Err.Number

    Case 6:
        Debug.Print "Overflow!"
    Case 11:
        Debug.Print "Division by 0 error!"
    Case Else:
        Debug.Print "Another error!"
    End Select

End Sub

它会捕获 Div/0Overflow 并在即时窗口中为您提供有关它们的信息。

【讨论】:

  • 我试图捕捉用户输入错误。例如,如果用户需要创建一个不包含 & 或 ^ 的密码,那么如果 pw 包含 & 则我想创建一个错误处理程序,如果 pw 包含 ^ 则创建另一个错误处理程序。我知道在这个例子中你可以搜索字符串而不是进行错误处理,但我希望尽可能通过错误处理提供解决方案
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多