VBA: обработка ошибок с метками и "On Error GoTo" - PullRequest
2 голосов
/ 27 мая 2019

У меня есть несколько процедур, которые выглядят так, как показано ниже.Сам код функционален и делает то, что должен, но теперь у меня есть один вопрос и одна проблема, связанная с обработкой ошибок:

  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
Иногда, когда я запускаю свой код, появляется сообщение MsgBox: «Ошибка: 0. Процедура будет продолжена».(это произошло в процедуре, которую вы видите здесь, а также в других процедурах, которые структурно одинаковы).Это означает, что оператор else в ErrorHandler1 запускается.Мое намерение с else состояло в том, чтобы сообщить мне о любой ошибке, которая обнаруживается в GoTo ErrorHandler1, но не -2147188160.Насколько я знаю, «Ошибка 0» означает, что ошибки нет, так как же там VBA?

edit: Я переставил его и добавил 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 Ответ

2 голосов
/ 27 мая 2019
On Error GoTo 0
If Err.Number = -2147188160 Then

On Error Go To 0 также «очищает» любую текущую ошибку. Таким образом, вы очищаете его, прежде чем проверять, равно ли оно -2147188160. Измените эти утверждения и посмотрите, работает ли это лучше:

If Err.Number = -2147188160 Then
    On Error GoTo 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...