VBA 配列にフィルタをかける
In this Article
VBAのフィルタ関数を使うと、配列にすばやくフィルタをかけることができます。配列のフィルタリングを行う際には、考慮すべきいくつかの設定があります。以下では、それらについて説明します。
フィルタ – 一致
デフォルトでは、VBA Filter関数は配列でマッチするものをフィルタします。以下の例では、”Smith” にマッチする配列をフィルタリングします。
Sub Filter_Match()
'配列を定義する
Dim strNames As Variant
strNames = Array("Steve Smith", "Shannon Smith", "Ryan Johnson")
'配列をフィルタする
Dim strSubNames As Variant
strSubNames = Filter(strNames, "Smith")
'フィルタされた配列を数える
MsgBox "Found " & UBound(strSubNames) - LBound(strSubNames) + 1 & " names."
End Sub
重要な点が2つあります。
- フィルタされた配列変数は、配列のサイズを定義しないように、データ型バリアントとして宣言する必要があります。
- デフォルトでは、Filter 関数は大文字と小文字を区別します。そのため、”smith” でフィルタリングすると、”Smith” とは異なる結果が返されます。以下では、この設定を変更する方法を説明します。
フィルタ – 大文字小文字を区別しない
デフォルトでは、VBAはCase Sensitive(大文字と小文字を区別する)です。つまり、テキストが一致するためには、大文字と小文字が同じでなければなりません。(例:「smith」は「Smith」と同じではありません。)これは、Filter関数だけでなく、他のほぼすべてのVBA関数や比較にも当てはまります。 個人的には、VBAで大文字と小文字を区別してほしくないので、すべてのコードモジュールの先頭に必ずOption Compare Textを追加しています。Option Compare Textは、VBAに大文字小文字を無視するように指示し、Case Insensitive(大文字と小文字を区別しない)にします。
Option Compare Text
Option Compare Text をモジュールの先頭に追加すると、Filter 関数は大文字と小文字を区別しなくなります。あるいは、Filter 関数自体にvbTextCompare引数で大文字と小文字を区別しないように指示することもできます。
strSubNames = Filter(strNames, "smith", , vbTextCompare)
以下は大文字と小文字を区別しない例です。
Sub Filter_MatchCase()
'配列を定義する
Dim strNames As Variant
strNames = Array("Steve Smith", "Shannon Smith", "Ryan Johnson")
'配列をフィルタする
Dim strSubNames As Variant
strSubNames = Filter(strNames, "smith", , vbTextCompare)
'フィルタされた配列をカウントする
MsgBox "Found " & UBound(strSubNames) - LBound(strSubNames) + 1 & " names."
End Sub
フィルタ – 一致しない
Filter関数は、Include引数をFALSEに設定することで、入力された条件に一致しない配列項目を特定することもできます。
strSubNames = Filter(strNames, "Smith", False)
以下の例をご覧ください。
Sub Filter_NoMatch()
'配列を定義する
Dim strNames As Variant
strNames = Array("Steve Smith", "Shannon Smith", "Ryan Johnson")
'配列をフィルタする
Dim strSubNames As Variant
strSubNames = Filter(strNames, "Smith", False)
'フィルタされた配列を数える
MsgBox "Found " & UBound(strSubNames) - LBound(strSubNames) + 1 & " names."
End Sub
Filter関数
VBAのFilter関数は、与えられた文字列配列のArrayサブセットを返します。 Filter関数の構文は次のとおりです。
Filter( SourceArray, Match, [Include], [Compare] )
関数の引数は次のとおりです。
- SourceArray – フィルタの対象となる元の配列
- Match – 検索する文字列
- [Include] -(オプション) TRUE (マッチしたものを返す)、FALSE (マッチしない要素を返す)
- [Compare] – (オプション) vbBinaryCompare – バイナリ比較(大文字と小文字を区別する)、vbTextCompare – テキスト比較(大文字と小文字を区別しない)、vbDatabaseCompare – データベース比較