#720 配列内を検索して指定文字列を含む要素があるか調べるには? VBA

配列内を検索する方法はいくつかありますが、ここでは「Filter」関数を使って指定文字列がいずれかの要素にあるかどうかを調べ、その有無をBool値で返すサンプルプロシージャを紹介します。

「Filter」関数では、第1引数に指定した配列内に第2引数の値があるかどうかを調べます。その際、すべての文字が完全に一致している要素だけではなく、部分的に一致したものもヒットしたとカウントされます。
そして、見つかった配列要素内のデータが”検索結果の配列”に代入され返されます(※注)。もし複数の要素がヒットした場合にはその配列にも複数の要素が存在していることになります。一方、1件も見つからなかった場合には空の状態になりますので、その要素数をUBound関数で調べると「-1」が返されます。

※注)”検索結果の配列”の内容を調べることで、該当した元の配列のデータ内容を取得することもできます。

Public Function ArrayFilter(ArrayData As Variant, strKeyword As String) As Boolean
'概要 配列内の探索をFilter関数を使って行う
'引数 ArrayDat   : 検索する配列データ
'     strKeyword : 検索する値
'返値 いずれかの要素にあればTrue、なければTrue

  Dim avarFind As Variant

  'Filterで検索してヒットした要素のデータを配列にセット
  avarFind = Filter(ArrayData, strKeyword)

  'ヒット結果の配列があるかどうかで返り値を設定
  ArrayFilter = (UBound(avarFind) > -1)

  '下記はデバッグ用
  Debug.Print "ヒット件数: " & UBound(avarFind) + 1

End Function


下記はサンプルプロシージャを呼び出す例です。事前に配列を用意し、検索する文字列とともに上記のArrayFilterプロシージャを呼び出しています。

Sub ArrayFilterTest()

  Dim aDat As Variant

  aDat = Array("茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都")

  Debug.Print "検索結果 : " & ArrayFilter(aDat, "千葉県")
  Debug.Print "検索結果 : " & ArrayFilter(aDat, "栃木県")
  Debug.Print "検索結果 : " & ArrayFilter(aDat, "東京都")
  Debug.Print "検索結果 : " & ArrayFilter(aDat, "東京")
  Debug.Print "検索結果 : " & ArrayFilter(aDat, "東京都千代田区")
  Debug.Print "検索結果 : " & ArrayFilter(aDat, "静岡")
  Debug.Print "検索結果 : " & ArrayFilter(aDat, "県")

End Sub

実行結果:
  • 上記の結果の3〜5番目では、「東京都」は完全一致で存在するのでTrue、「東京」も部分一致で存在するのでTrue、「東京都千代田区」は存在しないのでFalseとなっています。

  • 最後の「県」での検索では、部分一致でその文字を含むものが5つあるので、ヒット件数は「5」(UBound関数の返り値は添え字が0〜4なので「4」)、返り値はTrueとなっています。

参考:
配列内を1つずつループで探索して合致するものがあるかどうかを判別したい場合には、「#355 配列内の探索を行うプロシージャ例」のような方法もあります。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved