Excel VBA 逆引き集 | 配列の検索

Excel VBA
スポンサーリンク

配列の検索

「配列の中から特定の値を探したい」——初心者がよくつまずくポイントです。VBAには標準で検索関数がないので、自分でループや関数を作る必要があります。ここでは 一次元配列・二次元配列 の検索方法を、コード例とテンプレートでかみ砕いて説明します。


基本の考え方

  • 一次元配列: Forループで順番に調べる。見つかったら位置を返す。
  • 二次元配列: 行×列をループして調べる。見つかったら行番号や列番号を返す。
  • 便利関数化: 検索処理を関数にしておくと再利用できる。

テンプレ1:一次元配列の検索(値の位置を返す)

Function FindInArray_1D(arr As Variant, target As Variant) As Long
    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        If arr(i) = target Then
            FindInArray_1D = i
            Exit Function
        End If
    Next i
    FindInArray_1D = -1 ' 見つからなかった場合
End Function

Sub Example_Search1D()
    Dim fruits As Variant
    fruits = Array("りんご", "みかん", "バナナ", "ぶどう")

    Dim pos As Long
    pos = FindInArray_1D(fruits, "バナナ")

    If pos <> -1 Then
        MsgBox "バナナは配列の " & pos & " 番目にあります"
    Else
        MsgBox "見つかりませんでした"
    End If
End Sub
VB
  • ポイント: 見つからなければ -1 を返すようにしておくと便利。

テンプレ2:二次元配列の検索(行番号と列番号を返す)

Function FindInArray_2D(arr As Variant, target As Variant) As String
    Dim r As Long, c As Long
    For r = LBound(arr, 1) To UBound(arr, 1)
        For c = LBound(arr, 2) To UBound(arr, 2)
            If arr(r, c) = target Then
                FindInArray_2D = "行=" & r & " 列=" & c
                Exit Function
            End If
        Next c
    Next r
    FindInArray_2D = "見つかりません"
End Function

Sub Example_Search2D()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A1:C5")
    Dim v As Variant: v = rg.Value

    Dim result As String
    result = FindInArray_2D(v, "バナナ")

    MsgBox result
End Sub
VB
  • ポイント: Rangeを読み込むと自動で二次元配列になる。行・列を返すと確認しやすい。

テンプレ3:部分一致で検索(文字列の一部を探す)

Function FindPartialInArray(arr As Variant, keyword As String) As Long
    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        If InStr(1, arr(i), keyword) > 0 Then
            FindPartialInArray = i
            Exit Function
        End If
    Next i
    FindPartialInArray = -1
End Function

Sub Example_SearchPartial()
    Dim fruits As Variant
    fruits = Array("りんご", "みかん", "バナナ", "ぶどう")

    Dim pos As Long
    pos = FindPartialInArray(fruits, "な")

    If pos <> -1 Then
        MsgBox "「な」を含む要素は " & fruits(pos)
    Else
        MsgBox "見つかりませんでした"
    End If
End Sub
VB
  • ポイント: InStrを使えば部分一致検索ができる。

テンプレ4:複数一致を全部返す(コレクション利用)

Function FindAllInArray(arr As Variant, target As Variant) As Collection
    Dim results As New Collection
    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        If arr(i) = target Then results.Add i
    Next i
    Set FindAllInArray = results
End Function

Sub Example_SearchAll()
    Dim nums As Variant
    nums = Array(10, 20, 10, 30, 10)

    Dim hits As Collection: Set hits = FindAllInArray(nums, 10)

    Dim i As Long, msg As String
    For i = 1 To hits.Count
        msg = msg & hits(i) & "番目 " & vbCrLf
    Next i

    MsgBox "10が見つかった位置:" & vbCrLf & msg
End Sub
VB
  • ポイント: 同じ値が複数ある場合は Collection に全部入れて返す。

例題で練習

'例1:一次元配列で「バナナ」を検索
Sub Example1()
    Example_Search1D
End Sub

'例2:二次元配列で「バナナ」を検索
Sub Example2()
    Example_Search2D
End Sub

'例3:部分一致で「な」を含む要素を検索
Sub Example3()
    Example_SearchPartial
End Sub

'例4:複数一致を全部返す
Sub Example4()
    Example_SearchAll
End Sub
VB

初心者向けポイント

  • 一次元は単純ループ: For i = LBound To UBound
  • 二次元は二重ループ: 行と列を両方回す。
  • 部分一致はInStr: 文字列検索に便利。
  • 複数一致はCollection: 位置を全部返せる。
  • 見つからないときの扱い: -1や「見つかりません」を返すようにしておくと安全。
タイトルとURLをコピーしました