配列の操作

●Filter関数

 Filter関数は、対象となる文字列配列から、指定された検索文字列に一致した項目数分だけの要素が含まれた配列を返します。
 まず、次のような配列を想定してください。

土橋内科
山川外科
斎藤内科医院
館林内科クリニック
成城歯科
 このように、“内科”、“外科”、“歯科”が混在している要素をもつ配列から、Filter関数を使って“内科”のみを抽出してみましょう。その処理を実行しているのがリスト1です。

リスト1:“内科”を含む文字列のみを抽出する

 Sub FilterSample()
     Dim myData(1 To 5)	As String
     Dim myFilter	As Variant
     Dim myVnt	As Variant
     Dim myMsg	As String
 
     myData(1) = "土橋内科"
     myData(2) = "山川外科"
     myData(3) = "斎藤内科医院"
     myData(4) = "館林内科クリニック"
     myData(5) = "成城歯科"
 
     myFilter = Filter(myData, "内科")−
     
     myMsg = "抽出結果は、"
     For Each myVnt In myFilter
         myMsg = myMsg & "「" & myVnt & "」"
     Next myVnt
     myMsg = myMsg & "です。"
     MsgBox myMsg
 
 End Sub

 このマクロを実行すると、図1のように、
“抽出結果は、「土橋内科」「斎藤内科医院」「館林内科クリニック」です。”
とメッセージボックスが表示されます。

図1:“内科”を含む配列要素だけが抽出されたメッセージ

 検索文字列の位置が確定していない要素からなる配列から、Filter関数を使わずに抽出するには、InStr関数などを使って、配列の要素の数だけループしながらマッチする文字列が含まれているかどうかを判断するなど、これまでは一筋縄ではいかなかったのではないでしょうか。しかし、Filter関数を使うと、リスト1内ののステートメントのように1行で片づいてしまいます。また、配列中に一致する文字列がない場合は空の配列を返し、配列がNull値であるか、1次元配列でない場合はエラーになります。そして、返される値を格納する変数は、Variant型を用意します。
 また、返される配列のインデックスは常に“0”から始まります。Filter関数の構文は以下のとおりです。

Filter(文字列,検索文字列[,検索条件[,比較モード]])
 検索条件には、「True:条件に一致するものを検索する(省略時の既定値)」、または「False:条件に一致しないものを検索する」、もしくは「ブール値」を指定します。
 それでは、リスト1の
myFilter = Filter(myData, "内科")
を、Falseにしてみましょう。
myFilter = Filter(myData, "内科", False)
となります。検索条件にFalseを指定すると、図2のメッセージボックスが表示されます。

図2:“内科”を含まない配列要素だけが抽出されたメッセージ

 比較モードには、文字列を比較するときに使うモードを表わす定数を指定します。定数は、Option Compareステートメントの設定を使用して比較を行なう「vbUseCompare-Option(値:-1)」、バイナリモードの比較を行なう「vbBinaryCompare(値:0)」、テキストモードの比較を行なう「vbTextCompare(値:1)」、Accessの場合のみ有効のデータベースに格納されている設定に基づいて比較を行なう「vbDatabaseCompare(値:2)」、のいずれかを指定します。