IFERROR vs IFNA 完全ガイド:安全なエラー処理と危険な罠
📖 目次
1 やりたいこと
VLOOKUPやXLOOKUPで見つからなかった時の #N/A エラーを消したい。でも他のエラー(数式ミスなど)は見逃したくない。
2 結論:使い分けの原則
✅ 検索関数(VLOOKUP / XLOOKUP / MATCH 等)のエラー処理#N/A だけをキャッチ。#REF! や #VALUE! などの数式ミスはそのまま表示されるため、バグに気づける。
✅ 除算やその他の計算のエラー処理すべてのエラー(#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 の1種類だけです。これが検索関数のエラー処理において強みになります。検索関数で「正当に」発生するエラーは #N/A(一致なし)だけであり、それ以外のエラーが出たら数式に不具合がある証拠だからです。
4 構文と動作の違い
IFERROR の構文(Excel 2007~)
「値」を評価し、何らかのエラー(7種すべて)なら第2引数を返す。エラーでなければ「値」をそのまま返す。
IFNA の構文(Excel 2013~)
「値」を評価し、#N/A エラーのときだけ第2引数を返す。#N/A 以外のエラーはそのまま表示される。
IFERROR も IFNA も、第1引数の数式は1回だけ評価されます。エラーでなかった場合、第2引数は評価されません(遅延評価)。これは旧来の
IF(ISERROR(...)) パターンで数式を2回書く必要があったのと比べて、大きな改善です。
5 IFERRORの危険な罠(実例)
シナリオ:マスタの参照範囲を誰かが壊した
VLOOKUP でマスタから商品名を引いている数式で、マスタシートのB列が誤って削除され、参照先が #REF! になったケースを考えます。
IFERROR は「想定外のエラー」も「想定内のエラー(#N/A)」も同じ処理をしてしまいます。数式のバグや参照の破壊が発生しても、エラーが表面に出てこないため発見が遅れます。検索関数には IFERROR ではなく IFNA を使うことで、「見つからなかった」と「数式が壊れている」を明確に区別できます。
6 XLOOKUPなら IFNA すら不要?
XLOOKUP には第4引数「見つからない場合の値」が組み込まれています。これを使えば、そもそも IFNA でラップする必要がなくなります。
❌ 従来の方法:IFNA でラップ第4引数 "未登録" が IFNA と同じ役割を果たします。#N/A のときだけこの値が返り、#REF! などの数式エラーはそのまま表示されます。
| 方式 | 数式の短さ | バグ発見能力 | 対応バージョン |
|---|---|---|---|
| IFERROR + VLOOKUP | やや長い | 低い | 2007~ |
| IFNA + VLOOKUP | やや長い | 高い | 2013~ |
| XLOOKUP(第4引数) | 最も短い | 高い | 365 / 2021~ |
XLOOKUPの第4引数は内部的に IFNA と同じ動作(#N/A のみキャッチ)をします。数式がシンプルになり、ネストも浅くなるため、可読性・保守性の両面で優れています。
→ XLOOKUP基本編の詳細はこちら
7 実務パターン集
パターン① VLOOKUP の「未登録」処理 → IFNA
検索関数の基本パターン。#N/A だけキャッチし、数式ミスのエラーは見逃さない。
パターン② ゼロ割りの回避 → IFERROR
B2がゼロや空白のときの #DIV/0! を回避。除算エラーには IFERROR が適切です。
パターン③ フォールバック検索(正規→旧マスタ)→ IFNA のネスト
正規マスタで見つからなければ旧マスタを検索し、それでも見つからなければ「該当なし」。IFNAをネストすることで、各段階の #REF! や #VALUE! はスルーされバグに気づけます。
パターン④ LET + IFNA で可読性を向上
LETで変数化した結果をまとめて IFNA でラップ。VLOOKUPのいずれかが #N/A なら「未登録」に。数式の不具合による他のエラーはそのまま表示されます。
パターン⑤ IFERROR が適切な場面:文字列→数値変換
ユーザー入力の文字列を数値に変換する際、変換できない文字列は #VALUE! になります。ここでは #VALUE! をキャッチしたいので IFERROR が正解です。
パターン⑥ IFERROR が適切な場面:INDEX+MATCH の範囲外アクセス
MATCH結果に +1 した行番号が範囲外になると #REF! が発生する可能性があります。この場合は #N/A 以外のエラーもキャッチしたいので IFERROR が適切です。
8 パフォーマンス特性
IFERROR / IFNA はどちらも、第1引数がエラーでなかった場合は第2引数を評価しない(遅延評価)という重要な性質を持っています。
たとえば
=IFNA(VLOOKUP(...), VLOOKUP(旧マスタ...)) と書いた場合、正規マスタで見つかれば旧マスタの VLOOKUP は一切実行されません。これは IF 関数の短絡評価と同じ仕組みです。そのため、フォールバック検索のような構成でもパフォーマンス上の問題は起きにくいです。
=IFERROR(重い計算, 0) と書いた場合、「重い計算」は毎回実行されます。エラーかどうかに関わらず、第1引数のコストは常にかかります。「エラーの場合だけ計算を省略したい」という用途には使えません。
9 旧バージョンでの代替法
Excel 2003 以前:IF + ISERROR
IFERROR が存在しない Excel 2003 以前では、以下の構文で同じことを実現していました。
致命的な欠点:VLOOKUPを2回書く(2回計算する)必要がある。10万行のマスタならVLOOKUPの実行回数が2倍に。
Excel 2007〜2010:IFERROR はあるが IFNA がない
IFNA は Excel 2013 から追加された関数です。2007〜2010 では IFERROR しか使えないため、#N/A だけをキャッチしたい場合は次のように書く必要がありました。
ISNA で #N/A だけを判定するが、VLOOKUPが2回走る欠点は同じ。LET 関数もないため回避策がない。
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引数は実行されない。