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

时间:2017-07-05 22:23:12

标签: excel vba excel-vba

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

提前谢谢你。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

代码就是这样的。字段代码是单元格(1,f)。

type

答案 2 :(得分:0)

我想在讨论中增加一点。在研究如何“返回”过滤器状态时,我找到了这个(以及其他出色的帮助资源)。就我而言,我想在工作表的单元格中显示过滤器状态。

正如我所说,这个问题以及许多其他类似问题都非常有用。由此,我能够构建下面代码中显示的功能。

我将需要过滤器状态的表的名称传递给它...因此,它以RANGE的形式传入,然后需要在PARENT(工作表)中查找信息。这是因为SHEET上可能有几个表,所以我不能仅仅使用SHEET本身来获取自动过滤器信息。

这很有效,除了以下几点:如果工作表上的活动单元格不在所讨论的表中,则该函数会将过滤器的数量视为零(示例中的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