使用动态步骤编写一个For ... Next

时间:2015-04-04 12:51:37

标签: excel vba excel-vba

我已经在Excel中编写了一个VBA代码,用于尝试遍历包含作者姓名和标题的数据行,并放置" First"在第一作者的行和"最后"在最后一位作者的同一行中。

由于每篇文章的作者数量各不相同,我认为最简单的方法是使用Step转到下一个作者块,但步骤值为" y"对增加价值没有任何影响" r" (行号)。

代码:

Sub AuthFirstPlacer()
    Dim r, cyclenum As Long
    Dim y As Variant 'did not work a Long either

    For r = 2 To 41 Step y
        cyclenum = Cells(r, 4).Value
        Cells(r, 6).Value = "First"
        y = r + cyclenum - 1          'this meant to move to next block of authors
        Cells(y, 6).Value = "Last"
    Next r
    ...
End Sub

程序运行正常,但它根本没有步骤。它从r = 2到r = 3。 实际数据中的Y为22。

2 个答案:

答案 0 :(得分:2)

恕我直言,你不能在程序流进入循环后改变for循环的步长。试试这个:

Sub AuthFirstPlacer()  
    Dim r as Long
    Dim cyclenum As Long
    Dim endrow As Long

    r = 2
    Do While r <= 41
        cyclenum = Cells(r, 4).Value
        Cells(r, 6).Value = "First"
        endrow = r + cyclenum - 1    ' move to last line in this block
        Cells(endrow, 6).Value = "Last"
        r = endrow + 1
    End Loop  
End Sub  

答案 1 :(得分:0)

在VBA For...Next Statement中,步骤不是动态增量,可以动态调整。您的 y 变量永远不会被赋予超出实例化的值,因为它被声明为零并且这是步骤。只有在它收到一个值之后才会这样做。

如果您想跳过多个记录,请使用Continue For

Sub AuthFirstPlacer()

    Dim r as long, cyclenum As Long

    For r = 2 To 41 Step 1
        if r <= cyclenum then continue for
        cyclenum = Cells(r, 4).Value + r - 1
        Cells(r, 6).Value = "First"
        Cells(cyclenum, 6).Value = "Last"
    Next r

end sub

这可能不完全正确,因为我没有要测试的样本数据,但方法是合理的。您可能需要调整 cyclenum 获取新值的位置。如果您遇到困难,请发布一些预期结果的样本数据。