For Each 循环每第 N 行并包括最后一行

For Each loop every Nth row and include the last row

我有一个 For Each 循环,它每 200 行跳一次并将数据从该行复制到另一个 sheet。这个循环有效,但我希望它包括最后使用的行。

例如,我有 2,132 行,所以我从第 200 行开始循环,然后是第 400 行,依此类推。循环将进行到第 2,000 行,然后结束,因为第 2,200 行不存在。但是,如果最后一行尚未包含在到 200 的最终循环中,我希望始终包含最后一行。因此在这种情况下,第 2,000 行然后是第 2,132 行。

我当前的循环:

Sub SelectEveryNthCell()
Dim rRange As Long, rEveryNth As String, lRow As Long, nRow As Long

With Sheets("Vendor Num")
     rRange = .Cells(.Rows.Count, "B").End(xlUp).Row

    For lRow = 200 To rRange Step 200
        If lRow > rRange Then
            rEveryNth = .Range("B" & lRow).Value
                With Sheets("Vendor Num Chart")
                nRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
                .Range("A" & nRow).Value = rEveryNth
                End With
            Exit For
        End If

        rEveryNth = .Range("B" & lRow).Value

        With Sheets("Vendor Num Chart")
            nRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
            .Range("A" & nRow).Value = rEveryNth
        End With

    Next lRow

End With

End Sub

我以为我可以用 If lRow > rRange Then 捕获它,但是循环跳过了它并在 lRow 等于 2,000 时循环结束。

我在 SO 上看到很多关于循环到第 N 行的内容,但没有提到包括最后一行。有没有办法将它包含在循环中?我想避免在循环完成后捕获最后一行,只是在最后一行是下一个第 200 行的情况下。在那种情况下,我会捕获该行两次,这是我不想要的。例如:最后一行是 2,000。循环捕获第 2,000 行,然后在循环捕获最后一行后再次捕获 2,000。

谢谢!

有多种方法可以做到这一点,但这是一种方法

Sub SelectEveryNthCell()
Dim rRange As Long, rEveryNth As String, lRow As Long, nRow As Long

With Sheets("Vendor Num")
    rRange = .Cells(.Rows.Count, "B").End(xlUp).Row

    For lRow = 200 To rRange Step 200
        rEveryNth = .Range("B" & lRow).Value

        With Sheets("Vendor Num Chart")
            nRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
            .Range("A" & nRow).Value = rEveryNth
            If lRow > rRange - 200 Then
                nRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
                .Range("A" & nRow).Value = rRange
            End If
        End With

    Next lRow

End With

End Sub

另一种方法是在循环之外:

Sub SelectEveryNthCell()
Dim rRange As Long, rEveryNth As String, lRow As Long, nRow As Long
Dim lRowChanged As Boolean

With Sheets("Vendor Num")
    rRange = .Cells(.Rows.Count, "B").End(xlUp).Row

    For lRow = 200 To rRange Step 200
        If lRow = rRange Then LRowChanged = True
        rEveryNth = .Range("B" & lRow).Value

        With Sheets("Vendor Num Chart")
            nRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
            .Range("A" & nRow).Value = rEveryNth
        End With

    Next lRow

    If LRowChanged = False Then Sheets("Vendor Num Chart").Range("A" & nRow + 1).Value = .Range("B" & rRange).Value

End With

End Sub

这是您正在尝试的吗?

Option Explicit

Sub SelectEveryNthCell()
    Dim rRange As Long, rEveryNth As String, lRow As Long, nRow As Long

    With Sheets("Vendor Num")
        rRange = .Cells(.Rows.Count, "B").End(xlUp).Row

        For lRow = 200 To rRange Step 200
            rEveryNth = .Range("B" & lRow).Value
            With Sheets("Vendor Num Chart")
                nRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
                .Range("A" & nRow).Value = rEveryNth
            End With
        Next lRow

        If rRange Mod 200 <> 0 Then
            With Sheets("Vendor Num Chart")
                nRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
                .Range("A" & nRow).Value = Sheets("Vendor Num").Range("B" & rRange).Value
            End With
        End If
    End With
End Sub