この記事では、配列に格納されたデータが配列の何番目の要素に格納されているかを特定する方法についてご説明します。
【動画】配列に格納されたデータが配列の何番目の要素に格納されているかを特定している実際の動き
本題に入る前に、まずは次の動画をご覧ください。
配列に格納された検索文字列が配列の何番目の要素に格納されているかを特定しています。
配列に格納されたデータが配列の何番目の要素に格納されているかを特定する方法
配列に格納されたデータが配列の何番目の要素に格納されているかを特定するには、次の2つの方法があります。
- ループで配列のデータ一つ一つを検索文字列と突き合わせて合致するか確認し、合致したタイミングのループ回数で配列の何番目かを特定する
- WorksheetFunction.Match関数を使って特定する
※先ほど紹介した動画は、②のWorksheetFunction.Match関数を使って特定している動画です。
①ループで配列のデータ一つ一つを検索文字列と突き合わせて合致するか確認し、合致したタイミングのループ回数で配列の何番目かを特定する
まずは1つ目の方法である、ループ処理を使って検索文字列を特定する方法は次の通りにマクロを作成していきます。
マクロ作成の流れ
このループ回数が、検索文字列が格納された配列の要素番号です。
コードの例
Excelのマクロのコード(例)
Sub test() Dim valAry() As Variant 'データ格納用配列 Dim findStr As String '検索文字列用変数 Dim cnt As Integer 'カウンタ用変数 'カウンタを初期化 cnt = 0 Do While (Range("C" & (cnt + 4)).Value <> "") ReDim Preserve valAry(cnt) '配列にデータを格納する valAry(cnt) = Range("C" & (cnt + 4)).Value cnt = cnt + 1 Loop '検索文字列を取得(セル「E4」に検索文字列が設定されている) findStr = Range("E4").Value For cnt = 0 To UBound(valAry) If valAry(cnt) = findStr Then '配列に格納されている文字列が検索文字列と合致した場合 'ループの回数をセル「E7」に設定 '※この回数が検索文字列が格納された配列の要素番号です Range("E7").Value = cnt Exit Sub End If Next '検索文字列が配列に存在していない場合に何かしらメッセージを表示 Range("E7").Value = "検索文字列「" & findStr & "」は配列に存在しません。" End Sub
コードの解説
注目すべきコード①
最初に見て頂きたいのは24行目から38行目です。
For cnt = 0 To UBound(valAry) If valAry(cnt) = findStr Then '配列に格納されている文字列が検索文字列と合致した場合 'ループの回数をセル「E7」に設定 '※この回数が検索文字列が格納された配列の要素番号です Range("E7").Value = cnt Exit Sub End If Next
24行目で配列の要素数分だけループで回す設定をし、26行目で配列のデータを検索文字列と突き合わせます。
もし一致した場合は、カウンタ変数「cnt」に格納されたループ回数が検索文字列が格納された配列の要素番号なのでセル「E7」にその値を設定しています。
注目すべきコード②
次に見て頂きたいのは10行目から19行目です。
Do While (Range("C" & (cnt + 4)).Value <> "") ReDim Preserve valAry(cnt) '配列にデータを格納する valAry(cnt) = Range("C" & (cnt + 4)).Value cnt = cnt + 1 Loop
このコードで、セルC4からC8まで設定されている文字列を配列に格納しています。
※配列へのデータ追加は色々あるので、あくまで一例として参考に見て頂ければと思います。
動作確認
マクロを実行後、実際Excelのシートの表示は次の画像の通りです。
「0」という値が取得されてセル「E7」に設定されています。
「4」という値が取得されてセル「E7」に設定されています。
配列には存在しないことを知らせるメッセージがセル「E7」に設定されています。
②WorksheetFunction.Match関数を使って特定する
次に2つ目の方法である、WorksheetFunction.Match関数を使って特定する方法は次の通りにマクロを作成していきます。
マクロ作成の流れ
コードの例
Excelのマクロのコード(例)
Sub test() Dim valAry() As Variant 'データ格納用配列 Dim findStr As String '検索文字列用変数 Dim cnt As Integer 'カウンタ用変数 On Error GoTo ERR 'カウンタを初期化 cnt = 0 Do While (Range("C" & (cnt + 4)).Value <> "") ReDim Preserve valAry(cnt) '配列にデータを格納する valAry(cnt) = Range("C" & (cnt + 4)).Value cnt = cnt + 1 Loop '検索要素を指定 findStr = Range("E4").Value 'WorksheetFunction.Match関数で配列に格納されたデータが配列の何番目の要素に格納されているかを特定する Range("E7").Value = WorksheetFunction.Match(findStr, valAry, 0) - 1 Exit Sub ERR: 'エラー値の判定 Select Case ERR.Number Case 1004 'エラー値が「1004」の場合 '検索文字列がMatch関数で見つからない場合はエラー(1004)となるため何かエラーメッセージを出力する Range("E7").Value = "検索文字列「" & findStr & "」は配列に存在しません。" Case Else MsgBox "エラーが発生しました。" End Select End Sub
コードの解説
注目すべきコード①
最初に見て頂きたいのは27行目です。
'WorksheetFunction.Match関数で配列に格納されたデータが配列の何番目の要素に格納されているかを特定する Range("E7").Value = WorksheetFunction.Match(findStr, valAry, 0) - 1
27行目で、WorksheetFunction.Match関数に検索文字列と配列を引数に設定し、配列に格納された検索文字列が配列の何番目の要素に格納されているかを特定しています。
戻り値が配列に格納された検索文字列が配列の何番目の要素なので、その値をセル「E7」に設定しています。
注目すべきコード②
次に見て頂きたいのは33行目から45行目です。
'エラー値の判定 Select Case ERR.Number Case 1004 'エラー値が「1004」の場合 '検索文字列がMatch関数で見つからない場合はエラー(1004)となるため何かエラーメッセージを出力する Range("E7").Value = "検索文字列「" & findStr & "」は配列に存在しません。" Case Else MsgBox "エラーが発生しました。" End Select
このコードは、WorksheetFunction.Match関数の、検索文字列が見つからなかった場合にエラーとなるときのコードです。
WorksheetFunction.Match関数で検索文字列が見つからなかった場合に次のエラーが発生します。
なので、必ず上記コードを盛り込む必要があります。
ちなみに、41行目ではWorksheetFunction.Match関数での文字列が見つからなかった時のエラー以外のエラーが発生した場合のエラーハンドリングを考慮したコードになります。
動作確認
マクロを実行後、実際Excelのシートの表示は次の画像の通りです。
「0」という値が取得されてセル「E7」に設定されています。
「3」という値が取得されてセル「E7」に設定されています。
配列には存在しないことを知らせるメッセージがセル「E7」に設定されています。
最後に
本記事では、配列に格納されたデータが配列の何番目の要素に格納されているかを特定する方法についてご説明しました。
方法としては次の2つの方法があります。
- ループで配列のデータ一つ一つを検索文字列と突き合わせて合致するか確認し、合致したタイミングのループ回数で配列の何番目かを特定する
- WorksheetFunction.Match関数を使って特定する
配列に格納されたデータが配列の何番目の要素に格納されているか知りたい場合は本記事を参考にしてみてくださいね。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。