【ExcelVBA入門】配列内部の検索方法!高速化対応についても徹底解説

皆さんは、VBAで配列のデータを検索する方法を知っていますか?

配列はデータをひとまとめにして使うことができるので便利なのですが、配列の中の特定の文字が入った値を使うケースはよくあります。

そこで今回は、

・配列とは

といった基礎的なことから、

・配列のデータから部分一致で検索する方法

・配列のデータから完全一致で検索する方法

・その他覚えておくと便利な配列操作

といった応用的な方法まで、徹底的に解説します!

目次

配列とは

最初に、配列について簡単に解説します。

配列とは、「一度に複数の値を格納することができる変数」のことです。

配列内のひとつひとつのデータは、要素と言います。

要素には添字を指定することで、データにアクセスすることができます。

言葉だけではわかりづらいので、簡単なサンプルを用意しました。

サンプルコード:

Dim strMessage(3) as String
strMessage(1) = "要素1"
strMessage(2) = "要素2"
strMessage(3) = "要素3"

この例では、「strMessage」が配列になっており「strMessage(3)」と指定することで、要素が3つの配列を宣言しています。

「strMessage(1)」「strMessage(2)」「strMessage(3)」のようにそれぞれアクセスすることで、値の出し入れをすることができます。

このように、まとめてデータを保存しておきたいときに使えるのが配列です。

また、配列には静的配列と動的配列があります。

静的配列・動的配列の違い、動的配列の詳しい使い方については以下で詳しく解説しているので、気になる方は見てみてくださいね!

配列のデータを検索する方法

配列のデータを検索する方法は、大きく分けて2つあります。

方法1:Filter関数で部分一致検索

はじめに、Filter関数を使って部分一致で検索する方法について解説します。

Filter関数は、次のように使います。

Filter(SourceArray, Match, [Include])

引数はそれぞれ次のような意味があります。

  • SourceArray:抽出元の配列
  • Match:検索する文字列
  • Include:一致/不一致のどちらを取得するか指定 (Trueで一致)

Includeは省略可能で、省略するとTrueになります。

そのため、検索して見つかった配列を調べたい場合は省略、検索して見つかった配列以外を調べたい場合はIncludeをFalseで指定すればOKです。

結果は、配列として返ってきます。

言葉だけだとわかりづらいので、サンプルコードを用意しました。

サンプルコード:

Sub Test()
  Dim strMessage() As String
  Dim strFilMessage() As String
  ReDim strMessage(3)
  strMessage(1) = "太郎"
  strMessage(2) = "次郎"
  strMessage(3) = "侍エンジニア太郎"

  strFilMessage = Filter(strMessage, "太郎")

  Dim strMessageChild As Variant
  For Each strMessageChild In strFilMessage
    Debug.Print strMessageChild
  Next

End Sub

実行結果:

太郎
侍エンジニア太郎

「太郎」「次郎」「侍エンジニア太郎」を入れた配列(strMessage)から、「太郎」含む文字列を「Filter(strMessage, "太郎")」で取得し、For Each文でデータを出力しています。

このように、部分一致で確認する場合はFilter関数が便利です。

方法2:For文 + StrComp関数で完全一致検索

次に、完全一致で検索する方法について解説します。

完全一致を検索する場合は、For文で配列のデータ数分処理をループし、ループ処理の中でStrComp関数を使って完全一致を判定します。

こちらも、サンプルコードを用意しました。

サンプルコード:

Sub Test2()
  Dim i As Integer

  '配列へ値を格納'
  Dim strNameList() As String
  ReDim strNameList(5)
  strNameList(0) = "太郎"
  strNameList(1) = "次郎"
  strNameList(2) = "三郎"
  strNameList(3) = "侍エンジニア太郎"
  strNameList(4) = "侍エンジニア太郎"
  strNameList(5) = "侍エンジニア太郎"

  'ループ処理で配列を検索
  For i = 0 To UBound(strNameList)

      If StrComp(strNameList(i), "侍エンジニア太郎") = 0 Then
          Debug.Print "要素数(" & i & "):" & strNameList(i)
      End If
  Next i

End Sub

実行結果:

要素数(3):侍エンジニア太郎
要素数(4):侍エンジニア太郎
要素数(5):侍エンジニア太郎

UBound関数を使って配列の要素数を取得し、配列の要素数分処理をループしています。

また、「StrComp(strNameList(i), "侍エンジニア太郎") = 0」で完全一致になっているデータの場合のみ、データを出力しています。

ちなみに、以下記事でUbound関数、StrComp関数の詳しい使い方について解説しているので、気になる方は見てみてくださいね!

配列の中を検索する処理の速さ比較

Filter関数は部分一致ですが、全ての文字列を検索文字列に入れれば完全一致としても検索できます。

そうなると、「Filter関数」と「For文 + StrComp関数」どちらを使えばいいか迷ってしまいますよね。

使いやすさももちろん大事ですが、処理の速さに応じて使い分けるのがおすすめです!

Filter関数を使ったほうがFor文でループ処理を使うよりも処理が速いため、速度重視の場合はFilter関数、複数条件で一致する文字を検索したい場合はFor文 + StrComp関数を使えばOKです。

ちなみに、処理にかかった時間はTimer関数を使って簡単に確認できます。

時間をはかるためのサンプルコード:

Sub Test3()
    Dim startTime As Double
    Dim endTime As Double
    Dim processTime As Double

    '開始時間取得
    startTime = Timer


    'メイン処理


    '終了時間取得
    endTime = Timer

    '処理時間計算
    processTime = endTime - startTime

End Sub

このサンプルでは、メイン処理に書いたコードにかかった時間を「processTime変数」へ取得しています。

Timer関数を使った処理時間の確認方法については以下記事で解説しているので、気になる方は見てみてくださいね!

補足:その他の配列操作について

ここまで配列内のデータを検索する方法について解説してきました。

配列はとても奥が深いため、他の記事でも使い方をまとめています。

配列の初期化、配列操作総まとめについて以下で詳しく解説しているので、合わせてみてみるのがおすすめです!

まとめ

今回は、VBAで配列のデータを検索する方法について解説しました。

配列は大量のデータを1つにまとめることができるので、とても便利ですよね。

今回解説したデータ検索方法を覚えておけば、配列操作がぐっと楽になるので、ぜひ使ってみてくださいね!

この記事を書いた人

北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

目次