Bootstrap

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具,不仅可以筛选内容,而且可以筛选颜色,例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格(下图右侧所示),其他单元格的填充色不固定,有几种颜色也不固定,那么内置的自动筛选就无能为力,使用VBA还是可以实现的。

在这里插入图片描述

示例代码如下。

Sub Demo()
    Dim helpRng As Range, visRng As Range
    Dim lastRow As Long, oSht As Worksheet
    Set oSht = Sheets("Sheet1")
    If oSht.AutoFilterMode Then oSht.AutoFilterMode = False
    lastRow = oSht.Cells(oSht.Rows.Count, 1).End(xlUp).Row
    With oSht.Range("A1:E" & lastRow)
        .AutoFilter Field:=1, Criteria1:=RGB(255, 0, 0), Operator:=xlFilterCellColor
        Set helpRng = .Columns(.Columns.Count).Offset(, 1)
        helpRng.EntireColumn.Hidden = False
        On Error Resume Next
        Set visRng = helpRng.SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
        If Not visRng Is Nothing Then
            oSht.AutoFilterMode = False
            helpRng.Clear
            visRng.Value = 1
            helpRng.AutoFilter Field:=1, Criteria1:=""
            helpRng.EntireColumn.Hidden = True
        End If
    End With
End Sub

【代码解析】
第4行代码获取工作表对象。
第5行代码如何工作表已经启用自动筛选,请取消当前的自动筛选。
第6行代码获取A列最后数据所在行号。
第7行代码设置表格范围,如果已经创建Excel表格,那么可以直接使用ListObject对象。
第8行代码在第1列应用自动筛选,筛选颜色为红色。
第9行代码在表格右侧添加辅助列。
第10行代码确保辅助类处于显示状态(没有被隐藏),否则第12行无法获取相应的单元格。
第11行代码忽略运行时错误。
第12行代码获取辅助列的可见单元格。
第13行代码恢复系统错误处理机制。
第14行代码如果可见单元格不为空,说明具备红色单元格。
第14行代码取消自动筛选。
第16行代码清空辅助列。
第17行代码将可见单元格(即红色所在行)赋值为1。
第18行代码启用自动筛选,筛选辅助列为空的单元格(即:非红色所在行)。
第19行代码隐藏辅助列。


希望大家不用谈辅助列色变,认为使用辅助类的解决方案,都是很弱智的实现方法,实际上合理使用辅助列,可以更好的利用Excel内置功能,在数据量比较大的应用场景中,这通常比单纯的VBA实现方案更高效,总之,效率为王,英雄不问出身。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;