跳到主要内容

自动筛选数据

使用 Range 对象的 AutoFilter 方法,可以实现按各种条件自动筛选数据。

Range.AutoFilter 方法

语法

Range.AutoFilter (FieldCriteria1OperatorCriteria2SubFieldVisibleDropDown)

参数

名称 必需/可选 数据类型 说明
Field 可选 Variant 相对于作为筛选基准字段(从列表左侧开始,最左侧的字段为第一个字段)的字段的整型偏移量。
Criteria1 可选 Variant 条件(字符串;例如,“101”)。使用 "=" 查找空白字段,使用 "<>" 查找非空白字段,使用 "><" 选择数据类型中的(否数据)字段。

如果此参数被省略,条件为“全部”。如果 Operator 是 xlTop10Items,则 Criteria1 指定项数(例如“10”)。

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”中。

评论

您的电子邮件地址不会显示出来。*号为必填项。