Excel関数 逆引き集 | 指定リスト外判定 → ISNA(MATCH)

Excel VBA Excel
スポンサーリンク

概要

「このコード、許可リストに“ない”ものだけ弾きたい」
「マスタに存在しない商品だけ『不明コード』と表示したい」
「名簿にいない人だけピックアップしたい」

こういう “指定リストに存在しない値(リスト外)” を判定する王道パターンが
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))

この式の流れはこうです。

  1. MATCH(A2, $D$2:$D$10, 0)
    → A2 がリストにあれば位置(1〜9)
    → なければ #N/A
  2. 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)」は、

  1. MATCH で「リストの中にあるか」を検索する
  2. 見つからないときの #N/A を ISNA で検出する
  3. IF と組み合わせて「未登録」「不正コード」などの表示に変える

という、検索系関数の超定番パターンです。

型としては、次の 2 つをそのまま覚えてしまうのがおすすめです。

=ISNA(MATCH(値, リスト範囲, 0))              ' リスト外なら TRUE

=IF(
  ISNA(MATCH(値, リスト範囲, 0)),
  "リスト外のときの表示",
  "リスト内のときの表示"
)

コード・ID・分類・ランクなど、
「OK な値はこのリストにあるものだけ」という場面で、
あなたのデータの“ルール違反”を静かに全部見つけてくれる、頼れる組み合わせです。

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