概要
「このコード、許可リストに“ない”ものだけ弾きたい」
「マスタに存在しない商品だけ『不明コード』と表示したい」
「名簿にいない人だけピックアップしたい」
こういう “指定リストに存在しない値(リスト外)” を判定する王道パターンが
ISNA(MATCH) の組み合わせです。
- MATCH:リストの中から「位置」を探す(なければ
#N/Aエラー) - ISNA:その結果が
#N/Aかどうかを TRUE / FALSE で判定する
この「見つからない=#N/A」という性質を利用して、
「リスト外か判定 → ISNA(MATCH)」を実現します。
MATCH の基本(まず“見つからないとエラー”を知る)
MATCH の書式(完全一致の場合)は次のとおりです。
=MATCH(検索値, 検索範囲, 0)
動きはこうです。
- 検索値が検索範囲の中にあれば
→ その「位置(1,2,3…)」を返す - まったく存在しなければ
→#N/Aエラーを返す
例:
D2:D5 に「A001」「A002」「A003」「A004」があるとします。
=MATCH("A003", $D$2:$D$5, 0) ' → 3(3番目)
=MATCH("Z999", $D$2:$D$5, 0) ' → #N/A(見つからない)
この「#N/A になったら“リスト外”」という考え方が、
このあと ISNA につながります。
ISNA の基本(#N/Aかどうか判定)
ISNA は、「その値が #N/A エラーかどうか」を判定する関数です。
書式はこうです。
=ISNA(値)
- 引数が
#N/Aのとき → TRUE - それ以外(正常な値、別のエラー、数値や文字列)のとき → FALSE
例:
=ISNA(#N/A) ' → TRUE
=ISNA(100) ' → FALSE
=ISNA("#N/A") ' → FALSE(文字列なので)
#N/A は VLOOKUP や MATCH などで「見つからない」ときに出る代表的なエラーで、
ISNA は “見つからなかった”を検出する専用センサー だと思ってください。
指定リスト外判定の基本形(ISNA+MATCH)
ここから、本命の「指定リスト外か判定」を作ります。
前提:
- A2:調べたいコード
- D2:D10:許可コード(マスタリスト)
TRUE / FALSE で「リスト外か」判定する
=ISNA(MATCH(A2, $D$2:$D$10, 0))
この式の流れはこうです。
- MATCH(A2, $D$2:$D$10, 0)
→ A2 がリストにあれば位置(1〜9)
→ なければ#N/A - ISNA(その結果)
→ #N/A なら TRUE(リスト外)
→ それ以外なら FALSE(リスト内)
つまり、
- リストに存在しない値 → TRUE(指定リスト外)
- リストに存在する値 → FALSE(指定リスト内)
となり、「リスト外かどうか」を一発で判定できます。
「リスト外なら警告」「リスト内なら何もしない」
TRUE / FALSE のままだと分かりづらいので、
IF 関数と組み合わせてメッセージを出す形が実務では定番です。
リスト外なら「不正コード」、リスト内なら空白
A2:入力コード
D2:D10:有効コード一覧
=IF(
ISNA(MATCH(A2, $D$2:$D$10, 0)),
"不正コード",
""
)
- A2 がリストにない
→ MATCH が #N/A
→ ISNA が TRUE
→ 「不正コード」表示 - A2 がリストにある
→ MATCH が 1〜9 の数字
→ ISNA が FALSE
→ 空白表示
後から「不正コード」だけフィルターで抽出すれば、
誤入力・未登録コードを簡単に洗い出せます。
リスト外なら「未登録」、リスト内なら「登録済み」
=IF(
ISNA(MATCH(A2, $D$2:$D$10, 0)),
"未登録",
"登録済み"
)
- リストにない → 「未登録」
- リストにある → 「登録済み」
「顧客IDがマスタにあるか?」「商品コードが商品マスタにあるか?」など、
マスタ照合でよく使うパターンです。
リスト外だけを 0 / 空白にする(集計前の前処理)
リスト内だけ金額を通し、リスト外は 0
A列:商品コード
B列:金額
D2:D10:集計対象商品コードリスト
「集計対象リストにない商品は合計から除きたい」
というときは、C2 にこう書けます。
=IF(
ISNA(MATCH(A2, $D$2:$D$10, 0)),
0,
B2
)
- リスト外(ISNA=TRUE) → 0
- リスト内 → B2(金額)
C列を SUM すれば「指定リスト内の商品だけの合計」が計算できます。
リスト外は空白にしておく
0 ではなく「そもそも表示したくない」場合は、こう変えるだけです。
=IF(
ISNA(MATCH(A2, $D$2:$D$10, 0)),
"",
B2
)
ISNA(MATCH) を使うときのポイント
MATCH の「照合の種類」は必ず 0(完全一致)
リスト内かどうかを判定するときは、
MATCH の第3引数は 必ず 0(完全一致) にしてください。
=MATCH(A2, $D$2:$D$10, 0)
1 や -1 を使うと「近い値を探す」動きになり、
存在しない値を“あるように見せてしまう”危険があります。
ISNA は「#N/A だけ」を見ている
ISNA は「#N/A エラーかどうか」だけを判定します。
- #N/A のときだけ → TRUE
- 普通の値や、他のエラー(#DIV/0!, #VALUE! など)は → FALSE
VLOOKUP や MATCH の「見つからないときの #N/A」を
きれいに処理したいときに最適です。
例題
問題1
A2 の値が D2:D10 の指定リストに存在しない場合に TRUE、
存在する場合に FALSE を返す式を書いてください。
=ISNA(MATCH(A2, $D$2:$D$10, 0))
問題2
問題1と同じ前提で、
A2 が指定リスト外なら「未登録」、リスト内なら「登録済み」と表示する式を書いてください。
=IF(
ISNA(MATCH(A2, $D$2:$D$10, 0)),
"未登録",
"登録済み"
)
問題3
A2 に商品コード、B2 に金額が入っています。
D2:D10 に「集計対象の商品コードリスト」があるとき、
A2 がリスト外なら 0、リスト内なら B2 の金額を返す式を C2 に書いてください。
=IF(
ISNA(MATCH(A2, $D$2:$D$10, 0)),
0,
B2
)
問題4
A2 に入力されたコードが、D2:D10 の許可リストに存在しないときだけ「不正コード」と表示し、
存在する場合は何も表示しない式を書いてください。
=IF(
ISNA(MATCH(A2, $D$2:$D$10, 0)),
"不正コード",
""
)
問題5
A2 の値が D2:D10 のリスト内に存在すればその「位置(1〜9)」を返し、
存在しなければ「該当なし」と表示する式を書いてください。
=IF(
ISNA(MATCH(A2, $D$2:$D$10, 0)),
"該当なし",
MATCH(A2, $D$2:$D$10, 0)
)
まとめ
「指定リスト外判定 → ISNA(MATCH)」は、
- MATCH で「リストの中にあるか」を検索する
- 見つからないときの
#N/Aを ISNA で検出する - IF と組み合わせて「未登録」「不正コード」などの表示に変える
という、検索系関数の超定番パターンです。
型としては、次の 2 つをそのまま覚えてしまうのがおすすめです。
=ISNA(MATCH(値, リスト範囲, 0)) ' リスト外なら TRUE
=IF(
ISNA(MATCH(値, リスト範囲, 0)),
"リスト外のときの表示",
"リスト内のときの表示"
)
コード・ID・分類・ランクなど、
「OK な値はこのリストにあるものだけ」という場面で、
あなたのデータの“ルール違反”を静かに全部見つけてくれる、頼れる組み合わせです。
