У меня есть несколько процедур, которые выглядят так, как показано ниже.Сам код функционален и делает то, что должен, но теперь у меня есть один вопрос и одна проблема, связанная с обработкой ошибок:
- Как использовать
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