Excel関数 逆引き集 | 差集合を求める → FILTER

Excel VBA Excel
スポンサーリンク

概要

「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)))

動き方を言葉で追うと、こうなります。

  1. MATCH(A!A2:A100, B!$A$2:$A$100, 0)
    A側の各値が、B側にあるかどうかを探す
    見つかれば位置(1,2,3…)、見つからなければ #N/A
  2. ISNA(その結果)
    #N/A(見つからない)なら TRUE
    つまり「Bには存在しない」行が TRUE になる
  3. 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)))

このパターンさえ押さえておけば、
「どの表をどの表と比べたいか」だけ入れ替えて、
売上・顧客・在庫・シフト…あらゆる差集合を一瞬で洗い出せるようになります。

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