【Excel VBA】XLOOKUP関数でモダンな表引き検索をする方法

長年にわたり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 ErrorIsErrorといったエラー処理が必須でした。しかしXLOOKUPでは、この引数を指定しておけば、見つからなかった場合にエラーを発生させることなく、指定した値(この例では文字列"該当なし")を返してくれます。

② 戻り値の判定 (IsArray)

If IsArray(result) Then ...

今回の例では、戻り範囲(returnArray)として「商品名」と「価格」の2列を指定しています。そのため、XLOOKUPが成功すると、結果は2つの値を含む配列として返されます。

一方、見つからなかった場合は、第4引数で指定した単一の文字列"該当なし"が返されます。

この違いを利用し、IsArray関数で「戻り値は配列か?」をチェックすることで、検索が成功したかどうかをスマートに判定できます。


まとめ

XLOOKUP関数が利用できる最新のExcel環境では、VBAでの表引き検索が従来よりもはるかに簡単かつ安全になりました。

  • WorksheetFunction.XLookup を使うことで、VLOOKUPよりも柔軟な検索が可能。
  • 第4引数**[見つからない場合の値]**を指定することで、VBAコード内の複雑なエラー処理がほぼ不要になる。
  • 戻り範囲に複数列を指定すれば、一度に複数の値を配列として取得できる。

これから新しく表引きのコードを書くのであれば、XLOOKUPが使える環境であることを確認した上で、積極的にこちらを利用することをお勧めします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次