Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在AutoFilter Excel中获取未选中的条件_Vba_Excel - Fatal编程技术网

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

Vba 如何在AutoFilter Excel中获取未选中的条件,vba,excel,Vba,Excel,在VBA中使用excel2007 我们有一张桌子。用户已将第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

在VBA中使用excel2007 我们有一张桌子。用户已将第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

在错误恢复下一步时使用
可防止程序在没有可见单元格时抛出错误,打印一条消息并退出该过程。

好的,所以我想我需要找到一种只获取唯一值的方法。@D_Bester尝试使用集合。这是一个很好的开始,但我最终使用
转置将1列范围转储到1D数组中。
;然后我把数组放到一个集合中,只得到唯一的值;最后,我将集合放入另一个1D数组中供以后使用。实际上,我使用的是整个DataodyRange.Columns(5),而不仅仅是可见范围,因为我需要所有可能的值。“这会产生误导。”我将标题改为“条件”,而不是“项目”,因为我真正想知道的是用户选择了哪些条件,以及他们没有选择哪些条件。