非连续范围中的最后一行或单元格{NOT a Worksheet search}

Cas*_*ieD 4 excel vba excel-vba

首先,这不是典型的新手问题.我正在尝试找到我已经正确创建的范围中的最后一行(或单元格).

在这个例子中,我有两个范围合并为一个与union.在整个范围内循环,我得到了我想要的数据,并且工作得很好.

Sub Test()

    Dim unionRange As Range, currentRow As Range
    Set unionRange = Union(Range("A3:C5"), Range("A8:C11"))

    For Each currentRow In unionRange.Rows
        Debug.Print "Row: " & currentRow.row
    Next currentRow

End Sub
Run Code Online (Sandbox Code Playgroud)

这给出了这些结果

Row: 3
Row: 4
Row: 5
Row: 8
Row: 9
Row: 10
Row: 11
Run Code Online (Sandbox Code Playgroud)

但是当我想确定当前行是否是我的范围中的最后一行时,我似乎无法找到获取该信息的干净方法.

Sub Test()

    Dim unionRange As Range, currentRow As Range
    Set unionRange = Union(Range("A3:C5"), Range("A8:C11"))

    For Each currentRow In unionRange.Rows
        Dim lastRowIndex As Integer

        'lastRowIndex = unionRange. ???

        If currentRow.row = lastRowIndex Then
            MsgBox ("Last Row")
        End If

    Next currentRow

End Sub
Run Code Online (Sandbox Code Playgroud)

它之所以如此困难,是因为我尝试的每个解决方案都只是在第一个连续组中生成信息,如下所示.

    Debug.Print unionRange.Rows.Count ' 3 (should be 7)
    Debug.Print unionRange.Rows(unionRange.Rows.Count).row ' 5 (should be 11)
Run Code Online (Sandbox Code Playgroud)

除了在此之前进行第二次循环之外,还有其他方法可以获取最后一行的地址信息吗?

And*_*ASM 6

您需要使用范围的Areas属性.当范围不连续时,它包含多个区域.每个区域都是子范围.不幸的是,区域没有以任何方式排序.因此,您需要检查循环中的每个区域,然后返回最大行.

在下面的示例中,我创建了一个函数,该函数为您提供非连续范围中的最后一个行号.测试子将行号打印到Visual Basic for Applications编辑器中的立即窗口.

Public Function GetLastRowOfNonContiguousArea(targetRange As Range) As Long
    Dim subRange As Range
    Dim maxRow As Long, areaMaxRow As Long

    maxRow = 0

    For Each subRange In targetRange.Areas
        areaMaxRow = subRange.Rows(subRange.Rows.Count).Row
        If areaMaxRow > maxRow Then maxRow = areaMaxRow
    Next subRange

    GetLastRowOfNonContiguousArea = maxRow
End Function

Public Sub test()
    Dim testRange As Range

    Set testRange = Union([A5:A9], [E20:F21], [C1:C3])

    Debug.Print GetLastRowOfNonContiguousArea(testRange)
End Sub
Run Code Online (Sandbox Code Playgroud)