【ExcelVBA】配列に格納されたデータが配列の何番目の要素に格納されているかを特定するには

この記事では、配列に格納されたデータが配列の何番目の要素に格納されているかを特定する方法についてご説明します。

【動画】配列に格納されたデータが配列の何番目の要素に格納されているかを特定している実際の動き

本題に入る前に、まずは次の動画をご覧ください。


配列に格納された検索文字列が配列の何番目の要素に格納されているかを特定しています。

配列に格納されたデータが配列の何番目の要素に格納されているかを特定する方法

配列に格納されたデータが配列の何番目の要素に格納されているかを特定するには、次の2つの方法があります。

  1. ループで配列のデータ一つ一つを検索文字列と突き合わせて合致するか確認し、合致したタイミングのループ回数で配列の何番目かを特定する
  2. WorksheetFunction.Match関数を使って特定する

※先ほど紹介した動画は、②のWorksheetFunction.Match関数を使って特定している動画です。

①ループで配列のデータ一つ一つを検索文字列と突き合わせて合致するか確認し、合致したタイミングのループ回数で配列の何番目かを特定する

まずは1つ目の方法である、ループ処理を使って検索文字列を特定する方法は次の通りにマクロを作成していきます。

マクロ作成の流れ

STEP.1
【配列データの用意】用意したデータを配列に格納する
用意したデータを配列に格納します。
STEP.2
ループで配列のデータ一つ一つを検索文字列と突き合わせる
ループで配列のデータ一つ一つを検索文字列と突き合わせます。
STEP.3
検索文字列と合致したらそのループ回数を取得する
検索文字列と合致したらそのループ回数を取得します。
このループ回数が、検索文字列が格納された配列の要素番号です。

コードの例

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
参考:シートの状態
今回使うExcelのシートは次の通りです。

・セルC4~C8:配列に格納する文字列
・セルE4:検索する文字列
・セルE7:検索する文字列の要素位置

コードの解説
注目すべきコード①

最初に見て頂きたいのは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番目のデータを検索した場合

「0」という値が取得されてセル「E7」に設定されています。

配列の4番目のデータを検索した場合

「4」という値が取得されてセル「E7」に設定されています。

配列に存在しない文字列で検索した場合

配列には存在しないことを知らせるメッセージがセル「E7」に設定されています。

②WorksheetFunction.Match関数を使って特定する

次に2つ目の方法である、WorksheetFunction.Match関数を使って特定する方法は次の通りにマクロを作成していきます。

マクロ作成の流れ

STEP.1
【配列データの用意】用意したデータを配列に格納する
用意したデータを配列に格納します。
STEP.2
WorksheetFunction.Match関数を使い、配列に格納されたデータが配列の何番目の要素に格納されているかを特定する
WorksheetFunction.Match関数を使い、配列に格納されたデータが配列の何番目の要素に格納されているかを特定します。
WorksheetFunction.Match関数の戻り値が、検索文字列が格納された配列の要素番号です。
ただし、配列に存在しない文字列で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
参考:シートの状態
今回使うExcelのシートは次の通りです。

・セルC4~C7:配列に格納する文字列
・セルE4:検索する文字列
・セルE7:検索する文字列の要素位置

コードの解説
注目すべきコード①

最初に見て頂きたいのは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番目のデータを検索した場合

「0」という値が取得されてセル「E7」に設定されています。

配列の3番目のデータを検索した場合

「3」という値が取得されてセル「E7」に設定されています。

配列に存在しない文字列で検索した場合

配列には存在しないことを知らせるメッセージがセル「E7」に設定されています。

最後に

本記事では、配列に格納されたデータが配列の何番目の要素に格納されているかを特定する方法についてご説明しました。

方法としては次の2つの方法があります。

  1. ループで配列のデータ一つ一つを検索文字列と突き合わせて合致するか確認し、合致したタイミングのループ回数で配列の何番目かを特定する
  2. WorksheetFunction.Match関数を使って特定する

配列に格納されたデータが配列の何番目の要素に格納されているか知りたい場合は本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら