売上明細や問い合わせ履歴から「今月は何社と取引したか」「何人の顧客から注文があったか」を知りたいことがあります。このとき行数をそのまま数えると、同じ顧客が何度も数えられてしまいます。必要なのは、重複を除いた件数です。
この記事では、重複を除いた件数を次の3つの方法で求めます。そのうえで、2つの方法の結果を突き合わせて、数字が正しいか確かめる手順を説明します。
- ROWS(またはCOUNTA)とUNIQUE関数を組み合わせる
- UNIQUE関数が使えない場合は、SUMPRODUCTとCOUNTIFを組み合わせる
- ピボットテーブルの「個別のカウント」を使う
数える前に決めておくこと
どの列で数えるか
顧客IDや取引先コードのように、1つの相手に1つだけ割り当てられた列があれば、その列で数えます。
会社名や氏名で数えると、表記の違いで件数が多めに出ます。たとえば「株式会社〇〇」と「(株)〇〇」は、別の相手として数えられます。名前の列しかない場合は、表記をそろえてから数えてください。
空欄をどう扱うか
顧客IDが空欄の行がある場合、空欄を1件と数えるかどうかで結果が1件ずれます。通常は空欄を除いて数え、空欄の行数は別に確認しておきます。
練習用の小さな表で式を確かめる
本番のデータで使う前に、答えが分かっている小さな表で式を試してください。式の誤りに気づきやすくなります。
| 日付(A列) | 顧客ID(B列) | 担当者(C列) |
|---|---|---|
| 2026/9/1 | C001 | 佐藤 |
| 2026/9/3 | C002 | 鈴木 |
| 2026/9/8 | C001 | 佐藤 |
| 2026/9/12 | (空欄) | 鈴木 |
| 2026/9/20 | C003 | 佐藤 |
この表で、重複と空欄を除いた顧客数は「3」です(C001・C002・C003)。担当者が佐藤の顧客数は「2」です(C001・C003)。
この記事の式は、この表と同じ列の並びで、データが2行目から500行目まであるものとして書いています。
方法1:UNIQUE関数で数える(Microsoft 365・Excel 2021以降)
UNIQUE関数が使えるExcelなら、重複を除いた一覧を作り、その行数を数えます。
=ROWS(UNIQUE(FILTER(B2:B500,B2:B500<>"")))
FILTER(B2:B500,B2:B500<>"")で空欄を除くUNIQUE(...)で重複を除くROWS(...)で残った行数を数える
=COUNTA(UNIQUE(B2:B500)) という書き方もできます。ただし範囲に空欄が含まれると、UNIQUEの結果に空欄が1つ入り(0と表示されます)、COUNTAがそれも数えるため、1件多くなります。範囲を表より広めに指定していると、特にずれやすくなります。FILTERで空欄を除く書き方をおすすめします。
範囲がすべて空欄だと、FILTERは #CALC! エラーを返します。0と表示したい場合は =IFERROR(ROWS(UNIQUE(FILTER(B2:B500,B2:B500<>""))),0) とします。ただし、これでは別の原因のエラーも0と表示されます。結果が0になったときは、元のデータを確認してください。
条件を付けて数える
担当者ごとや期間ごとの顧客数を出すには、FILTERに条件を追加します。条件同士は * でつなぎます。
担当者が「佐藤」の顧客数:
=ROWS(UNIQUE(FILTER(B2:B500,(B2:B500<>"")*(C2:C500="佐藤"))))
2026年9月の顧客数:
=ROWS(UNIQUE(FILTER(B2:B500,(B2:B500<>"")*(A2:A500>=DATE(2026,9,1))*(A2:A500<DATE(2026,10,1)))))
期間の終わりは「10月1日より前」と書いています。9月30日に時刻付きのデータがあっても、漏れずに数えられます。
式で使う範囲(A列・B列・C列)は、すべて同じ行数にしてください。行数が違うとFILTERがエラーになります。表をテーブルにしている場合は、売上[顧客ID] のように列名で指定すると、範囲のずれを防げます。
1回しか登場しない顧客を数える
UNIQUE関数の3番目の引数にTRUEを指定すると、1回だけ登場した値に絞れます。「期間中に1回だけ注文した顧客数」を知りたいときに使えます。
=ROWS(UNIQUE(FILTER(B2:B500,B2:B500<>""),,TRUE))
練習用の表なら、結果は「2」です(C002・C003)。
方法2:SUMPRODUCTとCOUNTIFで数える(UNIQUE関数がない場合)
UNIQUE関数がない以前のExcelでは、次の式で重複を除いた件数を求めます。
=SUMPRODUCT((B2:B500<>"")/COUNTIF(B2:B500,B2:B500&""))
仕組みは次のとおりです。
COUNTIF(B2:B500,B2:B500&"")で、各行の値が範囲内に何回出てくるかを求める(C001なら2回)- 1をその回数で割る(C001の2行は、それぞれ1/2になる)
- 全行を足すと、同じ値の行の合計がちょうど1になるため、値の種類の数が残る
(B2:B500<>"")で空欄の行を0にする。&""は、空欄の行で0による割り算のエラーが出るのを防ぐ
条件を付けるには、COUNTIFの代わりにCOUNTIFSを使い、条件の列も回数の計算に含めます。担当者が「佐藤」の顧客数は次のとおりです。
=SUMPRODUCT((B2:B500<>"")*(C2:C500="佐藤")/COUNTIFS(B2:B500,B2:B500&"",C2:C500,C2:C500&""))
この方法には、次の注意点があります。
- 行数が多いと重くなる:行ごとに範囲全体を数えるため、数万行あると再計算に時間がかかることがあります
- ワイルドカードとして扱われる文字がある:値に
*?~が含まれると、COUNTIFが別の値まで一致とみなすことがあります - 数字だけのIDに注意する:COUNTIFは数字に見える文字列を数値として比べることがあります。そのため、先頭の0の有無だけが違うコードや、16桁以上の番号を同じ値とみなして、数え違うことがあります
こうした数え違いは、後で説明する「2つの方法で突き合わせる」手順で見つけられます。
方法3:ピボットテーブルの「個別のカウント」で数える
ピボットテーブルを使うと、関数なしで数えられます。担当者別・月別の内訳を一度に出したいときにも便利です。
- 表の中のセルを1つ選び、「挿入」タブの「ピボットテーブル」を選ぶ
- 作成画面で「このデータをデータモデルに追加する」にチェックを入れ、「OK」を押す
- フィールドリストで、「顧客ID」を「値」エリアへドラッグする
- 「値」エリアに入った顧客IDの項目をクリックし、「値フィールドの設定」を開く
- 集計方法で「個別のカウント」を選び、「OK」を押す
- 内訳を見たいときは、担当者や日付の列を「行」エリアに入れる
「個別のカウント」は、手順2でデータモデルに追加したピボットテーブルにしか表示されません。すでに作ったピボットテーブルに表示されないときは、作り直してください。お使いのExcel(Mac版など)によっては、データモデルの項目自体がない場合もあります。
その場合は、「顧客ID」を「行」エリアに入れてください。重複を除いた顧客IDが1行ずつ並ぶので、総計の行を除いた行数が、重複を除いた件数になります。
総計は内訳の合計と一致しない
担当者別に個別のカウントを出すと、総計が担当者ごとの件数の合計より小さくなることがあります。これは誤りではありません。2人の担当者が同じ顧客に対応している場合、総計ではその顧客を1件と数えるためです。同じ理由で、月別の顧客数を足しても、期間全体の顧客数にはなりません。
元のデータを変えたら更新する
ピボットテーブルは、元の表を変えても自動では変わりません。ピボットテーブル内で右クリックして「更新」を押してから、数字を見てください。元の表をテーブルにしておけば、行を追加しても更新するだけで反映されます。
2つの方法で突き合わせて確かめる
顧客数や取引先数は、報告や請求の確認に使う数字です。1つの方法で出した結果をそのまま使わずに、別の方法でも数えて一致するか確かめます。
- 関数(方法1か方法2)で件数を出す
- ピボットテーブル(方法3)で、同じ列・同じ条件の件数を出す
- 一致すれば、その件数を使う
- 一致しなければ、下の表を見て原因を探す
| 差の出方 | 疑う原因 | 確かめ方 |
|---|---|---|
| ちょうど1件違う | どちらかが空欄を1件と数えている | =COUNTBLANK(B2:B500) で空欄があるか見る。ピボットの行に「(空白)」が出ていないか見る |
| 関数(COUNTIF)のほうが少ない | ワイルドカードの文字や、数字だけのIDを同じ値とみなしている | ピボットの行に顧客IDを並べ、該当しそうなIDを探す |
| 数件ずれる | 前後の空白、全角・半角、大文字・小文字、数値と文字列の混在を、方法によって同じ値とみなしたり、別の値とみなしたりしている | 両方の方法で顧客IDの一覧を出して見比べる。差が出たIDを =LEN(B2) や =ISTEXT(B2) で調べる |
| ピボットだけ合わない | 更新していない。元データの範囲に新しい行が入っていない | ピボットを更新し、データソースの範囲を確認する |
| 条件付きのときだけ合わない | 期間の区切り(月末日や時刻の扱い)が関数とピボットで違う | 関数の条件式と、ピボットのフィルター設定を見比べる |
両方の結果が一致していても、予想より多いことがあります。その場合は、同じ相手が入力の揺れで別のIDとして登録されていないかを確かめてください。
総件数とも見比べる
=COUNTA(B2:B500) で空欄を除いた行数を出し、重複を除いた件数と並べておくと、1顧客あたりの平均取引回数の目安にもなります。
重複を除いた件数が、空欄を除いた行数を上回ることはありません。上回った場合は、式の範囲や条件を見直してください。
