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实现方案更高效,总之,效率为王,英雄不问出身。