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

Pas*_*ale 9 excel vba excel-vba excel-2013

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

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

试着这样做:

lastRow = ActiveSheet.Range("E" & Rows.Count).End(xlUp).Row
Run Code Online (Sandbox Code Playgroud)

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

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

Vas*_*zha 6

我认为比提供的更优雅的方法@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
Run Code Online (Sandbox Code Playgroud)

测试

在此输入图像描述

此外,上面提供的代码的更短版本是:

Sub test2()
    Debug.Print [E:E].Find("*", , xlValues, , xlByRows, xlPrevious).Row
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是非常优雅的!谢谢@Vasily (2认同)
  • @Pascale它意味着`Dim i as Long`,如果你将删除`&`那么`i`将被声明为`Variant`.它只是一种简写的编码方法,例如`%`是`Integer`,`&`是`Long`,`$`是`String`,`@`是`Currency`,`!`是`Single`,` #`是`Double`,如果没有指定,那么`Variant` (2认同)

D_B*_*ter 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
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为有,尝试使用"分而治之"的方法.因为`2 ^ 20`等于1048576.这就是`Rows.Count`的值.那说你的'Do ... Loop`永远不会重复超过20次来达到'lastrow`. (3认同)