概要
「エラーはいっぱい出ているけど、“検索に失敗したやつだけ” 知りたい」
「VLOOKUP や MATCH が見つからなかった行だけを抽出したい」
こういうときに使えるのが ISNA 関数です。
ISERROR は「すべてのエラー」を対象にしますが、
ISNA は #N/A だけを TRUE にする “ピンポイント検出用” の関数 です。
主に
VLOOKUP / XLOOKUP / MATCH などの
「見つからなかったときに #N/A を返す関数」と組み合わせて使います。
ISNA の基本
書式と動き
=ISNA(値)
この式の結果は、必ず TRUE か FALSE です。
- 値が
#N/Aエラー → TRUE - 値が
#N/A以外(正常な値・他のエラー・空白など) → FALSE
ここがポイントです。
ISERROR は「全部のエラー」で TRUE になりますが、
ISNA は「#N/A だけ」で TRUE になります。
つまり、
- 検索に失敗して
#N/Aになったケースだけ知りたい - それ以外のエラー(#DIV/0! や #VALUE! など)は別問題として扱いたい
というときにぴったりです。
VLOOKUP の「検索失敗だけ」抽出する
検索失敗行だけ TRUE にする
A2:検索値
D2:E10:検索範囲(D列:コード、E列:名前)
通常の VLOOKUP はこうです。
=VLOOKUP(A2, $D$2:$E$10, 2, FALSE)
見つからないと #N/A になります。
この「#N/A になった行だけを知りたい」ときに ISNA を使います。
=ISNA(VLOOKUP(A2, $D$2:$E$10, 2, FALSE))
動きはこうです。
- VLOOKUP が
#N/A(見つからない) → TRUE - 見つかって値が返る → FALSE
- 参照範囲ミスなどで別エラー → FALSE(
#N/Aではないため)
「“未登録コード” だけフラグを立てる」イメージで使えます。
検索失敗行だけをメッセージ表示する
TRUE / FALSE を「人間が読める言葉」に変える
ISNA(...) は TRUE / FALSE だけなので、
IF と組み合わせて分かりやすくします。
=IF(
ISNA(VLOOKUP(A2, $D$2:$E$10, 2, FALSE)),
"未登録",
"登録済"
)
動き:
- 見つからず
#N/A→ 「未登録」 - 見つかった → 「登録済」
- 別エラー(範囲ミスなど) → 「登録済」扱いにはなるが、数式自体が別エラーになることもある
「#N/A は想定内の“未登録”扱い。それ以外のエラーは別途気づきたい」
というときに、ISERROR ではなく ISNA を使う意味があります。
MATCH の検索失敗だけを抽出する
MATCH が見つからない行を特定する
A2:検索値
D2:D10:リスト
通常の MATCH はこうです。
=MATCH(A2, $D$2:$D$10, 0)
見つからないと #N/A です。
「見つからない行だけフラグを付けたい」ならこう書きます。
=ISNA(MATCH(A2, $D$2:$D$10, 0))
- 見つからない(
#N/A) → TRUE - 見つかる(1,2,3,… の数値) → FALSE
これを表全体にコピーすれば、
「リストに存在しない値が入力されている行」が一目で分かります。
FILTER と組み合わせて「#N/A 行だけ抽出」
#N/A の行だけ別表に抜き出す
動的配列対応の Excel なら、
FILTER と組み合わせて「#N/A 行だけ別表にする」こともできます。
例:
A2:A20:計算結果(VLOOKUP などで #N/A が出る可能性あり)
B2:D20:その行の詳細情報
「A列が #N/A の行だけを抽出したい」なら、別セルにこう書きます。
=FILTER(B2:D20, ISNA(A2:A20))
動き:
- A列が
#N/Aの行 → B〜D列ごとに抽出 - A列が正常な行 → 抽出されない
「マスタに未登録のコード一覧だけ抜き出す」
「検索で拾えなかったデータだけあとで手修正する」
といった用途にとても便利です。
ISERROR ではなく ISNA を使う意味
「全部のエラー」ではなく「検索失敗だけ」を扱いたいとき
ISERROR:
=ISERROR(式)
- すべてのエラー(
#N/A含む)で TRUE
ISNA:
=ISNA(式)
#N/Aのときだけ TRUE
VLOOKUP / MATCH / XLOOKUP のエラーは、
「多くの場合、#N/A は“見つからないだけ”で想定内」
「それ以外のエラーは、式や範囲がおかしい“本当の不具合”」
という性格の違いがあります。
だからこそ、
#N/Aだけを既定のメッセージに変える#N/A行だけ一覧にして追加登録の対象にする
といった処理では、ISERROR ではなく ISNA を選ぶのが正解です。
例題
問題1
A2 の商品コードを VLOOKUP(A2, $D$2:$E$10, 2, FALSE) で検索しています。
検索に失敗して #N/A になったときだけ TRUE を返し、
見つかったときは FALSE を返す式を書いてください。
=ISNA(VLOOKUP(A2, $D$2:$E$10, 2, FALSE))
問題2
A2 の商品コードを D2:E10 から VLOOKUP し、
見つからない(#N/A)ときは「未登録」、
見つかったときは「登録済」と表示したいです。
ISNA と IF を使った式を書いてください。
=IF(
ISNA(VLOOKUP(A2, $D$2:$E$10, 2, FALSE)),
"未登録",
"登録済"
)
問題3
A2 の値を MATCH(A2, $D$2:$D$10, 0) で検索しています。
リストに存在しない(#N/A)場合は TRUE、
存在する場合は FALSE を返す式を書いてください。
=ISNA(MATCH(A2, $D$2:$D$10, 0))
問題4
A2:A20 に VLOOKUP の結果が入っています。
この中から、#N/A になっているセルだけを別の一覧として B列に抽出したいです。
動的配列対応の Excel を想定し、B2 に書く FILTER × ISNA の式を書いてください。
=FILTER(A2:A20, ISNA(A2:A20))
問題5
A2:A20 に検索結果、B2:D20 に詳細データが入っています。
A列が #N/A の行だけ、B〜D列ごと別表として抽出したいです。
そのための FILTER × ISNA の式を書いてください。
=FILTER(B2:D20, ISNA(A2:A20))
まとめ
「特定エラーのみ抽出 → ISNA」は、
“検索に失敗しただけ” の行をやわらかく扱うための基本テクニック です。
型としては、まずこの2つを押さえておけば十分です。
=ISNA(検索系の式) ' #N/A かどうかを判定
=FILTER(範囲, ISNA(検索結果の範囲)) ' #N/A 行だけ抽出
VLOOKUP や MATCH を使っていて #N/A が出ている表があれば、
「全部エラー」とひとくくりにせず、
まずは ISNA で “検索失敗だけ” を切り分けるところから始めてみてください。
どこまでが想定内で、どこからが本当のエラーかが、ぐっと見えやすくなります。
