首页 > 解决方案 > 如何在 VBA 中模拟 Python 的“继续”语句的错误 AKA 进行下一次迭代?

问题描述

在以下代码中,如何在遇到错误后使循环在下一次迭代中继续 - 而不是下一行?

现在代码不会超过 x=0:

Sub skip_iteration()

Dim x As Long

For x = 5 To -5 Step -1
    On Error GoTo errhandler:
    Debug.Print 15 / x
    Debug.Print "I don't want this to be printed on error"
Next x

errhandler:
If Err.Number = 11 Then
    Debug.Print ("Error on " & x)
End If

End Sub

我已经研究了这个答案: Skip to next iteration in loop vba等,但无法将其转换为我的代码。

标签: excelvba

解决方案


您需要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过程中,它在 Debug.Print a/b 处引发错误 11,并在错误处理程序中分配 b = 5。然后Resume重试Debug.Print a / b,只要b不是0,它就会运行。

  • Resume Next转到它被调用的地方,忽略该行并继续下一个。

在该TestMeResumeNext过程中,抛出错误 91a = 12并触发错误处理程序。在错误处理程序中,a 被分配给并被Range("A14")跳过并继续。Resume Nexta = 12Sub


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

推荐阅读