なぜ「重複除外」の技術が重要なのか
実務において、顧客名簿や売上データなどを扱う際、「重複を除いた件数(ユニーク数)」をカウントしたい場面は非常に多いものです。例えば、同じ顧客から複数回の申し込みがあった場合、純粋な顧客数を把握するには、重複を取り除く必要があります。しかし、関数を組み合わせるだけでは手間がかかることもあります。今回は、COUNTIF関数を応用した「重複除外のロジック」を学び、それをVBAで自動化して効率化する方法を解説します。
基礎知識:COUNTIF関数の「範囲」を可変にする
COUNTIF関数は、指定した範囲内で条件に一致するセルの個数を数える関数です。
通常、範囲は「A1:A10」のように固定しますが、今回のポイントは「相対参照」と「絶対参照」を組み合わせた可変範囲です。
数式で「$A$1:A1」という範囲を指定すると、下にコピーするにつれて「$A$1:A2」「$A$1:A3」と範囲が自動的に広がります。これにより、「現在の行までで、この値は何回出現したか」を判定でき、結果が「1」であれば「初登場(重複なし)」、2以上であれば「2回目以降(重複)」と識別できる仕組みです。
実装のステップ:VBAでロジックを再現する
Excelの関数で行う作業をVBAに置き換えることで、データ量が増えても一瞬で処理を終えることができます。
1. 対象列のデータを上から順にループ処理する。
2. その行のデータが、それまでの範囲内で何件出現したかをCOUNTIFで判定する。
3. 結果が1(初登場)のものだけをカウントする。
サンプルプログラム:重複を省いてユニーク数をカウントする
以下のコードは、A列にあるデータから、重複を除いたユニークな件数をイミディエイトウィンドウに表示するマクロです。
Sub CountUniqueValues()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim uniqueCount As Long
Set ws = ActiveSheet
‘ A列の最終行を取得
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
uniqueCount = 0
‘ 1行目から最終行までループ
For i = 1 To lastRow
‘ WorksheetFunction.CountIf を使用
‘ 範囲を「1行目から現在の行まで」に限定して重複を判定
‘ 戻り値が 1 ならば初登場とみなす
If Application.WorksheetFunction.CountIf(ws.Range(“A1:A” & i), ws.Cells(i, 1).Value) = 1 Then
uniqueCount = uniqueCount + 1
End If
Next i
‘ 結果をデバッグに出力
Debug.Print “重複を除いた件数は: ” & uniqueCount & ” 件です”
End Sub
応用・注意点:現場での運用アドバイス
1. 処理速度の向上
データが数万件規模になる場合、ループ内で毎回ワークシート関数を呼び出すと処理が遅くなります。その場合は、一度配列にデータを格納してからDictionaryオブジェクトを使用して重複を排除する手法が、VBAの定石であり、より高速です。
2. 空白セルの扱い
COUNTIFは空白セルも対象に含めてカウントします。もし名簿に空白が含まれる場合、意図しないカウント結果になる可能性があるため、ループ内で「If ws.Cells(i, 1).Value <> “” Then」のように空判定を事前に入れておくとバグを防げます。
この「可変範囲でカウントする」という考え方は、重複チェックだけでなく、順位付けや累計の計算にも応用できる非常に強力なツールです。ぜひ自分のツールボックスに加えておいてください。
