Excelで2つの表を突合する手順|COUNTIFで数えると「無いのに一致」する

Excelで2つの表を突合する手順|COUNTIFで数えると「無いのに一致」する
当サイトはアフィリエイト広告を利用しています。

結論:前処理でそろえてから、XLOOKUPで突き合わせる

突合が合わない原因は2つです。どちらも下の手順で対処できます。

  1. データの形がそろっていない(見た目は同じでも、Excelには別物に見えている)
  2. 関数が、無いものを「ある」と答えている(定番のCOUNTIFで起きます)

突合の手順

2つの表が、同じファイルの 表1・表2 シートにある前提です。
別ファイルなら、シートを右クリック →「移動またはコピー」で1つのファイルにまとめてください。

1. 両方のシートに作業列を作って、同じ式を入れる

表の右端の空き列(ここでは Z列とします)に次の式を入れ、下までコピーします。
A2 は自分のキー列の最初のセルに置き換えます。
元のデータは書き換えません。間違えたときに戻せなくなります。

=UPPER(SUBSTITUTE(SUBSTITUTE(ASC(TRIM(A2))," ",""),CHAR(160),""))

必ず両方のシートに入れてください。 片方だけだと、かえって一致しなくなります。
キーが日付や金額なら、A2 を TEXT(A2,"yyyy/mm/dd") のように包みます(→ 前処理の節)。
それ以外のキーには使いません。1-2 のようなコードが日付に化けます。

2. 表1側にもう1列作って、表2にあるかを調べる

=XLOOKUP(Z2,表2!$Z$2:$Z$1000,表2!$A$2:$A$1000,"無し")

Z2 が1で作った作業列、$Z$2:$Z$1000 が表2の作業列(探す範囲)、$A$2:$A$1000 が見つかったときに返す列です。
1000 は行数より少し多めにします。
見つかれば表2側の元の表記が、無ければ「無し」が出ます。
山田 花子 が返れば、空白の違いだったと原因も分かります。

古いExcel(Office 2019以前)は、2の代わりにこちらです(理由は「原因2」で説明します)。

=IF(SUMPRODUCT(--EXACT(表2!$Z$2:$Z$1000,Z2))=0,"無し","あり")

COUNTIFは使わないでください。 無いものを「ある」と答えることがあります。

3. 差分を見て、逆向きも見る

2の列にフィルターをかけて「無し」だけを表示すれば、それが「表1にあって表2に無いもの」です。
表2 シートにも同じように列を作り、2の式の 表2! を 表1! に書き換えて入れます。
逆向きは、この形でしか見つかりません。
「表2にあって表1に無いもの」は、この向きでしか見つかりません。

この記事に出てくる用語
  • 突合(とつごう) … 2つの表を突き合わせて、一致するもの・しないものを見つける作業。「照合」とも言う
  • キー … 2つの表を結びつける目印になる列。顧客名・伝票番号・商品コードなど
  • 作業列 … 元のデータを壊さずに計算するために、空いている列に一時的に作る列。突合が終わったら消してよい
  • 前処理 … 比べる前に、データの形をそろえておくこと

原因1:見た目が同じでも、Excelには違うものに見えている

目には同じでも、Excelには別物に見えるものがあります。

人が見て表1表2= で比べると
まったく同じ田中太郎田中太郎一致
末尾に空白田中太郎田中太郎 一致しない
間に空白山田花子山田 花子一致しない
英数字の全角と半角ABC123ABC123一致しない
カタカナの全角と半角ソフトソフト一致しない
文字列の「1」と数値の111一致しない
大文字と小文字abcABC一致する

最後の行だけ逆で、= は大文字と小文字を区別しません。
どれが区別されるかは直感と合わないので、目で探しても原因は見つかりません。前処理でそろえます。

使う関数によって、答えが変わる

5つの手法は、何を「同じ」と判定するかが違います。

人が見て=EXACTCOUNTIFVLOOKUPXLOOKUP
まったく同じ○○○○○
末尾に空白×××××
間に空白×××××
英数字の全角と半角××××○
カタカナの全角と半角××××○
大文字と小文字○×○○○
文字列の「1」と数値の1×○○××

