更新for循环的条件

时间:2018-04-05 13:21:29

标签: excel vba excel-vba

更新for循环条件是否可行?
我需要从第1行循环到第1页的lastrow,当条件满足时我需要切换表并循环到该表的末尾。

仅供演示:

lr = 5
For i = 1 To lr
    If i = 3 Then
        lr = 500
        i = 50
    End If
Next i

此代码以i=51结尾,因为for循环在Next i结束之前未更新它的条件。
这可以解决一些问题吗?

4 个答案:

答案 0 :(得分:6)

不,VBA预先计算lr,因此对lr的后续更改无效。如果你来自C,C ++或Java背景(就像我一样),那将会非常震撼!就VBA从20世纪60年代中期以来出现的各种BASIC的演变而言,它的工作方式非常有意义。

您最好的选择是重构Do While或类似内容。在这种情况下,每次迭代都会重新评估停止条件。

答案 1 :(得分:4)

使用Do While代替For

lr = 5
i = 1
Do While i < lr
    If i = 3 Then
        lr = 500
        i = 50
    End If
    i = i+1
Loop

答案 2 :(得分:1)

只是为了好玩,你可以作弊:

    lr = 5
begin:
    For i = 1 To lr
        If i = 3 And Not switched Then
            lr = 500
            switched = True
            GoTo begin
            i = 50
        End If
        Debug.Print i
    Next

答案 3 :(得分:0)

你可能会有点棘手并为你编写代码。在此代码中,您将需要第三个变量来重新启动For循环(请注意此代码赢得了真正的重启,当i=3它跳转时到50,不从1重新开始。你将获得1,2,3,50,51,....)

lr = 5
zz = 1

For_Loop_Start:

For i = zz To lr
    If i = 3 Then
        lr = 500
        zz = 50
        GoTo For_Loop_Start
    End If
Next i

另一个选择就是Do Until:

lr = 5
i = 1
Do Until i > lr
    If i = 3 Then
        lr = 500
        i = 49
    End If
    i = i + 1
Loop

当然,你也可以使用其他选项,如Do While,Do While not,等等。

编程中的规则是预先计算的,但有时候你可以编写“&#34; skip&#34;那些规则,并使代码成为你想要的。只是想象力。