Excel関数 逆引き集 | 両方に存在する値 → MATCH

Excel VBA Excel
スポンサーリンク

概要

「A表とB表の両方に存在するコードだけ知りたい」
「2つのリストを突合して、“共通している値”を洗い出したい」

こういうときに役立つのが MATCH(マッチ)関数です。
MATCH は本来「範囲の中で何番目か」を返す関数ですが、

  • 片方の表の値を
  • もう片方の表で MATCH して
  • 見つかったものだけを“両方に存在する値”として扱う

という使い方ができます。

ここでは、プログラミング初心者でも迷わないように
「考え方 → 基本形 → 抽出テクニック → 例題」という流れで解説します。


MATCH の基本

MATCH の書式と“何をしている関数か”

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

検索値
どこにあるか探したい値(例:商品コード、社員番号)

検索範囲
どこから探すか(例:マスタ側のコードリスト)

照合の種類
0 を指定すると「完全一致」。
両方に存在するかを判定するときは、必ず 0 を使います。

例えば、B列にマスタのコードが並んでいて、
A2 のコードがマスタのどこにあるかを調べるときはこうです。

=MATCH(A2, $B$2:$B$100, 0)
  • 見つかった場合 → 1,2,3…(範囲内での位置)
  • 見つからない場合 → #N/A

この「#N/A になったら片方にしか存在しない」という性質を使っていきます。


両方に存在するかどうかを TRUE/FALSE で判定する

A表のコードが B表にもあるかを判定する

前提:

A表(Sheet「A」)
A2:A100:商品コード

B表(Sheet「B」)
A2:A100:商品コード(マスタ)

A表の B2 に
「A2 のコードが B表にも存在するか?」を TRUE/FALSE で表示します。

=ISNUMBER(MATCH(A2, B!$A$2:$A$100, 0))

ポイントはここです。

  • MATCH が数値(位置)を返したら → Bにも存在する → ISNUMBER → TRUE
  • MATCH が #N/A なら → Bには存在しない → ISNUMBER → FALSE

これで「両方にある値だけ TRUE」という判定列が作れます。


両方に存在する値だけを“一覧として”取り出す

TRUE/FALSE 判定を作ったら、
FILTER 関数と組み合わせると「共通している値だけの一覧」が簡単にできます。

A表にも B表にもあるコード一覧を抽出

前提はさきほどと同じです。

A!A2:A100:A側のコード
B!A2:A100:B側のコード

別の場所(たとえば Aシートの D2)に、次の式を書きます。

=FILTER(A!A2:A100,
        ISNUMBER(MATCH(A!A2:A100, B!$A$2:$A$100, 0)))

意味をかみ砕くと:

  • MATCH(A!A2:A100, B!$A$2:$A$100, 0)
    → A側の各コードがB側のどこにあるか(位置 or #N/A
  • ISNUMBER(…)
    → 見つかった行だけ TRUE(=両方に存在)
  • FILTER(元のA側コード, TRUE/FALSE)
    → TRUE の行だけを一覧で抽出

こうして、A表にもB表にも共通して存在する値だけが
ズラッとスピル表示されます。


共通データだけを“行ごと”取り出す

コードだけでなく、「その行の他の情報」もまとめて取りたいことが多いはずです。

共通コードの行を丸ごと抽出する

A表(Sheet「A」)
A列:商品コード
B列:商品名
C列:数量

B表(Sheet「B」)
A列:商品コード(マスタ)

A表の中から、「コードがB表にも存在する行だけ」を
行ごと抽出したい場合、Aシートの E2 に次の式を書きます。

=FILTER(A!A2:C100,
        ISNUMBER(MATCH(A!A2:A100, B!$A$2:$A$100, 0)))

ポイント:

  • FILTER の元データ範囲は A!A2:C100(コード+他の列)
  • 条件は A!A2:A100 に対して「Bに存在するか?」を MATCH で判定

これで、「A表とB表両方に存在するコードの行」だけが
コード・商品名・数量ごと抽出されます。


逆方向も同じ考え方でOK

今までは「A表側から見て、Bにもあるか?」でしたが、
逆に「B表側から見て、Aにもあるか?」も同じ考え方です。

B表から見て“Aにもある”コード一覧を出す

=FILTER(B!A2:A100,
        ISNUMBER(MATCH(B!A2:A100, A!$A$2:$A$100, 0)))

両方に存在する値=「どちらから見ても共通」なので、
必要に応じてどちら側から見るか決めればOKです。


よくあるつまずきとポイント

照合の種類は必ず 0(完全一致)

=MATCH(検索値, 検索範囲, 0)
ここを 1 や -1 にすると「近似一致」になり、
「本当は存在しないのに“ある扱い”」になることがあります。

両方に存在するかどうかの判定では、
照合の種類は必ず 0 にしてください。

検索範囲と元データの“表記揺れ”に注意

  • 全角半角
  • 前後のスペース
  • 数字なのに文字列になっている

こういった違いがあると「見た目同じ」でも MATCH は一致と判定しません。
結果がおかしいと感じたら、セルの形式やスペースを疑ってください。


例題

問題1: Sheet「A」の A2:A100 に商品コード、Sheet「B」の A2:A100 に商品コードがあります。A2 のコードがBにも存在するかどうかを TRUE/FALSE で判定する式を、Aシートの B2 に書いてください。

=ISNUMBER(MATCH(A2, B!$A$2:$A$100, 0))

問題2: 問題1の式を使わずに、Aシートの A2:A100 の中から「Bシートにも存在するコードだけ」を一覧で C2 から表示する FILTER の式を書いてください。

=FILTER(A!A2:A100,
        ISNUMBER(MATCH(A!A2:A100, B!$A$2:$A$100, 0)))

問題3: Sheet「A」の A2:C100 に「コード, 商品名, 数量」があります。Sheet「B」の A2:A100 にマスタのコードがあります。Aシートの中から、「Bシートにも存在するコードの行だけ」を行ごと抽出して E2 に表示する式を書いてください。

=FILTER(A!A2:C100,
        ISNUMBER(MATCH(A!A2:A100, B!$A$2:$A$100, 0)))

問題4: Sheet「B」側から見て、「Aシートにも存在するコードだけ」を Bシートの C2 から一覧表示する式を書いてください(コードは B!A2:A100)。

=FILTER(B!A2:A100,
        ISNUMBER(MATCH(B!A2:A100, A!$A$2:$A$100, 0)))

問題5: Aシートの A2 のコードが Bシートにも存在する場合は「共通」、存在しない場合は「片側のみ」と表示する式を、Aシートの B2 に書いてください。

=IF(ISNUMBER(MATCH(A2, B!$A$2:$A$100, 0)),
    "共通",
    "片側のみ")

まとめ

MATCH は本来「何番目か」を返す関数ですが、
#N/A になる性質を利用すると、

  • 片方にしかない値
  • 両方に存在する値

を判定する“突合チェックのエンジン”として使えます。

型としては、次を覚えておくと便利です。

ISNUMBER(MATCH(値, 相手側リスト, 0))      ' 両方に存在するか判定
FILTER(リスト, ISNUMBER(MATCH(リスト, 相手側リスト, 0)))  ' 共通リスト抽出

この2つの型が使えると、
「AとBの共通データだけ欲しい」「両方にあるコードだけ抽出したい」
といった実務の“突合系”の仕事が、一気に楽になります。

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