① 全角と半角を同じとみなすのはXLOOKUPだけです。
「VLOOKUPで出ないのにXLOOKUPにしたら出た」の正体は、たいていこれです。
原因が直ったのではなく、たまたま拾えているだけのことがあります。

② = と EXACT は、厳しさの向きが逆です。
= は大文字小文字を区別せず、数値と文字列は区別します。EXACTはその逆です。

③ COUNTIFは数値と文字列を区別しません。
「COUNTIFでは数が合うのにVLOOKUPで引けない」ときは、これが原因のことがあります。
隣のセルに =ISTEXT(A2) と入れれば見分けられます(TRUEなら文字列、FALSEなら数値)。

自分で検証するときの罠

検索範囲を表全体にして試すと、別の行の「田中太郎」などに一致して、正しい結果が出ません。
1組ずつ独立に比べ、範囲に他の候補が混ざっていないか確認してください。

原因2:COUNTIFは「無いのに1」を返す

突合の方法として「COUNTIFで数えて、0なら無い」という書き方がよく紹介されます。
手軽ですが、本当は無いものを「ある」と答えるパターンが実在します。

次の4パターンです。人が見れば全部「別物」です。

探した値表2にあった値COUNTIFの答え
123456789012345612345678901234571(あることになる)
000111
AB*ABCDEF1
SMITH?SMITHX1

前処理をしても直りません。 前処理をかけた作業列で数えても、4つとも1のままです。

なぜこうなるのか

COUNTIFは、数字に見えるものを数値として扱います。
Excelが正確に扱える整数は15桁までなので、16桁の番号は末尾が丸められ、1桁違いが同じ値になります。
0001 と 1 も、両方を数値の1として見ています。

もう1つ、COUNTIFは * を「なんでもよい」、? を「なんでもよい1文字」の意味に取ります。
コードや型番に * や ? が入っていると、別のものを拾います。

では何を使えばいいのか

同じ4パターンを、他の手法に当てるとこうなります。期待する答えは4つとも「無い」です。

手法上の4パターンでどうなるか
COUNTIF / COUNTIFS4つとも誤って「ある」と答える
VLOOKUP / MATCH16桁と 0001 は正しく「無い」。* と ? で誤る
XLOOKUP4つとも正しく「無い」
SUMPRODUCT+EXACT4つとも正しく「無い」

XLOOKUP(Excel 2021以降か Microsoft 365)が使えるならXLOOKUP、それ以前なら SUMPRODUCT+EXACT です。
式は冒頭の手順にあります。
後者は EXACT が1つ1つを文字のまま比べ、SUMPRODUCT が一致した件数を数えます(0なら1件も無い)。
行数が多いと重くなるので、鈍いと感じたらXLOOKUPが使える環境で作業するほうが現実的です。

2つを併用するなら、前処理に UPPER を必ず入れてください

XLOOKUPは大文字と小文字を区別せず、EXACTは区別します。
UPPER 無しだと abc と ABC で、同じブックの中で答えが割れます。
前処理の式に UPPER があるのはこのためです。

* や ? の罠は、一致した相手の金額を持ってくるときにも出ます。
AB* で ABCDEF の金額を引こうとすると、XLOOKUPは「無し」を返しますが、VLOOKUPは金額を返します。
* や ? が入りうるデータでは、VLOOKUPも信用できません。

前処理:比べる前に形をそろえる

原因1のずれは、比べる前に形をそろえれば解決します。

使う式

=UPPER(SUBSTITUTE(SUBSTITUTE(ASC(TRIM(A2))," ",""),CHAR(160),""))

内側から順に、こう動きます。

順部分何をするか
1TRIM(A2)前後の空白を取り、間の連続した空白を1つに詰める
2ASC(...)全角の英数字・カタカナ・空白・一部の記号を半角にする
3SUBSTITUTE(..." ","")残った空白を全部消す
4SUBSTITUTE(...,CHAR(160),"")見えない空白を消す
5UPPER(...)小文字を大文字にそろえる

この式は、数値と文字列の型の違いも解決します。TRIM が数値を文字列に変えるためです。
原因1の③で書いた「COUNTIFでは合うのにVLOOKUPで引けない」も、この式を通せば揃います。

