Вам нужно Resume Next
, чтобы перейти к следующей строке после строки, вызывая ошибку.И Err.Clear
также является хорошей практикой.
Exit Sub
перед errhandler
также является хорошей практикой:
Sub SkipIteration()
Dim x As Long
For x = 5 To -5 Step -1
On Error GoTo errhandler:
Debug.Print 15 / x
Debug.Print "testing"
Next x
Exit Sub
errhandler:
If Err.Number = 11 Then
Debug.Print ("Error on " & x)
Err.Clear
Resume Next
End If
End Sub
Разница между Resume
и Resume Next
выглядит следующим образом:
Resume
пытается вернуться туда, где он был вызван.
В процедуре TestMeResume
выдается ошибка 11 при отладке..Print a / b и в обработчике ошибок он назначает b = 5. Затем с Resume
он повторяет Debug.Print a / b
, и, поскольку b
не является 0
, он запускается.
Resume Next
идет туда, где она была вызвана, игнорирует линию и переходит к следующей.
В процедуре TestMeResumeNext
ошибка 91 генерируется в a = 12
и запускается обработчик ошибок.В обработчике ошибок a назначается Range("A14")
, а с Resume Next
a = 12
пропускается, а Sub
продолжается.
Sub TestMeResumeNext()
On Error GoTo TestMeResumeNext_Error
Dim a As Range
a = 12 'Error 91 here!
Debug.Print a.Row 'Resume Next goes back here
Exit Sub
TestMeResumeNext_Error:
Set a = Range("A14")
Resume Next
End Sub
Sub TestMeResume()
On Error GoTo TestMeResume_Error
Dim a As Long: a = 10
Dim b As Long: b = 0
Debug.Print a / b 'Error 11 here the first time
Exit Sub
TestMeResume_Error:
b = 5
Resume
End Sub