【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)」のようにそれぞれアクセスすることで、値の出し入れをすることができます。

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

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

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

【ExcelVBA入門】使いこなすと便利な動的配列の使い方について徹底解説!
更新日 : 2018年8月29日

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

配列のデータを検索する方法は、大きく分けて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関数の詳しい使い方について解説しているので、気になる方は見てみてくださいね!

【ExcelVBA入門】文字列を完全一致・部分一致で比較する方法とは
更新日 : 2019年5月4日

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

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

【ExcelVBA入門】処理時間を計測するためのTimer関数の使い方とは
更新日 : 2019年5月3日

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

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

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

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

【VBA入門】配列の初期化(ReDim、Preserve、Array、Erase)
更新日 : 2019年4月21日
【VBA入門】配列総まとめ(初期化、ループ操作、コピー、結合、比較)
更新日 : 2019年9月26日

まとめ

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

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

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

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

フリーランスエンジニア兼ライターのワキザカ サンシロウです。
ExcelVBAの自動化ツール開発、WEB開発をメインにエンジニア業務をこなしつつ、サムライエンジニアにてライター業務をしております。

プログラミングをこれからやってみたい方に向けて、ためになる記事を全力で書いていきますので宜しくお願い致します!

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説