ルックアップを配列化
Excelで「検索(ルックアップ)」といえば VLOOKUP や INDEX/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で一瞬判定。大量データに強い。 - 複合キー: 「コード|日付」のように文字列連結で複数条件検索。
- 複数一致: ループで全部拾うと一覧化できる。
- 元データは壊さない: 結果はメッセージや別シートに出力すると安心。
