【问题标题】:VBA: Error handling with labels and "On Error GoTo"VBA:使用标签和“On Error GoTo”进行错误处理
【发布时间】:2019-10-13 05:01:09
【问题描述】:

我有多个程序,如下所示。代码本身是功能性的,并且做了它应该做的事情,但是现在我有一个关于错误处理的问题和一个问题:

  1. 如何使用On Error GoTo 0:

导致我遇到麻烦的错误发生在mySlide.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile 行中。据我了解,On Error GoTo 0 将错误处理重置为 VBA 中的默认行为,这意味着我应该以正常的 VBA 方式显示错误。所以我在这里使用了两次:一次直接在我粘贴我复制的内容的行之后,一次直接在调用ErrorHandler1(和2)之后。这有意义吗?我的理由是,对于On Error GoTo ErrorHandler1,我只想捕获错误-2147188160,而在其余代码中我想要正常的VBA错误消息。那里不太可能发生错误,因为没有很多代码,但仍然存在。

 Sub SubSlide1(wsKAP As Worksheet)

    Set mySlide = myPresentation.Slides(1)

RepeatOnError1:  
    Set rng = wsKAP.Range("AC2:AN29")
    rng.Copy
    DoEvents
    On Error GoTo ErrorHandler1
    mySlide.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile
    On Error GoTo 0
    Set myShape = mySlide.Shapes(mySlide.Shapes.Count)
    With myShape
        .Left = 20
        .Top = 48
        .Width = 623
    End With

RepeatOnError2:
    wsKAP.Columns("K:M").EntireColumn.Hidden = False
    On Error GoTo 0
    Set rng = wsKAP.Range("A187:V199")
    rng.Copy
    DoEvents
    On Error GoTo ErrorHandler2
    mySlide.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile
    Set myShape = mySlide.Shapes(mySlide.Shapes.Count)
    With myShape
        .Left = 20
        .Top = 363
        .Width = 663
    End With
    wsKAP.Columns("K:M").EntireColumn.Hidden = True
    Application.CutCopyMode = False

    Exit Sub

ErrorHandler1:
    On Error GoTo 0
    If Err.Number = -2147188160 Then
        Call ErrorHandling(1)
    Else
        MsgBox "Fehler: " & Err.Number & ": " & Err.Description & vbNewLine & "Makro wird weiter ausgeführt."
    End If
    Resume RepeatOnError1

ErrorHandler2:
    On Error GoTo 0
    If Err.Number = -2147188160 Then
        Call ErrorHandling(2)
    Else
        MsgBox "Fehler: " & Err.Number & ": " & Err.Description & vbNewLine & "Makro wird weiter ausgeführt."
    End If
    Resume RepeatOnError2
End Sub


Sub ErrorHandling(Number As Long)
    If ErrorCount(Number) > 10 Then
        MsgBox "Too many errors (-2147188160) in ErrorCount(" & Number & "). Canceling."
        End
    End If

    ErrorCount(Number) = ErrorCount(Number) + 1
    Debug.Print "ErrorCount" & Number & " is " & ErrorCount(Number)
End Sub
  1. 有时当我运行我的代码时会弹出一个 MsgBox:“错误:0。程序将继续。” (这发生在您在此处看到的过程以及在结构上相同的其他过程中)。这意味着ErrorHandler1 中的 else 语句被触发。我使用else 的目的是让我知道GoTo ErrorHandler1 中出现的任何错误,但不是-2147188160。据我所知,“错误 0”意味着没有错误,那么 VBA 是如何出现的呢?

编辑:我现在重新排列并添加了End。我移动了Resume 语句,因为否则我可能会出现无限错误循环。

ErrorHandler1:

    If Err.Number = -2147188160 Then
        Call ErrorHandling(1)
        Resume RepeatOnError1
    Else
        MsgBox "Fehler: " & Err.Number & ": " & Err.Description & vbNewLine & "Makro wird weiter ausgeführt."
        End
    End If
    On Error GoTo 0

ErrorHandler2:

    If Err.Number = -2147188160 Then
        Call ErrorHandling(2)
        Resume RepeatOnError2
    Else
        MsgBox "Fehler: " & Err.Number & ": " & Err.Description & vbNewLine & "Makro wird weiter ausgeführt."
        End
    End If
    On Error GoTo 0

End Sub

【问题讨论】:

  • 虽然下面的答案确实解释了为什么您的 Err.Number 检查在 On Error GoTo 0 之后完成时不起作用,但我强烈建议您将代码分解为更小、更专业的程序更少的事情,理想情况下,有一个理由失败。这些GoToResume 跳转让事情变得难以跟踪——而且执行从RepeatOnError1 下降到RepeatOnError2,这是故意的吗?
  • @Mathieu Guindon 你的意思是什么?当 #1 失败时,它应该重复。成功后,它应该继续RepeatOnError2 下的内容。你是这个意思吗?至于使用更专业的潜艇:您建议将其一分为二吗?关于GoToResume 引起的混乱:我同意,但我没有想出替代方法。
  • 我的意思是易于遵循的结构良好的代码通常只有一个错误处理程序,如果有的话。错误处理程序子程序只应在执行处于错误状态时运行,即“快乐路径”和“错误路径”之间存在清晰的分离,而在 Error1 清除错误并陷入 Error2 时不会发生这种情况。跨度>
  • @MathieuGuindon 所以假设RepeatOnError2 下的整个部分都不存在(ErrorHandler1 除外):我的代码可以吗?

标签: excel vba error-handling


【解决方案1】:
On Error GoTo 0
If Err.Number = -2147188160 Then

On Error Go To 0 也“清除”任何当前错误。所以你在检查它是否等于 -2147188160 之前清除它。重新排列这些语句,看看是否效果更好:

If Err.Number = -2147188160 Then
    On Error GoTo 0

【讨论】:

  • 我把它放在整个 if 语句的下面(即在end if 之后),因为在else 部分我仍然需要错误号,但是是的,这解决了它。我还移动了Resumestatement(见编辑)。无论如何,谢谢!
猜你喜欢
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多