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

使用Excel 2007与VBA我们有一个表。 用户已将第5列过滤到特定项目。 我知道我可以得到当前select的标准使用:

'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列中的filter时怎么办?在用户清除第5列中的filter之后,这不起作用

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

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

那么,我从哪里开始呢?

首先,你错误地认为结果是一个数组。 如果我只select一个值,那么LBound(af5)将返回一个types不匹配错误。 你可以纠正它

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

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

考虑一个有两列的表格。 当用户指定标准为>3 ,您将看到的结果是>3 。 它实际上告诉你什么是被过滤的值? 你不知道有多less(如果有的话)被选中,他们是哪一个。 例如,第二列可以存储{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可防止程序在没有单元格可见的情况下抛出错误,打印出消息并退出程序。