Excel関数 逆引き集 | 特定エラーのみ抽出 → ISNA

Excel
スポンサーリンク

概要

「エラーはいっぱい出ているけど、“検索に失敗したやつだけ” 知りたい」
「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 で “検索失敗だけ” を切り分けるところから始めてみてください。
どこまでが想定内で、どこからが本当のエラーかが、ぐっと見えやすくなります。

タイトルとURLをコピーしました