Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何在模拟Python的错误代码上进行下一次迭代';s";“继续”;VBA中的语句?_Excel_Vba - Fatal编程技术网

Excel 如何在模拟Python的错误代码上进行下一次迭代';s";“继续”;VBA中的语句?

Excel 如何在模拟Python的错误代码上进行下一次迭代';s";“继续”;VBA中的语句?,excel,vba,Excel,Vba,在下面的代码中,遇到错误后,如何使循环在下一个iteration(而不是下一行)上继续 现在代码将不会超过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:

在下面的代码中,遇到错误后,如何使循环在下一个iteration(而不是下一行)上继续

现在代码将不会超过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
我研究过这个答案:
但无法将其转换为我的代码。

您需要
继续下一行
转到该行后的下一行,从而导致错误。而且
Err.Clear
也是一个很好的做法

errhandler
之前的
Exit子项也是一个很好的做法:

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。打印a/b,并在错误处理程序中指定b=5。然后使用
Resume
重试
Debug.Print a/b
,只要
b
不是
0
,它就会运行

  • Resume Next
    转到调用它的位置,忽略该行并继续下一行
TestMeResumeNext
过程中,在
a=12时抛出错误91,并触发错误处理程序。在错误处理程序中,a被分配到
范围(“A14”)
,并使用
继续下一步
跳过
a=12
,子
继续



这里的另一个选项是内联错误处理程序。这表明您清楚地知道特定代码行可能引发错误,并且不依赖
Resume
进行流量控制。让错误进入函数底部的处理程序,然后跳回代码的主线,这会使循环的预期行为变得不那么明显

Sub SkipIteration()
    Dim x As Long

    For x = 5 To -5 Step -1
        On Error Resume Next
        Debug.Print 15 / x
        If Err.Number = 11 Then
            Debug.Print "Expected error on " & x
            On Error GoTo errhandler
        Else
            On Error GoTo errhandler
            Debug.Print "Process the rest of the loop"
        End If
    Next x

    Exit Sub
errhandler:
    Debug.Print "Unexpected error "; Err.Number
End Sub
更好的做法是以一种方式分离过程的关注点,即执行的循环部分是一条语句:

Sub SkipIteration()
    On Error GoTo errhandler

    Dim x As Long
    For x = 5 To -5 Step -1
        If TheThingThatCanError(x) Then
            ActionThatDependsOnAbove x
        End If
    Next x

    Exit Sub
errhandler:
    Debug.Print "Unexpected error "; Err.Number
End Sub

Private Function TheThingThatCanError(x As Long) As Boolean
    On Error Resume Next
    Debug.Print 15 / x
    If Err.Number = 11 Then
        Debug.Print "Expected error on " & x
        Exit Function
    End If
    TheThingThatCanError = True
End Function

Private Sub ActionThatDependsOnAbove(x As Long)
    Debug.Print "I don't want this to be printed on error " & x
End Sub

如果要跳过
错误
并继续下一次迭代,一种可能的方法是使用
GoTo
并进行一些:

或者使用嵌入整个
iError
检查if并避免
GoTo
。但是,您必须转到右边的一个选项卡,然后失去缩进:

Sub SkipIteration()
    Dim x As Long
    For x = 5 To -5 Step -1
        If Not IsError(Evaluate("15 / " & x)) Then
            Debug.Print 15 / x
            Debug.Print x
        End If
    Next x
End Sub

我想要你想要的东西Resume@QHarr-
Resume
将导致无休止的循环。错误处理程序中的“下一步继续”是正确的处理方法。@vityta correct。我在错误处理程序中是认真的。在这种情况下,Resume和Resume Next之间有区别吗?请原谅我的无知对于你的soln.@QHarr-我知道(对于错误处理程序)。那里的
Resume
会导致无休止的循环。@QHarr-事实上,错误处理程序中的这两个
Resume Next
Resume
是非常有用的功能。我更新了一些例子。维蒂亚塔,非常感谢你的详尽回答。然而,正如我在问题中所说的,我想跳到下一个迭代,而不是下一行。在您的代码中,
继续下一步
将转到
Debug.Print“testing”
,我想跳过它-以及它之后可能发生的任何事情-改为转到
下一个x
。@barciewicz-我明白了。我想出了另一个答案,
GoTo
在某种程度上是坏的、危险的等等。像这样使用
Evaluate
是可怕的。它不仅对表达式求值两次(一次用于
evaluate
调用,一次用于“real”调用),还将其卸载到Excel,Excel可能会或可能不会对更复杂的表达式使用相同的语义。@Comintern-是的,不是最好的,但目前无法提供单线选项。我不想有一个专门的功能或下一步错误恢复时的
,因为这就像你的答案一样D
Sub SkipIteration()
    Dim x As Long
    For x = 5 To -5 Step -1
        If IsError(Evaluate("15 / " & x)) Then GoTo Skipper
        Debug.Print 15 / x
        Debug.Print x
Skipper:
    Next x
End Sub
Sub SkipIteration()
    Dim x As Long
    For x = 5 To -5 Step -1
        If Not IsError(Evaluate("15 / " & x)) Then
            Debug.Print 15 / x
            Debug.Print x
        End If
    Next x
End Sub