使用 Range 对象的 AutoFilter 方法,可以实现按各种条件自动筛选数据。
Range.AutoFilter 方法
语法
Range.AutoFilter (Field, Criteria1, Operator, Criteria2, SubField, VisibleDropDown)
参数
名称 | 必需/可选 | 数据类型 | 说明 |
---|---|---|---|
Field | 可选 | Variant | 相对于作为筛选基准字段(从列表左侧开始,最左侧的字段为第一个字段)的字段的整型偏移量。 |
Criteria1 | 可选 | Variant | 条件(字符串;例如,“101”)。使用 "=" 查找空白字段,使用 "<>" 查找非空白字段,使用 "><" 选择数据类型中的(否数据)字段。
如果此参数被省略,条件为“全部”。如果 Operator 是 |
Operator | 可选 | XlAutoFilterOperator | 一个指定筛选器类型的 XlAutoFilterOperator 常量。 |
Criteria2 | 可选 | Variant | 第二个条件(字符串)。与 Criteria1 和 Operator 一起组合成复合筛选条件。也用作日期字段的单一条件(按日、月或年筛选)。后跟一个数组,该数组用于详述和筛选 Array(Level, Date)。其中,Level 为 0-2(年、月、日),Date 为筛选期内的一个有效日期。 |
SubField | 可选 | Variant | 对其应用条件的数据类型中的字段(例如,来自地理位置的“人口”字段或来自股票的“交易量”字段)。省略此值目标是“(显示值)”。 |
VisibleDropDown | 可选 | Variant | 默认为 True 。如果为 True ,则显示已筛选字段自动筛选的下拉箭头。如果为 False ,则隐藏已筛选字段自动筛选的下拉箭头。 |
XlAutoFilterOperator 常量
名称 | 值 | 描述 |
---|---|---|
xlAnd | 1 | Criteria1 和 Criteria2 的逻辑 AND |
xlBottom10Items | 4 | 在 Criteria1 中指定的项数 (显示的最低值项 |
xlBottom10Percent | 6 | Criteria1 中指定的百分比显示的最低值项 |
xlFilterCellColor | 8 | 单元格颜色 |
xlFilterDynamic | 11 | 动态筛选 |
xlFilterFontColor | 9 | 字体颜色 |
xlFilterIcon | 10 | 筛选图标 |
xlFilterValues | 7 | 筛选值 |
xlOr | 2 | Criteria1 或 Criteria2 的逻辑 OR |
xlTop10Items | 3 | 显示 Criteria1 中指定的项数的最高值项 |
xlTop10Percent | 5 | Criteria1中指定的百分比显示的最高值项 |
返回值
Variant
注解
如果忽略全部参数,此方法仅在指定区域切换自动筛选下拉箭头的显示。
按指定条件自动筛选数据
以下示例对单元格 A1 所在区域进行筛选,筛选字段为第一个字段,条件为“销售部”,VBA 代码如下:
Sub DataFilter()
ActiveSheet.Range("A1").AutoFilter Field:=1, Criteria1:="销售部", Operator:=xlFilterValues
End Sub
运行效果如下图所示:
多条件筛选
通过多次使用 AutoFilter 方法,可以实现对数据列表的多条件筛选。
以下示例对单元格 A1 所在区域进行多条件筛选,筛选条件为部门为“销售部”,且“工龄“大于等于5且“工龄“小于等于10的记录,VBA 代码如下:
Sub MuliteCriteriaFilter()
' 关闭屏幕更新,提高程序运行速度
Application.ScreenUpdating = False
With ActiveSheet
' 判断工作表是否处于筛选模式,如果是则显示当前筛选列表的所有数据
If .FilterMode = True Then .ShowAllData
' 第一次筛选,筛选第一个字段,条件为"销售部"
.Range("A1").AutoFilter Field:=1, Criteria1:="销售部"
' 第二次筛选,筛选第三个字段,条件为 >=5 且 <=10
.Range("A1").AutoFilter Field:=3, Criteria1:=">=5", Operator:=xlAnd, Criteria2:="<=10"
End With
' 恢复屏幕更新
Application.ScreenUpdating = True
End Sub
运行效果如下图所示:
统计符合筛选条件的记录数
上例的程序执行完毕后,在状态栏中将显示“在 13 条记录中找到 2 个”,如果要统计符合筛选条件的记录数可以使用如下 VBA 代码:
Sub CountFilterRecord()
Dim rngRange As Range
Dim i As Long
Dim lngCount As Long
Dim lngAllCount As Long
With ActiveSheet
If .FilterMode Then
' 获取筛选区域的记录总数
lngAllCount = .AutoFilter.Range.Rows.Count - 1
' 获取筛选后的可视筛选区域
Set rngRange = .AutoFilter.Range.SpecialCells(xlCellTypeVisible)
' 循环筛选区域
For i = 1 To rngRange.Areas.Count
' 累计每个区域(连续单元格区域)的记录数
lngCount = lngCount + rngRange.Areas(i).Rows.Count
Next i
Set rngRange = Nothing
' 筛选记录总数要除去第一行表头
MsgBox "在 " & lngAllCount & " 条记录中找到 " & lngCount - 1 & " 个"
End If
End With
End Sub
运行效果如下图所示:
判断筛选结果是否为空
如果筛选记录总数为0,则表示筛选结果为空。如果需要判断筛选结果是否为空,可以使用如下 VBA 代码:
Sub FilterIsEmpty()
With ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible)
' 如果自动筛选结果区域只有1个,且该区域总行数为1行,说明筛选结果为空。
If .Areas.Count = 1 And .Rows.Count = 1 Then
MsgBox "筛选结果为空"
End If
End With
End Sub
复制自动筛后的数据
如果需要将自动筛选的结果复制到工作表中的其他位置,可以使用 Range 对象的 Copy 方法。
以下示例将活动工作表中自动筛选的结果区域复制到工作表“Sheet2”中单元格 A1 起始的单元格区域。
Sub CopyFilterResult()
With ActiveSheet
If .FilterMode Then
.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy Worksheets("Sheet2").Range("A1")
End If
End With
End Sub
其中 AutoFilter 对象的 Range 属性返回工作表的自动筛选列表区域,SpecialCells(xlCellTypeVisible)
方法获取该列表区域中的可见单元格,即得到筛选结果的单元格区域,最后使用 Copy 方法将结果区域复制到工作表“Sheet2”中。