web-dev-qa-db-ja.com

VBAオートフィルターの条件として文字列配列を使用する

私は他の投稿を検索しましたが、同様の問題を見つけましたが、特に私を助けることはできませんでした。文字列の配列を取得し、フィルター条件として使用しようとしています。配列は関数によって作成され、要素と内容の数が可​​変であるため、注意が必要です。オートフィルターを使用して、各要素のcolumn Eをチェックする必要があります。

私は2つの方法を試しました

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は、配列内の要素の数を表す整数です結果:これは、配列を正しくループしますが、フィルターの最後のオプションのみを選択します-おそらく、ループバックするたびに最初からやり直し、他のすべてのオプションをオフにするため最後に、最新のオプションのみがチェックされたままになります。

7
slzar

配列から単一の要素を転置する必要はなく、5に基準を置くことはできません番目 列Eのみを参照している場合は、フィールド.

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:=xlFilterValuesを指定し、 Range.AutoFilter Method が配列内の値として文字列を好みます。

10
user4039065

AutoFilter のExcelドキュメントには、いくつかのガイダンスがあります。 Operatorパラメーターは、Criteria1の解釈方法を指定する XlAutoFilterOperator を取ります。あなたの場合、xlFilterValuesの値を指定すると、Criteria1がフィルター値の配列として適切に解釈されます。

以下に例を示します。

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

Sheet17.Range("E1").AutoFilter _
    Field:=5, _
    Criteria1:=arr, _
    Operator:=xlFilterValues
6