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.VLookup
とIsError
を使って、安全に表引き検索を行うコードです。
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.VLookup
とIsError
関数の組み合わせを使うことで、コードがシンプルになり、意図も明確になるため、こちらの方法を強くお勧めします。