如何用Excel VBA统计含内容的隐藏/筛选行数量
解决VBA统计包含文本的隐藏/筛选行问题
原来的代码用Range.End(xlUp)确实会踩坑——当工作表有筛选隐藏行时,它只会识别可见区域的最后一行,像你说的第2行被隐藏就统计不到。下面给你两个靠谱的修改方案:
方法1:用UsedRange快速获取(适合简单场景)
UsedRange会识别工作表中所有被使用过的区域,包括隐藏行,代码很简洁:
Total_rows_Pick = Workbooks("Job Production Monitoring.xlsm").Worksheets("Pick-ups").UsedRange.Rows.Count
不过要注意:如果工作表开头有空白行,这个方法会把空白行也算进去,比如第一行空、第二行有数据,它返回的总行数会包含第一行,这时候你可能需要根据实际情况调整行号。
方法2:用Find精准定位最后一行(推荐)
Find方法可以遍历整个B列(不管行是否隐藏),找到最后一个有文本的单元格,这个方法更可靠,适配各种场景:
Dim ws As Worksheet Set ws = Workbooks("Job Production Monitoring.xlsm").Worksheets("Pick-ups") ' 查找B列最后一个非空单元格(包含隐藏行) Total_rows_Pick = ws.Columns("B").Find(What:="*", _ After:=ws.Cells(1, "B"), _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row
给你拆解下关键参数:
What:="*":匹配任意非空内容SearchDirection:=xlPrevious:从B列底部往上找,直接定位到最后一行有数据的单元格LookIn:=xlValues:基于单元格显示的文本查找,如果要包含公式结果可以改成xlFormulas
额外防坑提示
如果B列全是空的,Find会返回Nothing,直接用.Row会报错,所以最好加个判断:
Dim lastCell As Range Set lastCell = ws.Columns("B").Find(What:="*", _ After:=ws.Cells(1, "B"), _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False) If Not lastCell Is Nothing Then Total_rows_Pick = lastCell.Row Else Total_rows_Pick = 1 ' 全空时默认第一行,你可以根据需求改成0或者其他值 End If
内容的提问来源于stack exchange,提问作者Pherdindy
相关产品推荐
相关产品推荐

