IFERROR vs IFNA 完全ガイド:安全なエラー処理と危険な罠

1 やりたいこと

VLOOKUPやXLOOKUPで見つからなかった時の #N/A エラーを消したい。でも他のエラー(数式ミスなど)は見逃したくない。

2 結論:使い分けの原則

✅ 検索関数(VLOOKUP / XLOOKUP / MATCH 等)のエラー処理
=IFNA(VLOOKUP(A2, マスタ!A:B, 2, FALSE), "未登録")

#N/A だけをキャッチ。#REF! や #VALUE! などの数式ミスはそのまま表示されるため、バグに気づける。

✅ 除算やその他の計算のエラー処理
=IFERROR(A1/B1, 0)

すべてのエラー(#DIV/0!, #VALUE! 等)をキャッチ。除算のゼロ割りなど「発生が想定される」エラーに使う。

データテーブル
関数 キャッチするエラー 主な用途 バグ発見能力
IFNA #N/A のみ 検索関数の「見つからない」処理 高い(他のエラーが見える)
IFERROR すべてのエラー 除算、型変換など広範なエラー処理 低い(全エラーを握りつぶす)

3 Excelのエラー全7種とキャッチ範囲

IFERROR と IFNA の違いを正確に理解するには、Excelのエラーの種類を知っておく必要があります。

データテーブル
エラー 意味 よくある原因 IFNA IFERROR
#N/A 値が見つからない VLOOKUP / MATCH で一致なし キャッチ キャッチ
#VALUE! 引数の型が不正 数値を期待する場所に文字列 スルー キャッチ
#REF! 無効な参照 参照先の行・列が削除された スルー キャッチ
#DIV/0! ゼロ除算 分母がゼロまたは空白 スルー キャッチ
#NAME? 関数名やラベルが不正 関数名のスペルミス スルー キャッチ
#NUM! 数値が不正 SQRT(-1)、IRR が収束しない スルー キャッチ
#NULL! 範囲の交差がない スペースによる交差演算子ミス スルー キャッチ
💡 IFNAは「#N/A だけ」を精密にキャッチする
上の表でわかるとおり、IFNA がキャッチするのは #N/A の1種類だけです。これが検索関数のエラー処理において強みになります。検索関数で「正当に」発生するエラーは #N/A(一致なし)だけであり、それ以外のエラーが出たら数式に不具合がある証拠だからです。

4 構文と動作の違い

IFERROR の構文(Excel 2007~)

=IFERROR(値, エラーの場合の値)

「値」を評価し、何らかのエラー(7種すべて)なら第2引数を返す。エラーでなければ「値」をそのまま返す。

IFNA の構文(Excel 2013~)

=IFNA(値, #N/Aの場合の値)

「値」を評価し、#N/A エラーのときだけ第2引数を返す。#N/A 以外のエラーはそのまま表示される。

💡 どちらも「値」を1回だけ評価する
IFERROR も IFNA も、第1引数の数式は1回だけ評価されます。エラーでなかった場合、第2引数は評価されません(遅延評価)。これは旧来の IF(ISERROR(...)) パターンで数式を2回書く必要があったのと比べて、大きな改善です。

5 IFERRORの危険な罠(実例)

シナリオ:マスタの参照範囲を誰かが壊した

VLOOKUP でマスタから商品名を引いている数式で、マスタシートのB列が誤って削除され、参照先が #REF! になったケースを考えます。

❌ IFERRORの場合:バグに気づけない
=IFERROR(VLOOKUP(A2, マスタ!A:B, 2, FALSE), "未登録") → マスタのB列が削除されて #REF! が発生 → IFERRORが #REF! もキャッチして「未登録」と表示 → 全行が「未登録」になるが、見た目上「該当なし」と区別がつかない → バグに気づかないまま誤ったデータで作業が進む
✅ IFNAの場合:バグが即座に見える
=IFNA(VLOOKUP(A2, マスタ!A:B, 2, FALSE), "未登録") → マスタのB列が削除されて #REF! が発生 → IFNAは #REF! をスルー → セルに #REF! がそのまま表示される → 「何かおかしい」と即座に気づける → 原因を調査して修正できる
🔴 これが IFERROR の最大の危険性
IFERROR は「想定外のエラー」も「想定内のエラー(#N/A)」も同じ処理をしてしまいます。数式のバグや参照の破壊が発生しても、エラーが表面に出てこないため発見が遅れます。検索関数には IFERROR ではなく IFNA を使うことで、「見つからなかった」と「数式が壊れている」を明確に区別できます。

6 XLOOKUPなら IFNA すら不要?

XLOOKUP には第4引数「見つからない場合の値」が組み込まれています。これを使えば、そもそも IFNA でラップする必要がなくなります。

❌ 従来の方法:IFNA でラップ
=IFNA(VLOOKUP(A2, マスタ!A:B, 2, FALSE), "未登録")
✅ XLOOKUPなら第4引数で完結
=XLOOKUP(A2, マスタ!A:A, マスタ!B:B, "未登録")

第4引数 "未登録" が IFNA と同じ役割を果たします。#N/A のときだけこの値が返り、#REF! などの数式エラーはそのまま表示されます。

データテーブル
方式 数式の短さ バグ発見能力 対応バージョン
IFERROR + VLOOKUP やや長い 低い 2007~
IFNA + VLOOKUP やや長い 高い 2013~
XLOOKUP(第4引数) 最も短い 高い 365 / 2021~
✅ XLOOKUPが使える環境なら、IFNA は不要
XLOOKUPの第4引数は内部的に IFNA と同じ動作(#N/A のみキャッチ)をします。数式がシンプルになり、ネストも浅くなるため、可読性・保守性の両面で優れています。
→ XLOOKUP基本編の詳細はこちら

7 実務パターン集

パターン① VLOOKUP の「未登録」処理 → IFNA

=IFNA(VLOOKUP(A2, マスタ!A:C, 2, FALSE), "未登録")

検索関数の基本パターン。#N/A だけキャッチし、数式ミスのエラーは見逃さない。

パターン② ゼロ割りの回避 → IFERROR

=IFERROR(A2/B2, 0)

B2がゼロや空白のときの #DIV/0! を回避。除算エラーには IFERROR が適切です。

パターン③ フォールバック検索(正規→旧マスタ)→ IFNA のネスト

=IFNA(VLOOKUP(A2, 正規!A:B, 2, FALSE), IFNA(VLOOKUP(A2, 旧!A:B, 2, FALSE), "該当なし"))

正規マスタで見つからなければ旧マスタを検索し、それでも見つからなければ「該当なし」。IFNAをネストすることで、各段階の #REF! や #VALUE! はスルーされバグに気づけます。

パターン④ LET + IFNA で可読性を向上

=LET( 結果, VLOOKUP(A2, マスタ!A:D, 2, FALSE), 単価, VLOOKUP(A2, マスタ!A:D, 3, FALSE), IFNA(結果 & "(" & TEXT(単価,"#,##0") & "円)", "未登録") )

LETで変数化した結果をまとめて IFNA でラップ。VLOOKUPのいずれかが #N/A なら「未登録」に。数式の不具合による他のエラーはそのまま表示されます。

パターン⑤ IFERROR が適切な場面:文字列→数値変換

=IFERROR(VALUE(A2), 0)

ユーザー入力の文字列を数値に変換する際、変換できない文字列は #VALUE! になります。ここでは #VALUE! をキャッチしたいので IFERROR が正解です。

パターン⑥ IFERROR が適切な場面:INDEX+MATCH の範囲外アクセス

=IFERROR(INDEX(C:C, MATCH("商品A", D:D, 0) + 1), "次の行なし")

MATCH結果に +1 した行番号が範囲外になると #REF! が発生する可能性があります。この場合は #N/A 以外のエラーもキャッチしたいので IFERROR が適切です。

8 パフォーマンス特性

IFERROR / IFNA はどちらも、第1引数がエラーでなかった場合は第2引数を評価しない(遅延評価)という重要な性質を持っています。

💡 正常時のコスト=ゼロ
たとえば =IFNA(VLOOKUP(...), VLOOKUP(旧マスタ...)) と書いた場合、正規マスタで見つかれば旧マスタの VLOOKUP は一切実行されません。これは IF 関数の短絡評価と同じ仕組みです。そのため、フォールバック検索のような構成でもパフォーマンス上の問題は起きにくいです。
⚠️ ただし第1引数は常に評価される
=IFERROR(重い計算, 0) と書いた場合、「重い計算」は毎回実行されます。エラーかどうかに関わらず、第1引数のコストは常にかかります。「エラーの場合だけ計算を省略したい」という用途には使えません。

9 旧バージョンでの代替法

Excel 2003 以前:IF + ISERROR

IFERROR が存在しない Excel 2003 以前では、以下の構文で同じことを実現していました。

=IF(ISERROR(VLOOKUP(A2, マスタ!A:B, 2, FALSE)), "未登録", VLOOKUP(A2, マスタ!A:B, 2, FALSE))

致命的な欠点:VLOOKUPを2回書く(2回計算する)必要がある。10万行のマスタならVLOOKUPの実行回数が2倍に。

Excel 2007〜2010:IFERROR はあるが IFNA がない

IFNA は Excel 2013 から追加された関数です。2007〜2010 では IFERROR しか使えないため、#N/A だけをキャッチしたい場合は次のように書く必要がありました。

=IF(ISNA(VLOOKUP(A2, マスタ!A:B, 2, FALSE)), "未登録", VLOOKUP(A2, マスタ!A:B, 2, FALSE))

ISNA で #N/A だけを判定するが、VLOOKUPが2回走る欠点は同じ。LET 関数もないため回避策がない。

💡 2013以降なら IFNA が使える
Excel 2013 以降の環境であれば IFNA が利用可能です。VLOOKUPの記述が1回で済み、#N/A だけをキャッチできるため、旧来の IF+ISNA パターンの完全な上位互換です。

10 まとめ

データテーブル
場面 最適な手法 理由
VLOOKUP / MATCH の「見つからない」処理 IFNA #N/A だけキャッチ。数式バグはそのまま表示
XLOOKUP の「見つからない」処理 第4引数を使う(IFNA不要) 数式がシンプル。内部的に IFNA と同等の動作
除算(ゼロ割り回避) IFERROR #DIV/0! をキャッチ。想定されるエラー種が #N/A 以外
文字列→数値変換の失敗処理 IFERROR #VALUE! をキャッチしたい場面
INDEX+MATCH の行オフセット IFERROR 範囲外で #REF! が出る可能性。#N/A 以外もキャッチが必要
フォールバック検索(正規→旧マスタ) IFNA のネスト 各段階で #N/A だけをキャッチし、次の検索に進む
✅ 覚えておくべき原則
検索関数には IFNA計算処理には IFERROR ── これが基本の使い分け。
② IFERROR は「全エラーを握りつぶす」のでバグを隠す危険がある。安易な使用は避ける。
③ XLOOKUPが使える環境なら、第4引数で IFNA 自体を省略できる。
④ IFERROR / IFNA は遅延評価。第1引数が正常なら第2引数は実行されない。

🔗 関連記事