博客
关于我
Excel筛选后数据行数
阅读量:277 次
发布时间:2019-03-03

本文共 1058 字,大约阅读时间需要 3 分钟。

数据筛选是常用的功能,简单高效。原始数据如下。

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

Sub Demo()    Debug.Print [a1].CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.CountEnd 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 = NothingEnd 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。

你可能感兴趣的文章
golang中interface的一些语法缺陷的改进
查看>>
关于实时TopN排名算法的思考
查看>>
vue-router路由 学习笔记
查看>>
python自然语言处理—Word2vec模型之 CBOW
查看>>
数据结构与算法之栈
查看>>
理解java中的happens-Before
查看>>
2021Kali -- 木马免杀制作
查看>>
2020-12-16 SSD4实验
查看>>
数据结构大作业--迷宫问题
查看>>
【数据库】第七章课后题
查看>>
第四章 串、数组和广义表 —— BF算法和KMP算法
查看>>
第五章 树和二叉树 —— 哈夫曼算法
查看>>
第四章 随机的数据特征 4.4 矩、协方差矩阵
查看>>
第七章 参数估计 7.1点估计
查看>>
[选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)
查看>>
[LCT动态树] 魔法森林,树点涂色,三叉神经树,历史
查看>>
76. 最小覆盖子串
查看>>
牛客——链表指定区间翻转
查看>>
DLA:一种深度网络特征融合方法
查看>>
890. 查找和替换模式
查看>>