vba - 如何在自动筛选 Excel 中获取未选择的条件

标签 vba excel

将 Excel 2007 与 VBA 一起使用
我们有一张 table 。用户已将第 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

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

最佳答案

那么,我从哪里开始呢?

首先,您错误地假设结果将是一个数组。如果我只选择一个值,那么 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防止程序在没有单元格可见时抛出错误,打印出一条消息并退出程序。

关于vba - 如何在自动筛选 Excel 中获取未选择的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22298191/

相关文章:

vba - Excel VBA获取范围内的非空行数

Excel VBA : How to get COUNTIF function to not pick up text cells "1.1" and "1.10" as Duplicates?

excel - 将文本文件转换为 Excel

excel - 如何通过名称获取控件名称?

vba - 在多个工作簿中使用相同的热键

vba - 使用 VBA 调整用户窗体及其控件的大小

excel - 将 Excel 数据复制到文本文件中

java: ByteArrayOutputStream.toByteArray() 性能

javascript - 向服务器发出 JSON POST 请求,收到二进制响应(Excel 文件),如何下载?

excel - 使用 FIXED 的 Tableau 计算字段