土橋内科
山川外科
斎藤内科医院
館林内科クリニック
成城歯科
このように、“内科”、“外科”、“歯科”が混在している要素をもつ配列から、Filter関数を使って“内科”のみを抽出してみましょう。その処理を実行しているのがリスト1です。
リスト1:“内科”を含む文字列のみを抽出する |
|
このマクロを実行すると、図1のように、
“抽出結果は、「土橋内科」「斎藤内科医院」「館林内科クリニック」です。”
とメッセージボックスが表示されます。
図1:“内科”を含む配列要素だけが抽出されたメッセージ |
![]() |
検索文字列の位置が確定していない要素からなる配列から、Filter関数を使わずに抽出するには、InStr関数などを使って、配列の要素の数だけループしながらマッチする文字列が含まれているかどうかを判断するなど、これまでは一筋縄ではいかなかったのではないでしょうか。しかし、Filter関数を使うと、リスト1内ののステートメントのように1行で片づいてしまいます。また、配列中に一致する文字列がない場合は空の配列を返し、配列がNull値であるか、1次元配列でない場合はエラーになります。そして、返される値を格納する変数は、Variant型を用意します。
また、返される配列のインデックスは常に“0”から始まります。Filter関数の構文は以下のとおりです。
Filter(文字列,検索文字列[,検索条件[,比較モード]])
検索条件には、「True:条件に一致するものを検索する(省略時の既定値)」、または「False:条件に一致しないものを検索する」、もしくは「ブール値」を指定します。myFilter = Filter(myData, "内科")
を、Falseにしてみましょう。myFilter = Filter(myData, "内科", False)
となります。検索条件にFalseを指定すると、図2のメッセージボックスが表示されます。
図2:“内科”を含まない配列要素だけが抽出されたメッセージ |
![]() |
比較モードには、文字列を比較するときに使うモードを表わす定数を指定します。定数は、Option Compareステートメントの設定を使用して比較を行なう「vbUseCompare-Option(値:-1)」、バイナリモードの比較を行なう「vbBinaryCompare(値:0)」、テキストモードの比較を行なう「vbTextCompare(値:1)」、Accessの場合のみ有効のデータベースに格納されている設定に基づいて比較を行なう「vbDatabaseCompare(値:2)」、のいずれかを指定します。