应用筛选排除Cash后,统计E列空白单元格仍包含对应行问题
问题解决思路及修正代码
问题根源
- 原代码仅对当前激活工作表设置了筛选,循环遍历其他工作表时,这些表并未应用
H列<>Cash的筛选条件 - 统计空白单元格时直接使用整个E列的已用区域,没有筛选出可见单元格,导致隐藏行(对应H列Cash的行)的空白被误统计
修正后的代码
Sub CountBlankExcludeCash() Dim ws As Worksheet Dim testRange As Range Dim visibleERange As Range Dim aCount As Long Dim zAnswer For Each ws In ThisWorkbook.Worksheets ' 清除当前工作表已有筛选 ws.AutoFilterMode = False ' 对H列应用筛选:排除Cash ws.Range("H:H").AutoFilter Field:=1, Criteria1:="<>Cash" ' 定位E列的已用区域(从第二行开始,跳过表头) Set testRange = Intersect(ws.Range("E:E"), ws.UsedRange) If Not testRange Is Nothing Then Set testRange = ws.Range(testRange.Cells(2, 1), testRange.Cells(testRange.Rows.Count, 1)) ' 获取筛选后的可见单元格,处理无可见单元格的异常 On Error Resume Next Set visibleERange = testRange.SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not visibleERange Is Nothing Then ' 统计可见区域内的空白单元格 aCount = Application.WorksheetFunction.CountBlank(visibleERange) If aCount > 0 Then zAnswer = MsgBox(aCount & " 个空白值位于工作表 " & ws.Name & " 的 " & visibleERange.Address & "。是否继续执行宏?", vbYesNo) If zAnswer = vbNo Then ' 恢复筛选状态后退出 ws.AutoFilterMode = False Exit For End If End If End If End If ' 清除当前工作表的筛选 ws.AutoFilterMode = False Next ws End Sub
关键修改点
- 将筛选逻辑放入工作表循环内,确保每个工作表都应用
排除Cash的筛选条件 - 使用
SpecialCells(xlCellTypeVisible)获取筛选后的可见区域,仅统计该区域内的空白单元格 - 增加错误处理,避免因无可见单元格导致代码报错
- 循环结束/中途退出时恢复工作表的无筛选状态,避免影响后续操作
- 跳过E列表头行(从第二行开始统计),符合常规数据表格结构
内容的提问来源于stack exchange,提问作者Tartans
相关产品推荐
相关产品推荐

