在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
发表评论