ただし、日付と「表示形式を付けた数値」は別です(次の節で説明します)。

TRIMは「前後だけ」ではありません

よくある説明に「TRIMは前後の空白を取る」とありますが、間の連続した空白も1つに詰めます。
田中␣␣太郎(空白2つ)は 田中␣太郎 になり、空白1つはそのまま残ります。
だから、TRIMのあとに SUBSTITUTE(...," ","") が要ります。上の式がその形です。

CHAR(160) とは何か

Webページや社内システムからコピーしたデータに混ざる、「見た目は空白だが空白ではない文字」です。
半角スペース(32番)とは別の文字(160番)なので、SUBSTITUTE(A2," ","") では消えません。

日付や金額をキーにするときは、もうひと手間いる

日付セルは、画面に 2026/08/23 と見えていても中身は 46257 という通し番号です。
前処理を通しても、文字列の 2026/08/23 とは一致しません。

直し方は、TEXT で見た目どおりの文字列にしてから前処理にかけることです。

=UPPER(SUBSTITUTE(SUBSTITUTE(ASC(TRIM(TEXT(A2,"yyyy/mm/dd")))," ",""),CHAR(160),""))

"yyyy/mm/dd" が、そろえたい表示の形です。両方の表に同じ書式を指定してください。
表記ゆれ(2026/8/23・2026-08-23)も、通すと 2026/08/23 にそろいます。

金額も同じです(1,234.50 と見えている数値の中身は 1234.5)。
小数点以下の桁数まで指定して、文字列にします。

=TEXT(A2,"#,##0.00")

桁数を省くと、別の金額が同じものになります。
TEXT(1234.5,"#,##0") も TEXT(1235.4,"#,##0") も 1,235 になります。"#,##0.00" なら別々の値になります。

金額のセルに日付の書式を当てるのも同じ事故です。
TEXT(1234.5,"yyyy/mm/dd") は 1903/05/18 という無関係な日付になります。

⛔ TEXTは「キーが日付のとき」だけに使ってください

数字とハイフンだけのコード(枝番・部門コードなど)は、日付として読まれて壊れます。

元のキーTEXT(…,"yyyy/mm/dd") を通すと
1-22026/01/02
2-3-42002/03/04
A-1A-1(無事)
ABC-123ABC-123(無事)

しかも補われる年は「今年」なので、来年同じ突合をすると結果まで変わります。
日付でも金額でもないキーには、TEXTを使わないでください。

ASCで直る記号・直らない記号

前処理の ASC は全角を半角にしますが、記号によって効き方が違います。ハイフンに見える文字では、こうなります。

ASCで記号
直る全角ハイフン -・全角括弧 (・全角ピリオド .(日本語入力で普通に打つ全角記号)
直らないマイナス記号 −・ハイフン ‐(U+2010)・ダッシュ —(コピー元が特殊な場合に混ざる)

直らない記号が出たときだけ、作業列をもう1列作り、1で作った作業列の結果に対して個別に置き換えてください。

=SUBSTITUTE(Z2,"−","-")

⛔ 長音符「ー」を置き換えてはいけません

長音符(カタカナの伸ばし棒)をハイフンに置き換えると、データが壊れます。

=SUBSTITUTE("スーパー","ー","-")   →   ス-パ-

長音符は記号ではなく、カタカナの言葉の一部です。
顧客名や商品名に新しい不一致を大量に作ります。これだけは触らないでください。

前処理では直らないもの(ここから先は人間の仕事)

形をそろえても、どうにもならないものがあります。

表1表2
株式会社ABC(株)ABC
株式会社ABC㈱ABC
1丁目2番3号1-2-3
山田 太郎山田太郎(本人)
旧姓・旧社名現姓・新社名

どれも一致しません。文字の並びとして本当に違うからです。

「そろえる」問題ではなく「同じものだと決める」問題なので、機械には決められません。やり方は2つです。

  1. 表記の統一ルールを決めて、SUBSTITUTEで一括置換する(例:(株) と ㈱ を 株式会社 に統一する)。パターンが決まっているならこれで潰せます
  2. 一致しなかったものだけを目で確認する

たとえば1000件のうち980件が機械で一致して、残り20件を目で見る。この形が現実的です。
全件を機械で一致させようとすると、かえって時間がかかります。

一致した相手の金額や日付を持ってくる

手順2の式の「返す範囲」を、持ってきたい列に変えるだけです。

=XLOOKUP(Z2,表2!$Z$2:$Z$1000,表2!$C$2:$C$1000,"無し")

表2!$C$2:$C$1000 が、持ってきたい値の入っている列です。
最後の "無し" を書かないとエラー表示(#N/A)になり、並べ替えや集計の邪魔になります。

見つからなかったものに色を付ける

色分けして見たいときは、条件付き書式を使います。

手順

  1. 表1 シートのデータが入っている範囲だけを選ぶ(例:A2:A1000)。列全体を選ぶと1行ずれます
  2. ホーム → 条件付き書式 → 新しいルール
  3. 「数式を使用して、書式設定するセルを決定」を選ぶ
  4. 数式に =SUMPRODUCT(--EXACT(表2!$Z$2:$Z$1000,$Z2))=0 と入れる
  5. 書式ボタンで塗りつぶしの色を選び、OK

うまくいったかの確認は、表2に確実に無いデータを1件わざと作り、その行だけ色が付くか見ることです。
全部に色が付く場合は、範囲の指定か $ の位置が違っています。

この数式もEXACTを使うので、前処理に UPPER が要ります(手順1の式のままなら入っています)。

キー列に空白のセルがあるとき

キーが空の行があると、SUMPRODUCT+EXACTの式と条件付き書式が、空どうしを「一致」と判定します。
範囲を広めに取って余った空セルでも、同じことが起きます。
手順2のXLOOKUPは空のキーに「無し」を返しますが、表2側の作業列を下まで式で埋めていると 0 が返ります。

いちばん確実なのは、突合の前に空行を消すことです。
消せない場合、古いExcel向けの式はこの形にすれば弾けます。

=IF(Z2="","(キーが空)",IF(SUMPRODUCT(--EXACT(表2!$Z$2:$Z$1000,Z2))=0,"無し","あり"))

条件付き書式で空も弾きたい場合は、数式をこちらにします(範囲の余りの空行にも色が付きます)。

=OR($Z2="",SUMPRODUCT(--EXACT(表2!$Z$2:$Z$1000,$Z2))=0)

よくある詰まり方

症状原因
前処理したのに一致しない片方の表にだけ前処理をかけている。両方に同じ式を入れる
日付で突き合わせると全部「無し」になる片方が日付、片方が文字列。TEXT() で書式を指定してから前処理にかける
COUNTIFでは数が合うのにVLOOKUPで引けない数値と文字列の型違い。前処理の式(TRIM入り)を通せば揃う
一致しないはずのものが一致しているCOUNTIFを使っている。XLOOKUP か SUMPRODUCT+EXACT に変える
手順2と条件付き書式で答えが違う前処理に UPPER が入っていない(XLOOKUPは大小を区別せず、EXACTは区別するため)
XLOOKUPにしたら出た全角半角のずれだった可能性が高い。前処理を入れないと、次に別のずれが来たときにまた止まる
一部だけ一致しない記号の種類違い(ASCで直らないもの)か、見えない空白(CHAR(160))
キーが空の行が「あり」になる(古いExcel向けの式・条件付き書式)空どうしが一致している。空行を消すのが確実
全部一致しない範囲の指定違いか、比べる列を間違えている。まず1行だけ手で確認する

関連する作業

表記ゆれをそろえたり重複を消したりする作業は、突合の前にやると後が楽です。
手順は別記事「顧客リストの名寄せをExcelだけでやる手順」にまとめています。

この記事の確認範囲

  • 表と数値は Microsoft Office Home and Business 2024(日本語版)での話です。Excelのバージョンや設定によって、結果が変わることがあります
  • XLOOKUP は Office 2019以前では使えません(代わりの書き方を併記しています)
  • 日本語版・日本語ロケールでの話です。他の言語版では、全角半角やカナの扱いが変わることがあります
  • SUMPRODUCT+EXACTがどのくらいの行数から重くなるかは分かっていません
  • 表記ゆれの種類は、記事に挙げたものがすべてではありません

コメント

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