如何将自动筛选字段和 Criteria1 存储到变量

问题描述 投票:0回答:2

下面的代码行会将过滤器 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 后,我可以将过滤器返回到原来的状态

事实上我无法尝试任何事情[[在此处输入图像描述](enter image description here)](https://i.stack.imgur.com/b36PB.png)

excel vba
2个回答
0
投票

您可以将过滤条件保存到变量数组中,如下所示:

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

0
投票

您可以使用此功能检索过滤器的当前设置。

假设:您通过复选框选择了值。更复杂的过滤器,例如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

您可能需要添加错误处理。

© www.soinside.com 2019 - 2024. All rights reserved.