Excel VBA:在for循环中跳转:“Next without For” – 我在做什么错误?

我真的不知道为什么VBA编译器因为GoTo Jump而唠叨我,。

  counter2 = 0 If (counter1 > 1) Then For i = 0 To (MaxLastCell - 4) If (IncompleteRows(i) = 1) Then If ((counter2 > 1) And (counter2 < counter1)) Then x = x + ", " + CLng(i) counter2 = counter2 + 1 GoTo Jump End If If ((counter2 > 1) And (counter2 = counter1)) Then x = x + " and " + CLng(i) GoTo Outside If (counter2 = 0) Then x = CLng(i) counter2 = 1 End If End If Jump: Next i 

每当我试图运行我的代码,这段代码似乎是一个问题。 编译器在底部标记为Next ,并告诉我有一个"Next without For"

但是这种编码不应该工作吗? 我刚才在这里看到了 然而,一个奇怪的事情是,编译器似乎并没有强制BH将其跳转点NextIteration:移动到最左边,但允许它停留在第二个缩进级别,因此 for -loop之内,因为它看来。 (这是否甚至重要?)

试试这个(修改标注在注释中):

  counter2 = 0 If (counter1 > 1) Then For i = 0 To (MaxLastCell - 4) If (IncompleteRows(i) = 1) Then If ((counter2 > 1) And (counter2 < counter1)) Then x = x + ", " + CLng(i) counter2 = counter2 + 1 GoTo Jump End If If ((counter2 > 1) And (counter2 = counter1)) Then x = x + " and " + CLng(i) GoTo Outside ElseIf (counter2 = 0) Then '<--*** changed from simple 'If' x = CLng(i) counter2 = 1 End If End If Jump: Next i End If '<--*** added 

但是你应该避免GoTos

你有一些很好的意大利面条代码。 GoTo只是适当控制stream程的一个糟糕的select。

Neal Stephenson认为将他的标签命名为“dengo”

一个GoTo “跳到下一个迭代”是一回事。 另一个去GoTo Outside (不pipe那是哪里)是别的东西。

VBA(语言规范)不关心行标签在哪一列开始; 对于所有我们知道你链接到的答案是在答案框中键入,而不是在VBE中。 当VBE(IDE /编辑器)看到一个线标签时,它会自动将其移动到第1列,就像它自动在操作符和操作数之间插入空格一样,就像在键入时自动调整关键字和标识符的大小写一样。 所以不,一点也不重要。

VBA语法要求块被closures:就像Sub DoSomething()过程必须End Sub结束,并且With必须End WithFor必须Next结束。 正确的缩进和小程序通常有助于正确使用。

很多其他语言(C#,Java,C ++等)对于有效的代码块有什么相似的约束(在使用它们的每种语言中,不匹配{}大括号是编译器错误),所以这不是VBA挑剔或无理抱怨。

也就是说很难判断你的代码是否存在错误,因为你没有包含整个过程的范围,所以我们不得不假设你的代码片段中没有其他东西 – 而且你发布的代码片段缺less一个End If as user3598756已经注意到 :

 If (counter1 > 1) Then '...code... End If 

那么,如何去重组呢?

  • 假设Outside标签位于End Sub之前(或者是End Function ?),那么可以用Exit Sub (或Exit Function )replace它,然后每天调用它。
    • 如果在循环之后但在过程作用域结束之前还有更多需要运行的代码,那么Exit For会让你脱离循环,同时让你保留在过程中 – 下一行将成为Next的第一个可执行语句令牌。
  • 现在采取使循环跳过迭代的条件,并相应地重新调整循环体; 使用ElseIf来避免评估您不需要的条件,并删除所有这些无关且易混淆的括号:

     If IncompleteRows(i) = 1 And counter2 > 1 And counter2 < counter1 Then x = x + ", " + CLng(i) counter2 = counter2 + 1 ElseIf counter2 > 1 And counter2 = counter1 Then x = x + " and " + CLng(i) Exit For ' assuming... ElseIf counter2 = 0 Then x = CLng(i) counter2 = 1 End If 

    这将是整个循环的主体。 当然还可以改进; counter2 > 1重复两次,所以有进一步重组的空间。 但是,所有的GoTo都没有了。