如何在AutoFilter Excel中获取未选择的条件

时间:2014-03-10 10:54:16

标签: excel vba excel-vba

将Excel 2007与VBA一起使用 我们有一张桌子。用户已将第5列过滤为某些项目。我知道我可以使用以下方式获得当前选择的标准:

'set table
Dim loStats As ListObject
Set loStats = ws.ListObjects("TableStats")

'get filter list
Dim af5 As Variant
af5 = loStats.AutoFilter.Filters(5).Criteria1

'print
Dim x As Integer
For x = LBound(af5) To UBound(af5)
    Debug.Print af5(x)
Next

但是当用户从第5列清除过滤器时呢。用户在第5列中清除过滤器后这不起作用

af5 = loStats.AutoFilter.Filters(5).Criteria1

如何获取用户在下拉框中看到的可能标准列表?

1 个答案:

答案 0 :(得分:1)

那么,我从哪里开始?

首先,您错误地假设结果将是一个数组。如果我只选择一个值,则LBound(af5)将返回类型不匹配错误。你可以用

来纠正它
If IsArray(Arr) Then
    For i = LBound(Arr) To UBound(Arr)
        Debug.Print Arr(i)
    Next
Else
    Debug.Print Arr
End If         

不幸的是,这并没有解决任何问题。您的过程不会打印出当前已过滤的项目,而是打印出用户选择的条件。这会产生误导。

考虑一个包含两列的表。当用户将条件指定为>3时,您将看到>3的结果。它实际上告诉您过滤的值是什么?你不知道选择了多少(如果有的话)以及它们是哪一个。例如,第二列可以存储{1,2,3},但也可以存储{3,7.99}。

这就是我这样做的方式:

Sub PrintOutFilteredData()
    Dim Tbl As ListObject
    Dim CellCount As Long
    Dim Cell As Range
    Dim Arr() As Variant
    Dim i As Long

    Set Tbl = ActiveSheet.ListObjects("Table1")

    On Error Resume Next
    CellCount = Tbl.DataBodyRange.Columns(2).SpecialCells(xlCellTypeVisible).Cells.Count
    If Err.Number = 1004 Then
        Debug.Print "All data was filtered out"
        Exit Sub
    End If

    For Each Cell In Tbl.DataBodyRange.Columns(2).SpecialCells(xlCellTypeVisible)
        If IsEmpty(Arr(0)) Then
            ReDim Arr(0 To 0)
            Arr(0) = Cell.Value
        Else
            ReDim Preserve Arr(0 To UBound(Arr) + 1)
            Arr(UBound(Arr)) = Cell.Value
        End If
    Next Cell

    For i = LBound(Arr) To UBound(Arr)
        Debug.Print Arr(i)
    Next i
End Sub

使用On Error Resume Next可防止程序在没有可见单元格时抛出错误,打印出邮件并退出程序。