Menu

Excelで重複を除いた件数を数える: UNIQUEとCOUNTIFの数式

=COUNTA(UNIQUE(A2:A9))は、A2:A9に何種類の値があるかを数えます。古いExcelでは=SUMPRODUCT(1/COUNTIF(A2:A9,A2:A9))を使います。1回だけ出てくる値、条件付き、空白を除く数え方も学びます。

このページのシートはすべて実際に動きます。数値や数式を変えると再計算されます。

=COUNTA(UNIQUE(A2:A9))は、A2:A9に何種類の値があるかを数えます。UNIQUEが各値を1回ずつ返し、COUNTAがそのリストを数えます。Excel 2021かMicrosoft 365が必要です。古いバージョンについては下で説明します。

異なる顧客
D2
ABCD
1CustomerUnique listCount
2AnaAna5
3BenBen
4AnaCara
5CaraDan
6BenEva
7Dan
8Ana
9Eva
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

8件の注文は5人の顧客からのものです。C2はUNIQUEで名前のリストをスピルして、何を数えているかが見えるようにしています。D2はそのリストをシートに置かずに数えます。A9をAnaに変えると件数は4に減り、新しい名前を入力すると増えます。

UNIQUEは大文字と小文字を区別しないので、Anaとanaは1人の顧客として数えられます。

古いExcelで重複を除いた件数を数える

Excel 2019以前にはUNIQUEがありません。昔からある数式は次のとおりです:

=SUMPRODUCT(1/COUNTIF(A2:A9,A2:A9))

範囲全体を条件にしたCOUNTIFは、行ごとに、その行の値が何回出てくるかを返します。3回出てくる名前はその各行に3が入るので、1/3が3回足され、その名前の合計はちょうど1になります。B列は行ごとの回数を、C列はその分数を表示しています。

1/COUNTIFのしくみ
E2
ABCDE
1CustomerTimes1/TimesCount
2Ana30.335
3Ben20.505.00
4Ana30.33
5Cara11.00
6Ben20.50
7Dan11.00
8Ana30.33
9Eva11.00
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

Anaの3行はそれぞれ0.33を、Benの2行はそれぞれ0.50を、1回だけの3つの名前はそれぞれ1を足すので、合計は5になり、作業列のSUMと同じです。数万行ではこの数式は遅くなります。COUNTIFが1行ごとに範囲全体を調べるからです。UNIQUEにはこの負担がありません。

重複を除いた件数と、1回だけ出てくる値

「ユニーク」という言葉は2つの違う件数に使われます。上で数えたのは異なる値の数で、どの名前も1回ずつ数えます。もう1つは、1回だけ注文した顧客のように、ちょうど1回だけ出てくる値の数です。UNIQUEでは3つ目の引数exactly_onceをTRUEにすると数えられます。

異なる値と、1回だけの値
D3
ABCD
1CustomerCountResult
2AnaDistinct5
3BenExactly once3
4AnaExactly once, older Excel3
5Cara
6Ben
7Dan
8Ana
9Eva
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

異なる顧客は5人ですが、1回だけ注文したのはCara、Dan、Evaの3人です。古いExcel版は、COUNTIFがちょうど1になる行を数えます。すべての値が繰り返されていると、exactly_onceを指定したUNIQUEは#CALC!を返し、COUNTAはそのエラーを1と数えます。SUMPRODUCT版は0になります。

条件付きで重複を除いた件数を数える

1つの地域の異なる顧客を数えるには、先に行を絞り込んでから残ったものを数えます。FILTERがNorthの行を残し、UNIQUEが繰り返しを取り除きます。

地域ごとの異なる顧客
E2
ABCDE
1CustomerRegionRegionCustomers
2AnaNorthNorth3
3BenSouthSouth3
4AnaNorthNorth, older Excel3
5CaraNorth
6BenNorth
7DanSouth
8AnaNorth
9EvaSouth
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

Northには3人の顧客、Ana、Cara、Benからの注文が5件あります。E3はSouthを同じように数えます。E4はExcel 2019以前のための版です。COUNTIFSが顧客と地域の組ごとに数え、条件がNorthの分数だけを残します。

