概要
「A表にはあるけど、B表にはない値だけ抜き出したい」
「“追加分だけ”“削除された分だけ”を一覧で見たい」
こういう“差集合”を求めるとき、
Microsoft 365 なら FILTER 関数+MATCH(または XLOOKUP) の組み合わせがとても強力です。
ここでは、
A集合-B集合(Aにだけあるもの)を中心に、
初心者でもそのまま真似できる“型”としてまとめます。
差集合とは何か(イメージづくり)
差集合というのは、かみ砕くと
Aの中にある
かつ
Bの中にはないもの
だけを取り出した集合のことです。
例えば、
A:{1,2,3,4}
B:{3,4,5}
なら、
A-B:{1,2}
B-A:{5}
になります。
Excel では、この「Bにはない」を
「B側で検索しても見つからない(= #N/A)」
として判定します。
基本形:A表にはあるがB表にはない値(差集合 A−B)
前提データ
Sheet「A」
A2:A100 に A側の値(例:商品コード)
Sheet「B」
A2:A100 に B側の値(例:商品コード)
A側にだけ存在する値(A−B)を、
たとえば Aシートの D2 から一覧で出したいとします。
ここで使う型はこれです。
=FILTER(A!A2:A100,
ISNA(MATCH(A!A2:A100, B!$A$2:$A$100, 0)))
動き方を言葉で追うと、こうなります。
- MATCH(A!A2:A100, B!$A$2:$A$100, 0)
A側の各値が、B側にあるかどうかを探す
見つかれば位置(1,2,3…)、見つからなければ#N/A - ISNA(その結果)
#N/A(見つからない)なら TRUE
つまり「Bには存在しない」行が TRUE になる - FILTER(A!A2:A100, 条件)
条件が TRUE の行だけを、A側から抽出
これで、「AにはあるがBにはない値」だけがズラッと表示されます。
これが差集合 A−B の基本パターンです。
逆向きの差集合:B表にはあるがA表にはない値(B−A)
今度は逆に、B側にだけある値(B−A)を出したいときは、
単純に立場を入れ替えます。
Bシートの D2 に次のように書きます。
=FILTER(B!A2:A100,
ISNA(MATCH(B!A2:A100, A!$A$2:$A$100, 0)))
考え方はさきほどと同じです。
Bの各値について、
Aの中に存在しないものだけを TRUE として抽出している、
というイメージです。
差集合を“行ごと”抽出する
単に「コードだけ」ではなく、
「その行の他の情報も含めて差集合を取りたい」場面がよくあります。
例えば A表には
A列:商品コード
B列:商品名
C列:数量
が入っているとき、
「A側にだけ存在するコードの行だけ」を丸ごと出したい場合の型はこうです。
=FILTER(A!A2:C100,
ISNA(MATCH(A!A2:A100, B!$A$2:$A$100, 0)))
元データ範囲を A!A2:C100(コード+商品名+数量)に広げて、
判定のほうは「コード列だけ」で行っているのがポイントです。
XLOOKUP を使った差集合の書き方(MATCH の代わり)
MATCH の代わりに XLOOKUP を使っても構いません。
XLOOKUP は、見つからないと #N/A を返すので、
ISNA との相性も良いです。
A側にだけ存在する値(A−B)を、XLOOKUP で書くとこうなります。
=FILTER(A!A2:A100,
ISNA(XLOOKUP(A!A2:A100, B!$A$2:$A$100, B!$A$2:$A$100)))
Aの各値を B側で検索して、
見つからない(#N/A)ものだけ TRUE → 差集合
という流れは MATCH のときと同じです。
MATCH に慣れていない場合は、
普段よく使う XLOOKUP でそろえてしまうのもありです。
差集合でよくある実務シナリオ
差集合 A−B の典型的なシーンを、イメージしやすいようにまとめておきます。
同じ月の売上データを「先月 vs 今月」で比べて、
今月新しく登場した商品コードだけを出したい(今月−先月)
顧客リストを「旧システム vs 新システム」で比べて、
新システムにまだ移行されていない顧客だけを出したい(旧−新)
シフト表を「予定表 vs 実績表」で比べて、
予定にはあったが実績では出勤していない人だけを出したい(予定−実績)
どれも基本は同じで、
「片方のリストから、もう片方で見つからないものだけ抽出」
= FILTER + ISNA + MATCH(または XLOOKUP)
というパターンで作れます。
例題
問題1
Sheet「A」の A2:A100 に商品コード、Sheet「B」の A2:A100 に商品コードがあります。
Aシートの中から「Bには存在しない商品コードだけ」を、Aシートの D2 に一覧表示する式を書いてください。
=FILTER(A!A2:A100,
ISNA(MATCH(A!A2:A100, B!$A$2:$A$100, 0)))
問題2
Sheet「B」の A2:A100 に商品コードがあります。
Bシートの中から「Aシートには存在しない商品コードだけ」を、Bシートの D2 に一覧表示する式を書いてください。
=FILTER(B!A2:A100,
ISNA(MATCH(B!A2:A100, A!$A$2:$A$100, 0)))
問題3
Sheet「A」の A2:C100 に「商品コード, 商品名, 数量」があります。
Sheet「B」の A2:A100 に商品コードがあります。
Aシートの中から、「Bシートには存在しない商品コードの行だけ」を、Aシートの E2 に行ごと表示する式を書いてください。
=FILTER(A!A2:C100,
ISNA(MATCH(A!A2:A100, B!$A$2:$A$100, 0)))
問題4
MATCH の代わりに XLOOKUP を使って、Aシートの A2:A100 の中から「Bシートには存在しない商品コードだけ」を Aシートの D2 に一覧表示する式を書いてください。
=FILTER(A!A2:A100,
ISNA(XLOOKUP(A!A2:A100, B!$A$2:$A$100, B!$A$2:$A$100)))
問題5
Sheet「旧」の A2:A100 に旧システムの顧客ID、
Sheet「新」の A2:A100 に新システムの顧客IDがあります。
旧システムには存在するが、新システムには存在しない顧客IDだけを、Sheet「旧」の D2 に一覧表示する FILTER+MATCH の式を書いてください。
=FILTER(旧!A2:A100,
ISNA(MATCH(旧!A2:A100, 新!$A$2:$A$100, 0)))
まとめ
差集合を Excel で求めるときの「型」は、こう整理できます。
片側にだけ存在する値(A−B)
=FILTER(A側リスト,
ISNA(MATCH(A側リスト, B側リスト, 0)))
行ごとの差集合
=FILTER(A側の表全体,
ISNA(MATCH(A側のキー列, B側のキー列, 0)))
このパターンさえ押さえておけば、
「どの表をどの表と比べたいか」だけ入れ替えて、
売上・顧客・在庫・シフト…あらゆる差集合を一瞬で洗い出せるようになります。
