HOME > 即効テクニック > Excel VBA > 関数関連のテクニック > 配列の中から条件に一致する要素を取り出す(Filter関数)

配列の中から条件に一致する要素を取り出す(Filter関数)|Excel VBA

関数関連のテクニック

配列の中から条件に一致する要素を取り出す(Filter関数)

(Excel 2000/2002/2003/2007/2010/2013/2016)

Filter関数は、文字列型の配列の中から、指定された文字列を含む(あるいは含まない)要素を取り出し、文字列型の配列として返します。 引数Compareで指定する比較モードはSplit関数の引数と同じ内容です。

使用する定数に関しては「文字列を分割し1次元配列として返す(Split関数)」を参照してください。

構文 Filter(SourceArray, Match, Include, Compare)
設定項目内容
SourceArray 抽出元の配列。文字列型の1次元配列を指定 [省略不可]
Match 検索する文字列を指定 [省略可能]
Include True:検索文字列を含む要素を返す(既定値)、
False:検索文字列を含まない要素を返す [省略可能]
Compare 文字列式を比較するときの比較モードを指定 [省略可能]

次のサンプルは、Filter関数とSplit関数とJoin関数を組み合わせて、区切り文字で分割された文字列データを、条件に一致する文字列データだけにします。

Sub Sample()
    Dim myAddress As String
    Dim myArray() As String
    Dim myMsg As String

    '---複数のセル範囲のアドレスを取得
    myAddress = Application.InputBox( _
        Prompt:="複数範囲を選択してください" & vbCr & "( [Ctrl] + 範囲選択 )" _
        , Type:=8).Address
        
    '---(1)Split関数で配列に格納
    myArray = Split(myAddress, ",")
    
    '---(2)文字列"A"を含むアドレスだけを残す
    myArray = Filter(myArray, "A", True)
    
    '---(3)Join関数で配列からカンマ区切りの文字列に戻す
    myAddress = Join(myArray, ",")
    
    If myAddress = "" Then
        MsgBox "A列を含む範囲はありませんでした"
    Else
        Range(myAddress).Select
       MsgBox "A列を含むセル範囲 (" & myAddress & ") だけを選択しました"
    End If
End Sub

●解説●

(1)では、Split関数を利用して複数のセル範囲のアドレスを配列に格納しています。
(2)では、Filter関数を利用して、アドレスの文字列にAを含む要素だけからなる配列に変更しています。その配列を、(3)のステートメントで文字列に戻しています。

●ポイント●

Join関数、Split関数と同じく、Filter関数もExcel2000で追加された機能です。
これら3つの関数は、文字列と文字列型の配列を操作する点で共通しており、組み合わせて使用することが多いので、3つまとめて理解しておいてください。