VBA筛选后数据行数统计异常求助:手动46行但代码返回0
VBA统计筛选后行数返回0的问题排查与修复
核心问题点
- 错误捕获掩盖真实异常:代码中的
On Error Resume Next会忽略SpecialCells(xlCellTypeVisible)找不到可见单元格的错误,导致crtotal和crcount始终为0,无法定位问题根源。 - 未定义对象引用:
inputWorksheet.Cells(ws.Rows.Count, "A").End(xlUp).Row中的ws未定义,需替换为inputWorksheet,否则会取到错误的最后行号,可能跳过统计逻辑。 - 统计包含表头行:
AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count会把表头行计入总数,实际数据行数需减1。 - 筛选范围过大:直接用
Range("A:AB")作为筛选范围会包含空行,干扰统计结果,需限定到实际数据区域。
修正后的代码
Dim criteria As String Dim counter As Integer Dim cr As Double Dim crcount As Double Dim crtotal As Double Dim lastRowInData As Long ' 改用Long避免行号溢出 Dim visibleCells As Range counter = 0 cr = 0 crtotal = 0 crcount = 0 ' 直接操作工作表对象,避免Select激活 With inputWorksheet If .FilterMode Then .AutoFilter.ShowAllData ' 清除原有筛选 End If ' 限定筛选范围到实际数据区域(表头在第1行) lastRowInData = .Cells(.Rows.Count, "A").End(xlUp).Row With .Range("A1:AB" & lastRowInData) .AutoFilter Field:=1, Criteria1:=team .AutoFilter Field:=9, Criteria1:=criteria .AutoFilter Field:=22, Criteria1:="Feature" ' 针对性处理可见单元格获取错误 On Error Resume Next Set visibleCells = .Columns(1).SpecialCells(xlCellTypeVisible) On Error GoTo 0 ' 恢复默认错误捕获 If Not visibleCells Is Nothing Then crtotal = visibleCells.Cells.Count - 1 ' 减去表头行 MsgBox crtotal & " 数据行 for " & criteria ' 二次筛选Field8 .AutoFilter Field:=8, Criteria1:="100" On Error Resume Next Set visibleCells = .Columns(1).SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not visibleCells Is Nothing Then crcount = visibleCells.Cells.Count - 1 End If End If End With End With ' 计算并写入结果 If crtotal > 0 Then cr = Round((crcount / crtotal) * 100, 0) Dim resultText As String resultText = cr & "% Complete " & vbNewLine & crcount & "/" & crtotal MsgBox resultText InfographicData.Cells(row, column).Value = resultText End If
关键修改说明
- 移除不必要的
Select操作,直接通过对象引用操作工作表,避免激活状态干扰。 - 限定筛选范围为
A1:AB[最后数据行],排除空行影响。 - 针对性处理
SpecialCells的错误,仅在找到可见单元格时执行统计。 - 统计行数时减去表头行,得到真实数据行数。
- 将行号变量类型改为
Long,适配Excel最大行号(1048576),避免溢出。
内容的提问来源于stack exchange,提问作者Zugor
相关产品推荐
相关产品推荐

