長年にわたりExcelの表引き検索の主役であったVLOOKUP関数ですが、いくつかの弱点(検索列が一番左にないといけない、見つからないとエラーになる等)がありました。
Excel for Microsoft 365およびExcel 2021以降では、これらの弱点をすべて克服した、非常に強力で柔軟な後継関数**XLOOKUP**が登場しました。
もちろん、このXLOOKUP関数もVBAから利用できます。この記事では、VBAからWorksheetFunction.XLOOKUPを使い、エラー処理まで含めたスマートな表引き検索を実装する方法を解説します。
【重要】XLOOKUP関数が使える環境
このテクニックを利用するには、お使いのExcelが**XLOOKUP関数をサポートしているバージョン(Microsoft 365 または Excel 2021以降)**である必要があります。旧バージョンのExcelではこのコードは実行できませんのでご注意ください。
VBAでのXLOOKUP関数の基本構文
VBAからXLOOKUPを呼び出す際の基本的な構文は、シート上で使う場合と同じです。
WorksheetFunction.XLookup(検索値, 検索範囲, 戻り範囲, [見つからない場合の値])
- 検索値: 探したい値。
- 検索範囲: 検索値を探す対象の1列または1行の範囲。
- 戻り範囲: 検索が成功した場合に、値を返してほしい範囲。複数列の指定も可能。
- [見つからない場合の値] (任意): 検索値が見つからなかった場合に返す値を指定します。これを指定することで、VLOOKUPで必要だった複雑なエラー処理が不要になります。
完成したVBAコード
以下は、「商品マスタ」シートのテーブルから、指定した商品コードに一致する「商品名」と「価格」の両方を一度に取得するVBAコードです。
Sub XLookupInVBA()
    ' 変数を宣言します
    Dim lookupValue As String
    Dim lookupArray As Range
    Dim returnArray As Range
    Dim result As Variant
    '--- 設定 ---
    lookupValue = "P-003" ' 検索したい商品コード
    
    With ThisWorkbook.Worksheets("商品マスタ")
        ' 検索値を探す列 (B列)
        Set lookupArray = .Range("B2:B100")
        ' 取得したい値が含まれる列 (C列とD列)
        Set returnArray = .Range("C2:D100")
    End With
    '--- 設定ここまで ---
    
    ' --- 1. XLOOKUP関数でデータを取得 ---
    ' 見つからない場合は「該当なし」という文字列を返すように指定
    result = WorksheetFunction.XLookup(lookupValue, lookupArray, returnArray, "該当なし")
    ' --- 2. 取得した結果を判定して表示 ---
    ' 戻り値が配列かどうかで、見つかったかを判断
    If IsArray(result) Then
        ' 見つかった場合 (戻り範囲が複数列なので、結果は配列になる)
        MsgBox "検索結果が見つかりました。" & vbCrLf & vbCrLf & _
               "商品名: " & result(1, 1) & vbCrLf & _
               "価格: " & result(1, 2) & " 円", vbInformation
    Else
        ' 見つからなかった場合("該当なし"という文字列が返される)
        MsgBox "商品コード「" & lookupValue & "」は見つかりませんでした。", vbExclamation
    End If
End Sub
コードのポイント解説
① WorksheetFunction.XLOOKUP
result = WorksheetFunction.XLOOKUP(lookupValue, lookupArray, returnArray, "該当なし")
XLOOKUP関数をVBAから呼び出しています。この関数の最大の利点の一つが、第4引数**[見つからない場合の値]**です。
VLOOKUPでは、見つからない場合に実行時エラーが発生するため、On ErrorやIsErrorといったエラー処理が必須でした。しかしXLOOKUPでは、この引数を指定しておけば、見つからなかった場合にエラーを発生させることなく、指定した値(この例では文字列"該当なし")を返してくれます。
② 戻り値の判定 (IsArray)
If IsArray(result) Then ...
今回の例では、戻り範囲(returnArray)として「商品名」と「価格」の2列を指定しています。そのため、XLOOKUPが成功すると、結果は2つの値を含む配列として返されます。
一方、見つからなかった場合は、第4引数で指定した単一の文字列"該当なし"が返されます。
この違いを利用し、IsArray関数で「戻り値は配列か?」をチェックすることで、検索が成功したかどうかをスマートに判定できます。
まとめ
XLOOKUP関数が利用できる最新のExcel環境では、VBAでの表引き検索が従来よりもはるかに簡単かつ安全になりました。
- WorksheetFunction.XLookupを使うことで、- VLOOKUPよりも柔軟な検索が可能。
- 第4引数**[見つからない場合の値]**を指定することで、VBAコード内の複雑なエラー処理がほぼ不要になる。
- 戻り範囲に複数列を指定すれば、一度に複数の値を配列として取得できる。
これから新しく表引きのコードを書くのであれば、XLOOKUPが使える環境であることを確認した上で、積極的にこちらを利用することをお勧めします。

 
			 
			 
			 
			 
			 
			 
			