Excel筛选后数据行数

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/taller_2000/article/details/81269915

数据筛选是常用的功能,简单高效。原始数据如下。
这里写图片描述
筛选一下Garde=2的数据,Excel的状态条上就显示“在7条记录中找到3个”,可见数据是3行。
这里写图片描述
但是VBA中没有提供直接访问这个消息的途径,难道需要逐行去判断B列的数据进行统计!?这简直就是掰着手指头数数呀,肯定有其他解决方法。
听说使用Range(...).SpecialCells(xlCellTypeVisible)可以定位可见单元格区域,来试试。

Sub Demo()
    Debug.Print [a1].CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.Count
End Sub

结果竟然是1,太没道理了,这是什么破方法!
其实呢,方法是对的,只是用法需要改一下。

Sub RowCntAfterFilter()
    Dim rngCell As Range
    Dim lngRowCnt As Long
    For Each rngCell In [a1].CurrentRegion.SpecialCells(xlCellTypeVisible).Areas
        lngRowCnt = lngRowCnt + rngCell.Rows.Count
    Next rngCell
    MsgBox "筛选后数据行数为:" & lngRowCnt - 1
    Set rngCell = Nothing
End Sub

这个才是正确结果。
这里写图片描述
同样是用SpecialCells(xlCellTypeVisible),这个代码过程为什么就可以用了呢?其奥秘在于其后的Areas。
[a1].CurrentRegion代表A1单元格开始的数据区域,[a1].CurrentRegion.SpecialCells(xlCellTypeVisible)代表数据区域的可见单元格区域,这个区域是非连续区域,所以直接用Rows.Count属性,相当于[a1].CurrentRegion.SpecialCells(xlCellTypeVisible).Areas(1).Rows.Count,筛选后第一个可见单元格区域引用为A1:C1,所以返回的结果1。
代码过程RowCntAfterFilter中,使用For Each循环结构遍历Areas集合,累加每个区域的数据行,结果保存在变量lngRowCnt 中。这个统计中,包含了标题行,因此最后显示结果时,需要使用lngRowCnt -1。

猜你喜欢

转载自blog.csdn.net/taller_2000/article/details/81269915