部品_VLOOKUP値取得
GetVlookupValue
https://feelcodelab.com/vba_parts/getvlookupvalue/
・指定した範囲(表)の 1 列目から、検索値と一致する最初の行を探し、その行の、指定した列の値を返す(完全一致) ・見つからない場合は、エラー値 #N/A(CVErr(xlErrNA))を返す。呼び出し側は、IsError で確認する ※ この部品は、見つからない場合も、エラーでは止まらず、#N/A の値を返す(見つからないのは、結果のひとつ)
土台
取得
範囲
・【最重要】表の範囲(vTableRng)は、呼び出し側が、範囲設定の部品で作って、変数に入れて渡す
→ 範囲の 1 列目が、検索する列になる。取得する列も、範囲の中に含める
→ 最終行が可変の場合は、範囲設定_行可変で作る(見つからない場合は Nothing になるので、先に確認する)
・【最重要】戻り値が、エラー値(#N/A)の場合は「見つからなかった」ことを表す。
呼び出し側で、IsError で必ず確認してから使う
→ 確認せずに、戻り値を文字列や数値として使うと、型が合わない実行時エラーになる
・取得する列の位置(vReturnCol)は、範囲の左端の列を 1 とした番号(Excel の VLOOKUP 関数の列番号と同じ)
→ 検索する列(1 列目)の値を返したい場合は、1 を指定する
・検索は「完全一致」で、英字の大文字・小文字は区別する("a-001" と "A-001" は別の値)
※ Excel の VLOOKUP 関数は区別しないが、この部品は、コードや ID の取り違えを防ぐため、区別する
・文字列の「1」と、数値の 1 は、一致しない(Excel の VLOOKUP 関数と同じ)
数値と日付は、値が同じなら一致する。検索する列の、セルのエラー値(#N/A など)は、検索の対象外
・同じ値が複数ある場合は、最初に見つかった(最も上の)行の値を返す
・取得するセルが、空白の場合は、Empty を返す。セルがエラー値の場合は、そのエラー値を返す
・検索値が空(Empty・空文字・Null・エラー値)の場合は、呼び出し側の誤りとして、エラーで止まる
・設定の誤りは、#N/A ではなく、原因を示すエラーで止まる(Err.Raise)
- 表の範囲(vTableRng)が Nothing(vbObjectError + 1014)
- 取得する列の位置が、範囲の列数の外(vbObjectError + 1015)
- 検索値が空(vbObjectError + 1016)
・Offset / Find / Resize / With は禁止(検索は、配列に取り込んで比較する)・他の部品を参照しない(土台) ・組み合わせ:範囲設定_固定(または範囲設定_行可変)→ VLOOKUP値取得 (呼び出し側が、範囲を作って変数に入れ、その変数を渡す) ・見つかった「行」の位置が必要な場合は、MATCH検索位置取得を使う(別の部品)
・特定のシートや表の名前には、依存しない(呼び出し側が渡した範囲だけを使う) ・表の範囲(vTableRng)の 1 列目が、検索する列になる。取得する列も、範囲の中に含める ・取得する列の位置(vReturnCol)は、範囲の左端の列を 1 とした番号
vTableRng : 表の範囲(Range)。1 列目が、検索する列。範囲設定の部品で作る vSearchValue : 検索値(Variant)。文字列・数値・日付 vReturnCol : 取得する列の位置(Long)。範囲の左端の列を 1 とした番号
Variant : 見つかった場合は、その行の、取得する列の値。見つからない場合は、エラー値 #N/A
Variant
Function 部品_VLOOKUP値取得( _
ByVal vTableRng As Range, _
ByVal vSearchValue As Variant, _
ByVal vReturnCol As Long) As Variant
部品_VLOOKUP値取得 = f_GetVlookupValue(vTableRng, vSearchValue, vReturnCol)
End Function
Function f_GetVlookupValue( _
ByVal vTableRng As Range, _
ByVal vSearchValue As Variant, _
ByVal vReturnCol As Long) As Variant
Dim arr As Variant
Dim cellValue As Variant
Dim rowCount As Long
Dim i As Long
Dim isSearchText As Boolean
f_GetVlookupValue = CVErr(xlErrNA)
If vTableRng Is Nothing Then
Err.Raise vbObjectError + 1014, "f_GetVlookupValue", _
"表の範囲(vTableRng)が設定されていません(Nothing)。"
End If
If vReturnCol < 1 Or vReturnCol > vTableRng.Columns.Count Then
Err.Raise vbObjectError + 1015, "f_GetVlookupValue", _
"取得する列の位置は、表の範囲の列数(" & vTableRng.Columns.Count & "列)の中で、" & _
"左端を 1 として指定してください(取得する列の位置=" & vReturnCol & ")。"
End If
If IsError(vSearchValue) Then
Err.Raise vbObjectError + 1016, "f_GetVlookupValue", _
"検索値(vSearchValue)が、エラー値です。"
End If
If IsNull(vSearchValue) Or IsEmpty(vSearchValue) Then
Err.Raise vbObjectError + 1016, "f_GetVlookupValue", _
"検索値(vSearchValue)が空です(Empty または Null)。"
End If
If VarType(vSearchValue) = vbString Then
If Len(vSearchValue) = 0 Then
Err.Raise vbObjectError + 1016, "f_GetVlookupValue", _
"検索値(vSearchValue)が空です(空文字)。"
End If
End If
rowCount = vTableRng.Rows.Count
If rowCount = 1 And vTableRng.Columns.Count = 1 Then
ReDim arr(1 To 1, 1 To 1)
arr(1, 1) = vTableRng.Value
Else
arr = vTableRng.Value
End If
isSearchText = (VarType(vSearchValue) = vbString)
For i = 1 To rowCount
cellValue = arr(i, 1)
If IsError(cellValue) = False Then
If VarType(cellValue) = vbString Then
If isSearchText Then
If StrComp(cellValue, vSearchValue, vbBinaryCompare) = 0 Then
f_GetVlookupValue = arr(i, vReturnCol)
Exit Function
End If
End If
ElseIf IsEmpty(cellValue) = False Then
If isSearchText = False Then
If cellValue = vSearchValue Then
f_GetVlookupValue = arr(i, vReturnCol)
Exit Function
End If
End If
End If
End If
Next i
End Function◆例1:顧客コードから、顧客名(3 列目)を取得する◆
Dim lastRow As Long
Dim rng As Range
Dim v As Variant
lastRow = 部品_最終行取得(ThisWorkbook, "顧客表", 1) '1列目の最終行
Set rng = 部品_範囲設定_固定(ThisWorkbook, "顧客表", 2, 1, lastRow, 3) '2行目~最終行の、1~3列目
v = 部品_VLOOKUP値取得(rng, "A-001", 3) '1列目で検索し、範囲の3列目の値を取得
If IsError(v) Then
MsgBox "A-001 は、見つかりませんでした"
Exit Sub
End If
MsgBox v
※ 設定の誤り(Nothing、取得する列の位置の誤り、検索値が空)の場合は、#N/A ではなく、
原因を示すエラーで止まる(起点で On Error で受けて、Err.Description を表示する) 1.0
2026-10-29