如何使用VBA在Excel 2016中获取筛选条件?

4

我正在开发一个Excel 2016 VBA宏,该宏会对标题列应用筛选器。之后,用户应用筛选条件。我希望能够在VBA中检索用户应用的筛选条件并将其保存到字符串数组中。是否有办法访问筛选条件?


请点击以下链接以查看与 mmurietta 的帖子相关的编程问题:https://www.mrexcel.com/forum/excel-questions/333961-capture-autofilter-state.html - Tim Williams
3个回答

5
我查看了这个问题,基本上复制了代码的前面一部分,但唯一的问题是它没有显示应用于哪个字段,这可能会有问题。
Dim sht As Worksheet
Set sht = ActiveSheet
With sht.AutoFilter
    With .Filters
        ReDim filtarr(1 To .Count, 1 To 3)
        For f = 1 To .Count
            With .Item(f)
                If .On Then
                    filtarr(f, 1) = .Criteria1
                    Debug.Print .Criteria1
                    If .Operator Then
                        filtarr(f, 2) = .Operator
                        filtarr(f, 3) = .Criteria2
                        Debug.Print .Operator & ", " & .Criteria2
                    End If
                End If
            End With
        Next f
    End With
End With

(a) 它所应用的领域不是由sht.AutoFilter.Range.Columns(f).Column(即筛选范围的Columns(f)列)确定的吗?(b) 如果用户选择了一个字段中的值列表而不仅仅是一个或两个值,则需要稍微调整代码(在这种情况下,Criteria1将是一个变体数组,可以通过filtarr(f,1)(1)filtarr(f,1)(2)等来访问)。 - YowE3K
谢谢您的回复。但是,我在执行带有.Filters的那行时遇到了问题。错误信息是:“运行时错误'91':对象变量或With块变量未设置”。 - Max Tither
@MaxTither - 首先需要测试sht.AutoFilter是否不是Nothing- 如果没有应用自动筛选,那么就无法访问其Filters属性。 - Tim Williams
最终,我没有使用这种方法来解决我的问题,而是使用了数据透视表。我会相信你的话,认为这是一个解决方案。谢谢@mmurrietta。 - Max Tither

1
我想在讨论中添加一点内容。当我调查如何“返回”筛选器状态时,我发现了这个(和其他优秀的帮助来源)。在我的情况下,我想在工作表上的单元格中显示筛选器状态。
正如我所说,这个问题和许多类似的问题非常有用。从那里,我能够构建下面代码中显示的函数。
我将其传递给我想要筛选器状态的表的名称...因此它作为RANGE传递,然后需要在PARENT(sheet)中查找信息。这是因为可能会有几个表来自它所在的SHEET,因此我不能只使用SHEET本身来获取Autofilter信息。
这很有效,除了一件事:如果工作表上的活动单元格不在所讨论的表内,该函数将看到筛选器数量为零(在下面的示例中为WholeTable.Parent.Autofilter.Filters.Count)。我不明白为什么会这样,也不知道如何防止它。如果活动单元格在表范围内,则完美地工作。
任何提示都将不胜感激!
代码:
Public Function AutoFilterCriteria(ByVal WholeTable As Range) As String

On Error Resume Next

If WholeTable.Parent.AutoFilter Is Nothing Then                     ' if no filter is applied
    AutoFilterCriteria = "None"
    On Error GoTo 0
    Exit Function
End If

Dim LongStr As String, FirstOne As Boolean
LongStr = ""
FirstOne = False

Dim iFilt As Integer
For iFilt = 1 To WholeTable.Parent.AutoFilter.Filters.Count         ' loop through each column of the table
    Dim ThisFilt As Filter
    Set ThisFilt = WholeTable.Parent.AutoFilter.Filters(iFilt)      ' look at each filter
    On Error Resume Next
    With ThisFilt
        If .On Then
            If FirstOne Then LongStr = LongStr & " AND "            ' Get column title
            LongStr = LongStr & "[" & WholeTable.Parent.Cells(WholeTable.Row - 1, WholeTable.Column + iFilt - 1).Value & ":"
            On Error GoTo Handle
            If .Operator = xlFilterValues Then                      ' dont really care to enumerate multiples, just show "multiple"
                LongStr = LongStr & "<Multiple>]"
            ElseIf .Operator = 0 Then
                LongStr = LongStr & .Criteria1 & "]"
            ElseIf .Operator = xlAnd Then
                LongStr = LongStr & .Criteria1 & " AND " & .Criteria2 & "]"
            ElseIf .Operator = xlOr Then
                LongStr = LongStr & .Criteria1 & " OR " & .Criteria2 & "]"
            End If
            On Error GoTo 0
            FirstOne = True
        End If
    End With
Next

AutoFilterCriteria = LongStr
On Error GoTo 0
Exit Function

Handle:
AutoFilterCriteria = "! Error !"
On Error GoTo 0

End Function

修复。在此处查看答案:[链接](https://stackoverflow.com/questions/54291924/finding-the-status-of-arbitrarily-applied-autofilter-in-excel-2016) - Neil Cothran

0

代码应该像这样。字段的代码是cells(1, f)。

Dim sht As Worksheet
Set sht = ActiveSheet
With sht.AutoFilter
    With .Filters
        ReDim filtarr(1 To .Count, 1 To 4) ' change array
        For f = 1 To .Count
            With .Item(f)
                If .On Then
                    filtarr(f, 1) = .Criteria1
                    filtarr(f, 4) = Cells(1, f) 'field
                    Debug.Print .Criteria1, Cells(1, f)
                    If .Operator Then
                        filtarr(f, 2) = .Operator
                        filtarr(f, 3) = .Criteria2

                        Debug.Print .Operator & ", " & .Criteria2
                    End If
                End If
            End With
        Next f
    End With
End With

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接