配列の指定文字列は先頭からループで調べる
VBAで配列を利用する際に、指定する値が配列に入っているのか、そして入っているのであれば何番目に入っているのかを調べたいことがあります。
何が入っているのかを調べたい場合は配列のループの方法以外に、Filter関数で調べることもできますがFilter関数は検索に一致した要素を配列で取得しますが位置を調べることはできません。
Filter関数については「VBAで配列から指定文字列を含む要素を取得する(Filter)」をご参照ください。
結果として、位置だけを調べる場合は基本的には配列の先頭から順に調べるしかありません。
以下で紹介しているサンプルコードの方法は配列を使って検索する方法ですが、この方法は処理速度が遅い欠点があります。
高速に行いたい場合はコレクションが有効です。
その場合は別ページ「VBAで配列を連想配列Dictionaryに変換する」を参考にしてください。
ソースコード
配列の先頭からループして、検索文字列が含まれている場合は、その位置を結果用の配列resultに入れています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub GetArrayIndex(ary(), searchStr, result()) Dim i Dim iCnt Dim iResultCnt iResultCnt = 0 ReDim result(iResultCnt) iCnt = UBound(ary) For i = 0 To iCnt '// 現ループの配列に検索文字列が含まれている場合 ' If (InStr(1, ary(i), searchStr) > 0) Then '// 現ループの配列と検索文字列が完全一致 If (ary(i) = searchStr) Then '// 配列の何番目かを格納する ReDim Preserve result(iResultCnt) result(iResultCnt) = i iResultCnt = iResultCnt + 1 ' Exit For End If Next End Sub |
コードの説明
13行目のコメントアウトは、15行目との違いがあるためです。
配列に検索文字列が「含まれる」ことを調べたい場合は15行目をコメントにして、13行目のコメントをはずしてください。
もし検索で1つでも見つかればよいのであれば、21行目のExit Forのコメントをはずしてください。
そうすると全検索しなくてよくなるため処理速度は速くなります。
使い方
上記GetArrayIndex関数の使用例です。配列に値を設定された状態で、配列の格納位置を調べたい値”ccc”を渡しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub GetArrayDataTest() Dim ary(4) Dim result() Dim i ary(0) = "aaa" ary(1) = "bbb" ary(2) = "ccc" ary(3) = "ddd" ary(4) = "ccccc" Call GetArrayIndex(ary, "ccc", result) For i = 0 To UBound(result) Debug.Print CStr(result(i)) & "番目" Next End Sub |