下面的代码行会将过滤器 field1 设置为“Ford”、“GMC”、“Caprice” 并将 field2 改为“1980”、“1990”、“1995”
ActiveSheet.Range("$B$8:$C$712").AutoFilter Field:=1, Criteria1:=Array("Ford", "GMC", "Caprice"), Operator:=xlFilterValues
ActiveSheet.Range("$B$8:$C$717").AutoFilter Field:=2, Criteria1:=Array("1980", "1990", "1995"), Operator:=xlFilterValues
I
想知道如何将自动过滤器的字段和 Criteria1 存储在变量中,以便在运行一些宏并将 autofiltermode 设置为 off 后,我可以将过滤器返回到原来的状态
您可以将过滤条件保存到变量数组中,如下所示:
savedfilter1 = ActiveSheet.AutoFilter.Filters(1).Criteria1
savedfilter2 = ActiveSheet.AutoFilter.Filters(2).Criteria1
恢复价值观
ActiveSheet.Range("$B$8:$C$712").AutoFilter Field:=1, Criteria1:=savedfilter1, Operator:=xlFilterValues
ActiveSheet.Range("$B$8:$C$712").AutoFilter Field:=2, Criteria1:=savedfilter2, Operator:=xlFilterValues
您可以使用此功能检索过滤器的当前设置。
假设:您通过复选框选择了值。更复杂的过滤器,例如1 到 100 之间的值或日期需要更复杂的代码。
Public Function readCurrentFilter(af As AutoFilter) As Variant
If af.FilterMode = False Then Exit Function
With af
Dim arrFilterSettings As Variant
ReDim arrFilterSettings(2, .Filters.Count - 1)
Dim f As Filter, i As Long
For Each f In af.Filters
arrFilterSettings(0, i) = f.On
If f.On = True Then
arrFilterSettings(1, i) = f.Criteria1
arrFilterSettings(2, i) = f.Operator
End If
i = i + 1
Next
End With
readCurrentFilter = arrFilterSettings
End Function
要根据以前的值进行过滤,您可以使用此子:
Public Sub setFilter(af As AutoFilter, arrFilterSettings As Variant)
Dim f As Filter, i As Long
With af.Range
For i = 0 To UBound(arrFilterSettings, 2)
If arrFilterSettings(0, i) = True Then
If IsArray(arrFilterSettings(1, i)) Then 'multiple values
.AutoFilter i + 1, arrFilterSettings(1, i), arrFilterSettings(2, i)
Else
.AutoFilter i + 1, arrFilterSettings(1, i)
End If
End If
Next
End With
End Sub
要测试这两个潜艇,请尝试以下操作:
Public Sub test()
Dim af As AutoFilter
Set af = ActiveSheet.AutoFilter
Dim arrFilterSettings As Variant
arrFilterSettings = readCurrentFilter(af)
af.ShowAllData
setFilter af, arrFilterSettings
End Sub
您可能需要添加错误处理。