一致する行がないとFILTERは#CALC!を返し、COUNTAはそのエラーを1つの値として数えます。D2にWestと入力すると、E2は0ではなく1を表示します。COUNTAはエラーを返さないので、数式をIFERRORで囲んでも役に立ちません。代わりに、エラーをそのまま渡す結果の行数を数えます:=IFERROR(ROWS(UNIQUE(FILTER(A2:A9,B2:B9="West"))),0)は0を返します。

空白を除いて重複を除いた件数を数える

範囲の中の空のセルは、もう1つの「値」になります。UNIQUEはそれを0として返し、COUNTAはその0を数えるので、Ana、空のセル、Ben、Ana、空のセル、Cara、Benの場合、Excelの結果は次のとおりです:

=COUNTA(UNIQUE(A2:A8))    4   three names plus the 0 for the empty cells

古い数式では、空の行に対してCOUNTIFが0を返すので、1/0が#DIV/0!になります。先に空白を取り除きます:

すき間のある範囲
D2
ABCD
1CustomerFormulaCount
2AnaSkip blanks3
3Older Excel3
4Ben
5Ana
6
7Cara
8Ben
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

どちらの数式も3人の顧客を数えます。A2:A8<>""を指定したFILTERは、UNIQUEに渡す前に空のセルを落とします。古い数式では、A2:A8&""が各空白セルを空の文字列に変えるのでCOUNTIFが0を返すことはなく、(A2:A8<>"")がそれらの行の重みを0にします。

練習: 商品を数える

やってみよう: 商品は何種類?
E2
ABCDE
1OrderProductCountResult
21001AppleProducts
31002Pear
41003Apple
51004Plum
61005Pear
71006Apple
81007Plum
91008Fig
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

やってみよう: B2:B9に何種類の商品が出てくるかを数えてください。数式はE2に書きます。

Excelのバージョン別の数式

数えるものExcel 365 / 2021Excel 2019以前
異なる値=COUNTA(UNIQUE(A2:A9))=SUMPRODUCT(1/COUNTIF(A2:A9,A2:A9))
1回だけ出てくる値=COUNTA(UNIQUE(A2:A9,,TRUE))=SUMPRODUCT(--(COUNTIF(A2:A9,A2:A9)=1))
条件付きの異なる値=COUNTA(UNIQUE(FILTER(A2:A9,B2:B9="North")))=SUMPRODUCT((B2:B9="North")/COUNTIFS(A2:A9,A2:A9,B2:B9,B2:B9))
空白を除いた異なる値=COUNTA(UNIQUE(FILTER(A2:A9,A2:A9<>"")))=SUMPRODUCT((A2:A9<>"")/COUNTIF(A2:A9,A2:A9&""))

ピボットテーブルでは、集計方法の「Distinct Count」(重複しない値の個数)が数式なしで同じことをしますが、「このデータをデータモデルに追加する」にチェックを入れてピボットテーブルを作成したときだけです。数えるのではなく繰り返しを削除するには、重複の削除を参照してください。

よくある質問

Excelで重複を除いた件数を数えるには?

Excel 365か2021なら=COUNTA(UNIQUE(A2:A9))を使います。UNIQUEが各値を1回ずつ並べ、COUNTAがそのリストを数えます。古いバージョンでは=SUMPRODUCT(1/COUNTIF(A2:A9,A2:A9))を使います。

1回だけ出てくる値を数えるには?

UNIQUEの3つ目の引数exactly_onceをTRUEにします:=COUNTA(UNIQUE(A2:A9,,TRUE))。Ana、Ana、Benなら、1回だけ出てくるのはBenなので1になります。Excel 2019以前では=SUMPRODUCT(--(COUNTIF(A2:A9,A2:A9)=1))を使います。

条件付きで重複を除いた件数を数えるには?

先に絞り込んでから数えます。=COUNTA(UNIQUE(FILTER(A2:A9,B2:B9="North")))はNorthの行の異なる顧客を数えます。一致する行がないとCOUNTAはFILTERの#CALC!エラーを1と数えるので、その可能性があるときは=IFERROR(ROWS(UNIQUE(FILTER(A2:A9,B2:B9="North"))),0)を使います。

空白のセルを除いて重複を除いた件数を数えるには?

UNIQUEの前に空白を取り除きます:=COUNTA(UNIQUE(FILTER(A2:A9,A2:A9<>"")))。古いExcelでは=SUMPRODUCT((A2:A9<>"")/COUNTIF(A2:A9,A2:A9&""))で空白を飛ばせます。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める