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

时间:2016-07-15 19:56:39

标签: arrays excel vba excel-vba autofilter

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

我已经尝试过两种方式

1)

With Sheet17

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

End With

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

2)

For i = 0 To counter - 1

  With Sheet17

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

Next

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

2 个答案:

答案 0 :(得分:10)

如果您只引用E列,则无需从数组中转置单个元素,也无法将条件放入5 th 字段。

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

传递数组时指定Operator:=xlFilterValuesRange.AutoFilter Method喜欢字符串作为数组中的值。

答案 1 :(得分: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