Microsoft Excel を使用して VBA でオートフィルターを使用しています。フィルタリングのために配列を処理する方法に問題があります。元のコンテキストを簡素化したバージョンに骨抜きにしました (最初は問題を理解することを期待していました):
範囲 A1:A5 のワークシートに、それぞれFruit
、Apple
、Banana
、Orange
があるとPear
します。Fruit
列ヘッダーなどのオートフィルターが適用されています。
以下のコードを実行すると、期待どおりの結果が返されます ( Apple
、Banana
、およびではありOrange
ませんPear
)。
Range("A1").Select
ActiveSheet.Range("A1:A5").AutoFilter Field:=1, _
Criteria1:=Array("=*an*", "=*app*"), Operator:=xlFilterValues
私が取り組んでいるプロジェクトでは、フィルター基準は上記のように機能する文字列変数として渡されます。問題は、すべての基準が毎回適用されるわけではないため、それらのいくつかは効果がないはずです。
例えば:
Dim A As String, B As String, C As String
A = "=*an*"
B = Empty
C = "=*ap*"
Range("A1").Select
ActiveSheet.Range("A1:A5").AutoFilter Field:=1, _
Criteria1:=Array(A, B, C), Operator:=xlFilterValues
ミックスにB
投入すると、フィルタリングはレコードを返しません (null のままにするか、 に設定するEmpty
か、または のようなワイルドカードを使用します=*
)。ただし、実際の基準配列で (ハードコードされた) に置き換えるB
とEmpty
、期待される結果が返されます。
ListObject の一部である AutoFilter を使用していましたが、過去に同様のコードを使用したことがあります (そして動作させました)。この時点で、私が考えることができる唯一のことは、フィルターを区切り文字付きの文字列に連結し、それを配列変数に分割することです(コレクション内の設定されていないアイテムが同じように混乱するため、正確なサイズになります)標準変数はそうします)。しかし、それは直感的ではなく、扱いにくいようです。
ここで明らかな何かが欠けていますか?