在excel工作表中,通过单击“数据”选项卡下的“排序和筛选”组中的“筛选”按钮可以创建单元格区域的自动筛选,如下图所示:

每个工作表通过上述方式有且只能创建一个单元格区域的自动筛选。
在vba中,Worksheet对象的AutoFilter属性可以返回上述工作表中的唯一的自动筛选AutoFilter对象,如果工作表中没有为单元格区域开启自动筛选,则AutoFilter属性返回 Nothing。
当为单元格区域添加自动筛选后,就可以通过显示的下拉箭头对各个字段进行筛选,不同的字段可以分别筛选,如下图所示分别对“姓名”、“月份”字段进行了筛选:

如果要用vba一次性取消所有字段的筛选,可以通过设置Worksheet对象的AutoFilterMode属性为False。
'取消所有字段的筛选 oWK.AutoFilterMode = False
但是不能通过设置Worksheet对象的AutoFilterMode属性为True对原单元格区域重新启用自动筛选。
如果要再次对原单元格区域重新启用自动筛选,可以先用AutoFilter对象的Range属性返回启用了自动筛选的单元格区域Range对象,然后再对Range对象执行AutoFilter方法即可。
代码如下:
Sub QQ1722187970()
Dim oWK As Worksheet
Set oWK = Excel.ActiveSheet
Dim oAF As AutoFilter
Dim oRng As Range
Set oAF = oWK.AutoFilter
'如果没有自动筛选
If oAF Is Nothing Then
'如果有自动筛选
Else
With oAF
Set oRng = .Range
'取消所有字段的筛选,同时取消自动筛选的下拉箭头
oWK.AutoFilterMode = False
'重新显示自动筛选
oRng.AutoFilter
End With
End If
End Sub
除了通过设置Worksheet对象的AutoFilterMode属性为False清除所有字段的筛选,还可以使用AutoFilter对象的ShowAllData方法清除所有字段的筛选。通过AutoFilter对象的ShowAllData方法清除所有字段的筛选不会使得原单元格区域清空自动筛选,代码如下:
Sub QQ1722187970()
Dim oWK As Worksheet
Set oWK = Excel.ActiveSheet
Dim oAF As AutoFilter
Dim oRng As Range
Set oAF = oWK.AutoFilter
'如果没有自动筛选
If oAF Is Nothing Then
'如果有自动筛选
Else
With oAF
'清除所有字段的筛选,同时保留自动筛选的下拉箭头
.ShowAllData
End With
End If
End Sub


发表评论