日本語名

部品_VLOOKUP値取得

英語名

GetVlookupValue

URL

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 を表示する)

BASファイル(ダウンロード)

GetVlookupValue.bas

バージョン

1.0

更新日

2026-10-29