首页 文章

在包含公式的单元格范围中查找最后一个非空行

提问于
浏览
9

如何找到包含公式的单元格范围中的最后一行,其中公式的结果是实际值而不是空?

以简化的方式说,单元格范围 ("E1:E10") 包含一个公式,指的是单元格A1到A10,如下所示 =IF("A1"="","","A1") . 但只有单元格A1到A6的值已填入,因此单元格E7到E10的公式结果将为空 .

试着这样做:

lastRow = ActiveSheet.Range("E" & Rows.Count).End(xlUp).Row

结果lastRow的值为 10 . 我想要的是在这个例子中lastRow的值是 6 .

实际的代码比这更复杂,所以我不能只检查最后填充的A列的行,因为公式引用不同工作表上的单个单元格并动态添加 .

3 回答

  • 2

    我认为比 @D_Bester 提供的更优雅的方法是使用 find() 选项而不循环遍历单元格范围:

    Sub test()
        Dim cl As Range, i&
        Set cl = Range("E1:E" & Cells(Rows.Count, "E").End(xlUp).Row)
        i = cl.Find("*", , xlValues, , xlByRows, xlPrevious).Row
        Debug.Print "Last row with data: " & i
    End Sub
    

    测试

    enter image description here

    Also, more shorter version of the code which was provided above is:

    Sub test2()
        Debug.Print [E:E].Find("*", , xlValues, , xlByRows, xlPrevious).Row
    End Sub
    
  • 5

    您希望在列中找到非空的最后一个单元格,而不是空字符串(“”) .

    只需跟随LastRow,循环检查非空单元格 .

    lastrow = ActiveSheet.Range("E" & ActiveSheet.Rows.Count).End(xlUp).Row
    Do
        If ActiveSheet.Cells(lastrow, 5).Value <> "" Then
            Exit Do
        End If
        lastrow = lastrow - 1
    Loop While lastrow > 0
    
    If lastrow > 0 Then
        Debug.Print "Last row with data: " & lastrow
    Else
        Debug.Print "No data in the column"
    End If
    

    请注意, Rows.count 未指定哪个工作表 . 这意味着它将使用活动表 . 当然 ActiveSheet.Range() 也在活动表上 . 但是将 RangeRows.Range.Rows 混合是不好的做法 . 它表示如果您更改 ActiveSheet 但未更改未指定的引用,则可能会让您感到轻率 .

  • 6

    这应该可以帮助您确定包含公式的最后一行(在Sheet1 Sheet1A 列中):

    lastRow  = Split(Split(Sheet1.Range("A:A").SpecialCells(xlCellTypeFormulas).Address, ",")(UBound(Split(Sheet1.Range("A:A").SpecialCells(xlCellTypeFormulas).Address, ","))), "$")(2)
    

    SpecialCells 用于确定包含公式的所有单元格的范围 . 然后使用 Split 解析此范围 . 使用 Ubound 时,将检索最后一个单元格 . 结果再次被拆分以提取行号 .

相关问题