Excel VBA技术求助:筛选后工作表可见行数统计异常
Excel筛选后可见行数统计问题解决方法
原代码问题分析
你当前使用dataRG.SpecialCells(xlCellTypeVisible).Rows.Count统计可见行数的方式存在缺陷:当筛选后的可见区域是多个不连续的单元格区域时,Rows.Count只会返回第一个区域的行数,而非所有可见行的总数。比如表头是第1行,下面有第3、5行可见,原代码会只统计表头的1行,错误判断为没有数据行可见。
正确解决方案
方案1:使用Application.Subtotal函数(推荐)
Subtotal函数的103参数对应忽略隐藏行的COUNTA统计,专门用于筛选后的可见单元格计数,无需处理区域连续性问题。
Set dataRG = ws.Range("A1").CurrentRegion For n = UBound(wsNames) To LBound(wsNames) Step -1 If IsArray(ccNumbers(n)) Then dataRG.AutoFilter 7, ccNumbers(n), xlFilterValues Else dataRG.AutoFilter 7, ccNumbers(n) End If ' 统计从第2行开始的第一列可见非空单元格数(即数据行数量) Dim visibleDataRows As Long visibleDataRows = Application.Subtotal(103, dataRG.Columns(1).Offset(1)) ' 存在可见数据行时执行后续步骤 If visibleDataRows > 0 Then ' 你的后续代码逻辑 End If Next n
方案2:遍历所有可见区域累加行数
通过遍历SpecialCells返回的每个不连续区域,手动累加行数,需添加错误处理避免异常。
Set dataRG = ws.Range("A1").CurrentRegion For n = UBound(wsNames) To LBound(wsNames) Step -1 If IsArray(ccNumbers(n)) Then dataRG.AutoFilter 7, ccNumbers(n), xlFilterValues Else dataRG.AutoFilter 7, ccNumbers(n) End If Dim totalVisibleRows As Long totalVisibleRows = 0 On Error Resume Next ' 防止无可见区域时触发错误 Dim area As Range For Each area In dataRG.SpecialCells(xlCellTypeVisible).Areas totalVisibleRows = totalVisibleRows + area.Rows.Count Next area On Error GoTo 0 ' 减去表头的1行,判断是否存在可见数据行 If (totalVisibleRows - 1) > 0 Then ' 你的后续代码逻辑 End If Next n
内容的提问来源于stack exchange,提问作者Anniee_55
相关产品推荐
相关产品推荐

