【问题标题】:How do I get Filter Criteria in Excel 2016 using VBA?如何使用 VBA 在 Excel 2016 中获取筛选条件?
【发布时间】:2017-12-09 18:05:30
【问题描述】:

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

【问题讨论】:

标签: vba excel


【解决方案1】:

我检查了this question 并且几乎复制了代码的第一部分,唯一的问题是你没有得到它所应用的可能有问题的字段。

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 在这种情况下将是一个 Variant 数组,可以通过filtarr(f,1)(1) 访问,则需要对代码进行一些调整, filtarr(f,1)(2)等)
  • 感谢您的回复。但是,我在执行带有 .Filters 的行时遇到问题。错误是:“运行时错误'91':对象变量或未设置块变量”
  • @MaxTither - 您首先需要测试 sht.AutoFilter 是否不是 Nothing - 如果没有应用自动过滤器,则您无法访问其 Filters 属性
  • 最后,我并没有最终使用这种方法来解决我的问题,而是使用了数据透视表。我会相信你的话,这是一个解决方案。谢谢@mmurrietta
【解决方案2】:

代码应该是这样的。字段代码为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

【讨论】:

    【解决方案3】:

    我想在讨论中补充一点。在调查如何“返回”过滤器状态时,我发现了这一点(以及其他出色的帮助来源)。就我而言,我想在工作表的单元格中显示过滤器状态。

    正如我所说,这个问题和许多其他类似的问题都非常有用。由此,我能够构建如下代码所示的函数。

    我将我想要过滤状态的表的名称传递给它......因此它作为一个范围传递,然后它需要在父(表)中查找信息。这是因为它来自的 SHEET 上可能有多个 Tables,所以我不能只使用 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
    

    【讨论】:

    • 已修复。请在此处查看答案:link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多