Excel VBA 逆引き集 | ルックアップを配列化

Excel VBA
スポンサーリンク

ルックアップを配列化

Excelで「検索(ルックアップ)」といえば VLOOKUPINDEX/MATCH が定番ですが、VBAでは 配列に読み込んで検索 すると高速で柔軟です。ここでは初心者向けに、コード例とテンプレートをかみ砕いて説明します。


基本の考え方

  • Rangeを配列に読み込む: v = Range("A2:C100").Value
  • 検索キーをDictionaryに格納: キーと値を対応付けると高速検索できる。
  • 配列ループで検索: 小規模なら単純ループ、大規模ならDictionary。
  • メリット: シート関数より速く、複合キーや条件付き検索も可能。

テンプレ1:配列ループでルックアップ(小規模向け)

Sub Lookup_ArrayLoop()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:B10") ' A=コード, B=商品名
    Dim v As Variant: v = rg.Value

    Dim key As String: key = "C003"
    Dim i As Long, result As String

    result = "見つかりません"
    For i = 1 To UBound(v, 1)
        If v(i, 1) = key Then
            result = v(i, 2)
            Exit For
        End If
    Next i

    MsgBox "コード " & key & " の商品名は " & result
End Sub
VB
  • ポイント: 配列をループして検索。小規模ならこれで十分。

テンプレ2:Dictionaryでルックアップ(大量データ向け)

Sub Lookup_Dictionary()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:B1000") ' A=コード, B=商品名
    Dim v As Variant: v = rg.Value

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i As Long
    For i = 1 To UBound(v, 1)
        dict(Trim(CStr(v(i, 1)))) = v(i, 2)
    Next i

    ' 検索
    Dim key As String: key = "C050"
    If dict.Exists(key) Then
        MsgBox "コード " & key & " の商品名は " & dict(key)
    Else
        MsgBox "コード " & key & " は存在しません"
    End If
End Sub
VB
  • ポイント: 数万件でも一瞬で検索可能。キーがユニークであることが前提。

テンプレ3:複合キーでルックアップ(コード×日付)

Sub Lookup_CompositeKey()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:C100") ' A=コード, B=日付, C=数量
    Dim v As Variant: v = rg.Value

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i As Long, key As String
    For i = 1 To UBound(v, 1)
        key = Trim(CStr(v(i, 1))) & "|" & Format(v(i, 2), "yyyy-mm-dd")
        dict(key) = v(i, 3)
    Next i

    ' 検索
    Dim searchKey As String
    searchKey = "C003|2025-12-11"
    If dict.Exists(searchKey) Then
        MsgBox "数量は " & dict(searchKey)
    Else
        MsgBox "該当データなし"
    End If
End Sub
VB
  • ポイント: 複数列を組み合わせてキーにすると「コード×日付」で検索できる。

テンプレ4:配列化ルックアップで複数一致を返す

Sub Lookup_MultiHit()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:C20") ' A=コード, B=商品名, C=数量
    Dim v As Variant: v = rg.Value

    Dim key As String: key = "C003"
    Dim i As Long, msg As String

    For i = 1 To UBound(v, 1)
        If v(i, 1) = key Then
            msg = msg & v(i, 2) & " 数量=" & v(i, 3) & vbCrLf
        End If
    Next i

    If msg = "" Then msg = "該当なし"
    MsgBox msg
End Sub
VB
  • ポイント: 同じコードが複数行ある場合に全部返す。

例題で練習

'例1:小規模データを配列ループで検索
Sub Example_Loop()
    Lookup_ArrayLoop
End Sub

'例2:大量データをDictionaryで検索
Sub Example_Dict()
    Lookup_Dictionary
End Sub

'例3:複合キー(コード×日付)で検索
Sub Example_Composite()
    Lookup_CompositeKey
End Sub

'例4:複数一致をまとめて返す
Sub Example_Multi()
    Lookup_MultiHit
End Sub
VB

初心者向けポイント

  • 配列化で高速: Rangeを一括で配列に読み込むと処理が速い。
  • Dictionaryで即検索: Existsで一瞬判定。大量データに強い。
  • 複合キー: 「コード|日付」のように文字列連結で複数条件検索。
  • 複数一致: ループで全部拾うと一覧化できる。
  • 元データは壊さない: 結果はメッセージや別シートに出力すると安心。

タイトルとURLをコピーしました