wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA IsErrorの使い方

VBAでVLOOKUPのエラーをスマートに回避!集計を止めないIsError活用術【型不一致も解決】

日々大量のデータを集計しているVBAユーザーの皆さん、VLOOKUPで参照エラー(#N/A)が出た瞬間に、せっかくの処理が中断してしまったり、手作業での修正に追われたりしていませんか? マスタにない商品コードや、入力ミスによるデータ不整合は避けて通れない現実です。しかし、そのたびに集計作業が止まるのは非効率極まりないですよね。

この記事では、VBAのIsError関数とVLOOKUPを組み合わせることで、マスタに存在しない商品コードがあっても処理を止めず、「不明」としてスマートに集計を続行する方法を解説します。VBAの「型不一致」エラーという落とし穴を回避しながら、あなたの集計作業を劇的に効率化する実務的なコードを提供します。

コピペで動く!VLOOKUPエラーを「不明」として処理するVBAコード

まずは、以下のコードをコピーしてVBAエディタに貼り付け、実行してみてください。事前にシートの準備が必要です。

Sub AggregateWithVLOOKUPAndErrorHandling()
    Dim wsData As Worksheet
    Dim wsMaster As Worksheet
    Dim lastRowData As Long
    Dim i As Long
    Dim vLookupResult As Variant ' VLOOKUPの戻り値はVariant型で受けるのが鉄則
    Dim searchKey As String

    ' --- シート設定(実際の環境に合わせてシート名を調整してください) ---
    ' 集計対象のデータがあるシート
    Set wsData = ThisWorkbook.Sheets("集計データ")
    ' VLOOKUPのマスタデータがあるシート
    Set wsMaster = ThisWorkbook.Sheets("マスタ")

    ' ヘッダー行を含まないデータ開始行(例: 2行目から)
    ' 例として、集計データシートのA列に商品コード、B列にVLOOKUPの結果を書き込む想定
    ' マスタシートのA列に商品コード、B列に商品名がある想定

    ' 集計データシートの最終行を取得
    lastRowData = wsData.Cells(Rows.Count, "A").End(xlUp).Row

    ' 結果を書き込む列のヘッダーをB1セルに設定
    wsData.Cells(1, "B").Value = "商品名"

    ' データの2行目から最終行までループ処理
    For i = 2 To lastRowData
        ' 検索キーとなる商品コードを取得
        searchKey = wsData.Cells(i, "A").Value

        ' VLOOKUPを実行し、結果をVariant型で受け取る
        ' VLOOKUPでエラーが発生してもVBAが停止しないように一時的にエラーハンドリング
        On Error Resume Next
        ' マスタシートのA列からB列を検索範囲とし、2列目(商品名)を取得、完全一致
        vLookupResult = Application.VLOOKUP(searchKey, wsMaster.Range("A:B"), 2, False)
        On Error GoTo 0 ' エラーハンドリングを解除(安全のため)

        ' IsError関数を使ってVLOOKUPの結果がエラー値かどうかを判定
        If IsError(vLookupResult) Then
            ' エラーの場合(#N/Aなど)、"不明"として処理
            wsData.Cells(i, "B").Value = "不明"
            ' Debug.Print "商品コード: " & searchKey & " はマスタにありませんでした。" ' 必要であればデバッグ出力
        Else
            ' エラーでない場合、VLOOKUPの結果(商品名)をそのまま使用
            wsData.Cells(i, "B").Value = vLookupResult
        End If
    Next i

    MsgBox "集計処理が完了しました。", vbInformation
End Sub

' *** 実行前の準備 ***
' 1. このVBAコードを記述するExcelブックを開きます。
' 2. シートを2枚作成し、それぞれ「集計データ」「マスタ」という名前に変更してください。
' 3. 「集計データ」シートに以下のデータを入力します(A列)。
'    A列
'    商品コード
'    ITEM_001
'    ITEM_002
'    ITEM_NAN   <-- ここにマスタにないコードを入力することでエラーを再現します
'    ITEM_003
'    ITEM_004   <-- マスタにないコード
'    ITEM_005
'
' 4. 「マスタ」シートに以下のデータを入力します(A列とB列)。
'    A列        B列
'    商品コード 商品名
'    ITEM_001   りんご
'    ITEM_002   バナナ
'    ITEM_003   みかん
'    ITEM_005   ぶどう
'
' 以上の準備が整ったら、Subプロシージャを実行してください。
' 「集計データ」シートのB列に、VLOOKUPの結果が「商品名」または「不明」として出力されます。

なぜIsErrorが必要か?VBAの型不一致エラー回避の極意

上記のコードで最も重要なポイントは、IsError(vLookupResult)という判定です。 なぜ直接vLookupResult = "#N/A"vLookupResult = CVErr(xlErrNA)のように比較してはいけないのでしょうか?

これを避けるため、VLOOKUPの結果がエラーかどうかを判定する際には、必ずIsError関数を使用してください。IsError関数は、引数がエラー値であるか否かを安全に判定してくれる、この目的のために存在する関数です。Variant型で受けた値がエラー型かどうかを、型不一致を発生させることなくチェックできます。

これにより、VLOOKUPがエラーを返した場合でも、VBAが停止することなく、適切に「不明」として処理を続行できるわけです。

まとめ

VBAのIsError関数をVLOOKUPと組み合わせることで、集計作業における参照エラーの問題を劇的に改善できます。マスタに存在しないデータがあっても、処理が中断することなく、ユーザーフレンドリーな形で「不明」として処理を進めることが可能です。

このテクニックを習得すれば、手作業でのエラー修正から解放され、集計プロセスの安定性と信頼性が向上するでしょう。ぜひ今日からあなたのVBAコードに取り入れて、より堅牢で効率的な自動化を実現してください!

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら