VBA:使用标签和“ On Error GoTo”处理错误

时间:2019-05-27 15:46:06

标签: excel vba error-handling

我有多个过程类似于下面的过程。代码本身是功能性的,并且可以执行预期的操作,但是现在我有一个问题和一个有关错误处理的问题:

  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

1 个答案:

答案 0 :(得分:2)

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

出现错误时,转到0还可以“清除”任何当前错误。因此,您需要先清除它,然后再检查它是否等于-2147188160。重新排列这些语句,看看效果是否更好:

Prices displayed as: 0.336
Taxes: 0.017
But grand total needed to be: 0.350 (instead of 0.353)