在VBA自动过滤器中使用字符串数组作为条件

slz*_*zar 8 arrays excel vba autofilter

我搜索了其他帖子,发现了类似的问题,但没有什么可以帮我具体.我正在尝试获取一个字符串数组并将其用作过滤条件.这很棘手,因为数组是由一个函数创建的,并且具有可变数量的元素和内容.我需要自动过滤器来检查它并检查每个元素的E列.

我试过两种方式

1)

With Sheet17

    .Range("E1").AutoFilter Field:=5, Criteria1:=Application.Transpose(arr)

End With
Run Code Online (Sandbox Code Playgroud)

结果:对列E应用筛选器,但无法选择任何选项

2)

For i = 0 To counter - 1

    With Sheet17

        .Range("E1").AutoFilter Field:=5, Criteria1:=Application.Transpose(arr(i))

    End With

Next
Run Code Online (Sandbox Code Playgroud)

注意:Counter是一个整数,表示数组中元素的数量结果:这个正确循环遍历数组,但只选择过滤器上的最后一个选项 - 大概是因为每次循环回来都会重新开始并取消选中所有其他选项所以到最后,只检查最新的选项.

小智 11

您不需要从数组中转置单个元素,如果仅引用列E,则无法将条件放入第5 字段.

Dim i As Long, arr As Variant
arr = Array(1, 3)

With Sheet17
    'to filter each value in the array one at a time
    For i = 0 To UBound(arr)
        .Columns("E").AutoFilter Field:=1, Criteria1:=arr(i)
    Next i

    'my values were numbers - AutoFilter likes strings in its array
    For i = LBound(arr) To UBound(arr)
        arr(i) = CStr(arr(i))
    Next i

    'to filter all values in the array at once specify xlFilterValues
    .Columns("E").AutoFilter Field:=1, Criteria1:=arr, _
                             Operator:=xlFilterValues
End With
Run Code Online (Sandbox Code Playgroud)

指定Operator:=xlFilterValues传递数组的时间,Range.AutoFilter方法将字符串作为数组中的值.


Bre*_*ton 6

AutoFilter的Excel文档提供了一些指导.该Operator参数采用XlAutoFilterOperator来指定Criteria1解释方式.在您的情况下,指定值xlFilterValues将导致Criteria1正确解释为过滤器值数组.

以下示例演示了这一点:

Dim arr As Variant
arr = Array("Alpha", "Bravo", "Charlie")

Sheet17.Range("E1").AutoFilter _
    Field:=5, _
    Criteria1:=arr, _
    Operator:=xlFilterValues
Run Code Online (Sandbox Code Playgroud)