概要
「VLOOKUP で #N/A がたくさん出て見づらい」
「“見つからない”エラーだけを判定したい。ほかのエラーはそのままにしたい」
そんなときに使うのが ISNA 関数です。
ISERROR は「すべてのエラー」をまとめて TRUE にしますが、
ISNA は「#N/A エラーだけ」を TRUE にする、よりピンポイントなエラー判定です。
特に「検索系の関数(VLOOKUP / MATCH など)で“見つからない”ときだけ別メッセージを出したい」場面で大活躍します。
ISNA の基本
ISNA の書式と動き
基本形はとてもシンプルです。
=ISNA(値)
判定ルールはこうです。
値が#N/Aエラー → TRUE- それ以外(数値・文字列・空白・他のエラー) → FALSE
具体例を挙げると、イメージしやすくなります。
=ISNA(#N/A) ' TRUE
=ISNA(1/0) ' FALSE(これは #DIV/0!)
=ISNA("ABC") ' FALSE
=ISNA(100) ' FALSE
=ISNA(A2) ' A2 が #N/A のときだけ TRUE
「#N/A かどうかだけを判定するスイッチ」と覚えてください。
VLOOKUP と組み合わせる基本パターン
ISNA が一番よく使われるのは、VLOOKUP の「見つからない」ケースを判定するときです。
#N/A のときに「未登録」と表示する
前提:
A2:B100 に「商品コード(A列)と商品名(B列)」の一覧がある。
C2 に検索したい商品コードが入っている。
通常の VLOOKUP はこう書きます。
=VLOOKUP(C2, $A$2:$B$100, 2, FALSE)
商品コードが見つからないと #N/A が出ます。
それを「未登録」という文字に置き換えたいとき、ISNA を使ってこうします。
=IF(
ISNA(VLOOKUP(C2, $A$2:$B$100, 2, FALSE)),
"未登録",
VLOOKUP(C2, $A$2:$B$100, 2, FALSE)
)
流れをかみ砕くとこうです。
- まず VLOOKUP の結果を ISNA で判定
見つからなければ #N/A → ISNA が TRUE - TRUE のとき(#N/A のとき) → 「未登録」と表示
- FALSE のとき(正常に見つかったとき) → もう一度 VLOOKUP を実行して結果を表示
「#N/A だけを捕まえて、別メッセージに差し替える」という典型パターンです。
MATCH と組み合わせて「見つからない行」を判定する
MATCH は、見つからないときに #N/A を返します。
この動きと ISNA は非常に相性がよいです。
検索値が一覧に存在するかどうかをチェックする
前提:
A2:A100 に商品コード一覧。
E2 にチェックしたい商品コード。
MATCH で行番号を探し、その結果が #N/A かどうかを ISNA で判定します。
=ISNA(MATCH(E2, $A$2:$A$100, 0))
結果の意味はこうです。
- TRUE → 一覧に存在しない(MATCH が #N/A)
- FALSE → 一覧に存在する(MATCH が行番号を返した)
これを IF と組み合わせれば、
=IF(
ISNA(MATCH(E2, $A$2:$A$100, 0)),
"未登録",
"登録済み"
)
のように、「そのコードが表に登録済みか」を一発で判断できます。
ISERROR と ISNA の使い分け
ここはよく聞かれるポイントなので、しっかり整理しておきます。
ISERROR
- 対象:すべてのエラー
- #N/A, #DIV/0!, #VALUE!, #REF!, #NUM!, #NAME?, #NULL! → ぜんぶ TRUE
- 「エラーならなんでもいいからまとめて処理したい」とき向き
ISNA
- 対象:#N/A エラーだけ
- 「見つからない」エラーだけを特別扱いしたいとき
- それ以外のエラー(計算ミスや式ミス)はあえてそのまま表示させたいときに便利
検索系(VLOOKUP / MATCH など)でよくある考え方はこうです。
- 見つからなかった(#N/A)→ 想定内 → メッセージを出したい(「未登録」など)
- 計算式がおかしい・参照切れ → 想定外 → 逆に気付きたいのでエラーのまま出しておきたい
このように、「#N/A だけを穏やかに処理したい」場合に ISNA を選びます。
ISNA を使うときのコツ
「まず普通に検索式を書く → その式を ISNA+IF で包む」
式の作り方の流れを固定しておくと、迷わなくなります。
- まず、やりたい VLOOKUP や MATCH を、そのまま書く
例:=VLOOKUP(C2, $A$2:$B$100, 2, FALSE) - その式を ISNA のカッコの中に入れる
=ISNA(VLOOKUP(C2, $A$2:$B$100, 2, FALSE)) - それを IF で包んで「#N/A のとき」「それ以外のとき」を書き分ける
こうすると、毎回パターンで組めるようになります。
「#N/A 以外のエラー」をわざと残す設計もあり
ISERROR だと「どんなエラーでも全部隠してしまう」ので、
本当に異常なエラーまで見えなくなってしまうことがあります。
ISNA なら「見つからない(#N/A)」だけを穏やかに処理し、
たとえば #REF! のような深刻なエラーはそのまま見せて、
設計ミスに気付けるようにできます。
例題
問題1
A2:B100 に「商品コード(A列)と商品名(B列)」の表があります。
C2 の商品コードを VLOOKUP した結果が #N/A のときだけ TRUE、それ以外は FALSE を返す式を書いてください。
=ISNA(VLOOKUP(C2, $A$2:$B$100, 2, FALSE))
問題2
問題1と同じ表で、
C2 の商品コードが表にない(#N/A)ときは「未登録」、
見つかったときは商品名を返す IF+ISNA+VLOOKUP の式を書いてください。
=IF(
ISNA(VLOOKUP(C2, $A$2:$B$100, 2, FALSE)),
"未登録",
VLOOKUP(C2, $A$2:$B$100, 2, FALSE)
)
問題3
A2:A100 に顧客IDの一覧があります。
E2 の顧客IDが一覧に存在しないとき「新規」、存在するとき「既存」と表示する式を、MATCH+ISNA+IF で書いてください。
=IF(
ISNA(MATCH(E2, $A$2:$A$100, 0)),
"新規",
"既存"
)
問題4
F2 の商品コードを A2:C100 の表(A列=商品コード, B列=商品名, C列=単価)から検索し、
見つからない(#N/A)のときは単価セルに 0 を入れ、
見つかったときは単価(3列目)を返す式を書いてください。
=IF(
ISNA(VLOOKUP(F2, $A$2:$C$100, 3, FALSE)),
0,
VLOOKUP(F2, $A$2:$C$100, 3, FALSE)
)
問題5
G2 を H2:H100 の一覧の中から MATCH で検索し、
見つからない(#N/A)のときは空白、
見つかったときは「登録済み」と表示する式を書いてください。
=IF(
ISNA(MATCH(G2, $H$2:$H$100, 0)),
"",
"登録済み"
)
まとめ
ISNA は、「#N/A(見つからないエラー)だけを判定する関数」 です。
基本形は次の通りです。
=ISNA(式) ' #N/A なら TRUE
=IF(ISNA(式), エラー時, 通常時) ' #N/A のときだけ別処理
特に、VLOOKUP や MATCH と組み合わせる形は Excel 実務の定番です。
=IF(
ISNA(VLOOKUP(検索値, 範囲, 列番号, FALSE)),
"未登録",
VLOOKUP(検索値, 範囲, 列番号, FALSE)
)
「#N/A をきれいに扱えるようになる」ことは、
“検索式と仲良くなる”ための大きな一歩です。
まずは自分が使っている VLOOKUP や MATCH に、
ISNA を一枚かぶせてみるところから始めてみてください。
