如何在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
可防止程序在没有单元格可见的情况下抛出错误,打印出消息并退出程序。