Excel関数 逆引き集 | 指定リスト内か判定 → MATCH

Excel VBA Excel
スポンサーリンク

概要

「この値、許可リストの中に入ってる?」
「このコードは有効なコード?」
「この分類は、あらかじめ決めた候補の中にある?」

こういう “指定したリストの中に含まれているか” を判定したいときに便利なのが MATCH 関数です。

MATCH は本来「何番目にあるか(位置)」を返す関数ですが、
これを 「見つかったら有効」「見つからなかったら無効」 という判定に使うことで、

指定リスト内か判定 → MATCH

という形のテクニックになります。


MATCH の基本(まずは素の動き)

MATCH の書式と意味

基本形はこうです。

=MATCH(検索値, 検索範囲, [照合の種類])

よく使うのは「完全一致」のパターンで、照合の種類に 0 を指定します。

=MATCH(検索値, 検索範囲, 0)

動きはこうです。

検索値が検索範囲の中に見つかったら → その「位置(何番目か)」を返す
見つからなかったら → エラー(#N/A)を返す

例:

  • 検索範囲:{"A","B","C"}
  • 検索値:”B”
=MATCH("B", {"A","B","C"}, 0)

結果 → 2(2番目にある)

「見つかれば数字、見つからなければエラー」
この性質を「リスト内かどうか判定」に使います。


指定リスト内かどうかを TRUE / FALSE で判定する

IFERROR+MATCH で「リスト内/リスト外」を判定

許可リストが D2:D10 にあるとします。
A2 の値がこのリストの中にあるかどうかを判定したい場合。

まず、素の MATCH だとこうなります。

=MATCH(A2, $D$2:$D$10, 0)

A2 がリストの中にあれば「1〜9のどれかの数字」、
なければ #N/A というエラーです。

この「エラーかどうか」を IFERROR で包むと、
「リスト内なら TRUE、リスト外なら FALSE」といった判定に変換できます。

=IFERROR(MATCH(A2, $D$2:$D$10, 0) > 0, FALSE)

ポイントはここです。

  • 見つかったとき:
    MATCH → 1 以上の数値
    >0 → TRUE
  • 見つからなかったとき:
    MATCH → #N/A(エラー)
    >0 は評価できずエラーになるので、
    IFERROR の第2引数 FALSE に置き換わる

結果として、

A2 がリスト内 → TRUE
A2 がリスト外 → FALSE

という「リスト内かどうかの判定」ができます。


「リスト内なら有効/リスト外なら無効」と表示する

判定結果を文字にするパターン

TRUE / FALSE のままだと少し分かりづらいので、
IF と組み合わせてラベルをつける形にするのが実務では定番です。

A2:判定したいコード
D2:D10:有効コードのリスト

=IF(
    IFERROR(MATCH(A2, $D$2:$D$10, 0) > 0, FALSE),
    "有効",
    "無効"
)

中身を分解すると、

  1. MATCH(A2, $D$2:$D$10, 0) で「位置」検索
  2. >0 で「見つかったら TRUE」化
  3. 見つからずエラーのときは IFERROR で FALSE に変換
  4. 最終的に TRUE →「有効」、FALSE →「無効」として表示

という流れです。


指定リスト内だけ計算する・拾う

リスト内なら金額を返し、リスト外なら 0 にする

A列:商品コード
B列:金額
D2:D10:対象とする商品コードのリスト

「D2:D10 に含まれる商品コードの行だけ B列の金額を集計したい」
というケースでは、C列などに次のような式を書けます。

=IF(
   IFERROR(MATCH(A2, $D$2:$D$10, 0) > 0, FALSE),
   B2,
   0
)

リスト内のコード → B2(その金額)
リスト外のコード → 0

として扱えるので、C列を SUM すれば「指定リスト内の商品だけの合計」が出せます。


指定リスト外をエラーとしてあぶり出す

リスト外なら「不正コード」と表示する

入力されたコードが「許可リストにない場合だけ警告したい」
というときは、こんな書き方もできます。

A2:入力されたコード
D2:D10:許可コード

=IF(
   IFERROR(MATCH(A2, $D$2:$D$10, 0) > 0, FALSE),
   "",
   "不正コード"
)
  • 許可リスト内 → 空白(何も表示しない)
  • 許可リスト外 → 「不正コード」と表示

後からフィルターで「不正コード」だけ抽出すれば、
おかしな値をすぐに洗い出せます。


MATCH を使うときの注意点

照合の種類は「0(完全一致)」を使う

リスト内かどうかを判定するときは、
必ず MATCH(..., 0) として「完全一致」にしてください。

1-1 を使うと「近い値」を拾う動きになってしまい、
「リストにないのに見つかったことになる」という危険があります。

余計なスペース・全角半角の違いに注意

MATCH は文字列を「完全一致」で見ます。

  • “ABC” と “ABC “(末尾スペースあり)は別物
  • “アイウ”(半角カナ)と “アイウ”(全角カナ)も別物

なので、「見つからない」ときは
入力ミス・余分なスペース・全角半角の違いなども疑ってみてください。


例題

問題1

A2 の値が、D2:D10 のリストの中に存在するかどうかを TRUE / FALSE で判定する式を書いてください。
(存在すれば TRUE、存在しなければ FALSE)

=IFERROR(MATCH(A2, $D$2:$D$10, 0) > 0, FALSE)

問題2

問題1と同じ前提で、
存在すれば「有効」、存在しなければ「無効」と表示する式を書いてください。

=IF(
   IFERROR(MATCH(A2, $D$2:$D$10, 0) > 0, FALSE),
   "有効",
   "無効"
)

問題3

A2 に商品コード、B2 に金額が入っています。
D2:D10 に「集計対象の商品コードリスト」があるとき、
A2 がリスト内なら B2 の金額を返し、リスト外なら 0 を返す式を書いてください。

=IF(
   IFERROR(MATCH(A2, $D$2:$D$10, 0) > 0, FALSE),
   B2,
   0
)

問題4

A2 に入力されたコードが D2:D10 の許可リストに存在しない場合だけ「不正コード」と表示し、
存在する場合は何も表示しない式を書いてください。

=IF(
   IFERROR(MATCH(A2, $D$2:$D$10, 0) > 0, FALSE),
   "",
   "不正コード"
)

問題5

A2 の値が D2:D10 のリストの中で「何番目にあるか」を返す、基本的な MATCH の式を書いてください(完全一致)。

=MATCH(A2, $D$2:$D$10, 0)

まとめ

「指定リスト内か判定 → MATCH」は、
MATCH の「見つかれば数字、見つからなければエラー」という性質を利用して、

  1. MATCH で位置を探す
  2. >0 で「見つかったかどうか」を TRUE / FALSE に変換
  3. 見つからない(エラー)のときは IFERROR で FALSE にする

という流れで成り立っています。

型としては、次の2つを押さえておけば十分です。

=IFERROR(MATCH(値, リスト範囲, 0) > 0, FALSE)   ' リスト内か?(TRUE/FALSE)

=IF(
   IFERROR(MATCH(値, リスト範囲, 0) > 0, FALSE),
   "リスト内のとき",
   "リスト外のとき"
)

ID・コード・分類・ランクなど、
「使っていい値はこれだけ」という場面では必ず役立つパターンなので、
自分のシートの“許可リスト”で、一度この MATCH 判定を試してみてください。

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