在嵌套的Excel VBA For ... Next循环中,父Next没有找到它的For

时间:2011-10-05 16:20:02

标签: vba

For j = 0 to SpreadCount
    If TypeName(ChainsDC(j,0) = "String" 'testing for an error
        Goto EndLoop
    Else:
        For i = 0 to RscSct
            ...do amazing things here (no loops)
        Next i
EndLoop:
Next j '<<<PROBLEM

编译器抱怨下一个j(第9行)是“Next without For”。

4 个答案:

答案 0 :(得分:5)

您的IF声明是问题所在。你需要添加然后结束如果

For j = 0 to SpreadCount
    If TypeName(ChainsDC(j,0) = "String" **Then**
        Goto EndLoop
    Else:
        For i = 0 to RscSct
            ...do amazing things here (no loops)
        Next i
    **End If**
EndLoop:
Next j '<<<PROBLEM

修改
您的Typename也缺少一个右括号。

答案 1 :(得分:3)

For j = 0 to SpreadCount
    If TypeName(ChainsDC(j,0)) <> "String" Then
        For i = 0 to RscSct
            ...do amazing things here (no loops)
        Next i
    End If
Next j

正如Remou指出的那样,你应该摆脱Goto并测试你想要测试的东西,即它不是一个字符串。

除非在该行上有另一段可执行的代码,否则你通常不应该在其他地方之后使用冒号。即便如此......

答案 2 :(得分:3)

您的代码和逻辑存在一些问题。

For j = 0 to SpreadCount
    If TypeName(ChainsDC(j,0) = "String" 'testing for an error
        Goto EndLoop
    Else:
        For i = 0 to RscSct
            ...do amazing things here (no loops)
        Next i
EndLoop:
Next j '<<<PROBLEM

主要问题是逻辑 - 如果您只关心TypeName不是字符串,请检查它。没有必要添加else语句,更不用说GoTo了。正如人们常说的那样:

  

GoTo语句通常可以指示修复逻辑的机会   你的代码

有一点可以帮助您专注于想要做什么,而不是不想要做什么。首先编写预期/期望的路径,然后在(如果需要)之后添加侧面案例是很好的做法。

其他需要解决的问题:

  • 在第2行,你错过了a)
  • 在第2行,取出评论。代码是/应该是不言自明的。
  • 你应该逆转i和j。阅读代码的人会认为我是第一个。
  • 在第4行中,您应该删除“:”

以下是清理过的代码:

For i = 0 To SpreadCount
    If TypeName(ChainsDC(i, 0)) <> "String" Then
        For j = 0 To RscSct
            '...do amazing things here
        Next
    End If
Next

答案 3 :(得分:2)

您的Else:可能是问题所在,也可能是遗失的End If