【Excel VBA】VLOOKUP関数で表引き検索をする方法(エラー処理も解説)

Excelでのデータ処理において、VLOOKUP関数は最もよく使われる関数の一つです。VBAのマクロ内でも、この強力なVLOOKUP関数を**WorksheetFunctionオブジェクト**経由で利用することができます。これにより、商品コードから価格を検索する、といった表引き処理を簡単に自動化できます。

しかし、VBAでVLOOKUPを使う際には、検索値が見つからなかった場合のエラー処理が非常に重要になります。この記事では、基本的な使い方から、マクロが停止しないための安全なエラー処理の方法までを詳しく解説します。


目次

VBAでのVLOOKUP関数の基本構文

VBAでVLOOKUP関数を使う際の構文は、シート上で使う場合とほぼ同じです。

WorksheetFunction.VLookup(検索値, 検索範囲, 列番号, 検索方法)

  • 検索値: 探したい値。
  • 検索範囲: データが格納されている表のセル範囲。
  • 列番号: 検索範囲の左から何列目の値を取得したいかを指定する数値。
  • 検索方法: Falseで完全一致、Trueで近似一致。通常はFalseを使います。

【最重要】VLOOKUPのエラー処理

シート上でVLOOKUPが見つからない場合、セルに「#N/A」と表示されます。しかし、VBAのWorksheetFunction.VLookupで同じことが起きると、実行時エラーが発生し、マクロが途中で停止してしまいます。

これを避けるため、Applicationオブジェクトから直接VLOOKUPを呼び出し、結果を**IsError関数**で判定する方法が最も安全で推奨されます。

完成したVBAコード(推奨パターン)

以下は、Application.VLookupIsErrorを使って、安全に表引き検索を行うコードです。

Sub SafeVLookupInVBA()

    ' 変数を宣言します
    Dim productCode As String
    Dim priceListTable As Range
    Dim result As Variant

    '--- 設定 ---
    productCode = "P-003" ' 検索したい商品コード
    ' 検索対象の表(A列に商品コード、B列に価格)
    Set priceListTable = ThisWorkbook.Worksheets("PriceList").Range("A2:B100")
    '--- 設定ここまで ---

    ' 1. Application.VLookupで結果を取得
    '    見つからない場合、このメソッドはエラー値を返す(マクロは停止しない)
    result = Application.VLookup(productCode, priceListTable, 2, False)

    ' 2. IsError関数で、戻り値がエラー値かどうかを判定
    If IsError(result) Then
        ' 見つからなかった場合の処理
        MsgBox "商品コード「" & productCode & "」は見つかりませんでした。", vbExclamation
    Else
        ' 見つかった場合の処理
        MsgBox "商品コード「" & productCode & "」の価格は " & result & " 円です。", vbInformation
    End If

End Sub

コードのポイント解説

Application.VLookup(...)は、WorksheetFunction.VLookup(...)とは異なり、検索値が見つからなくてもマクロを停止させません。その代わり、**エラーを示す特殊な値(エラー値)**を返します。

IsError(result)という関数は、変数resultの中身がそのエラー値である場合にTrueを返すため、これを使って簡単かつ安全に、見つかった場合と見つからなかった場合の処理を分岐させることができます。


(参考)旧来のエラー処理方法 On Error

On Error Resume Nextを使って、エラーの発生自体を無視する方法もありますが、コードが複雑になりがちです。

Sub Vlookup_WithOnError()
    Dim result As Variant
    On Error Resume Next ' エラーが発生しても処理を続行
    result = WorksheetFunction.VLookup("P-004", Range("A2:B100"), 2, False)
    On Error GoTo 0 ' エラー処理を解除

    If IsEmpty(result) Then ' エラーが発生すると結果がEmptyになる
        MsgBox "見つかりませんでした。"
    Else
        MsgBox "価格: " & result
    End If
End Sub

まとめ

VBAでVLOOKUP関数を使う際の鉄則は、エラー処理を正しく行うことです。

  • 基本の呼び出し: WorksheetFunction.VLookup(...)
  • エラー処理:
    • 推奨: result = Application.VLookup(...) で結果を取得し、If IsError(result) Then で判定する。
    • 旧来: On Error Resume Next でエラーをトラップする。

特に理由がない限り、Application.VLookupIsError関数の組み合わせを使うことで、コードがシンプルになり、意図も明確になるため、こちらの方法を強くお勧めします。

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

この記事を書いた人

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

目次