Excel の実務では「重複が存在しているかどうか」を判定する“重複チェック”が非常に重要です。データ入力や大量データの取り込み、売上データや顧客情報の整備など、あらゆる場面で重複を検知してミスを防ぐことが求められます。
Excel の標準機能にも「重複の削除」や「条件付き書式で重複色付け」が用意されていますが、手動作業では不安定で、定期処理や大量データでは限界があります。そこで役立つのが VBA による 重複チェックの自動化 です。
VBA なら、
- 存在チェック
- 重複一覧の抽出
- 重複場所の特定
- 複数列条件での重複判定
- 重複行の色付け
- 重複時のエラー表示
など、幅広いロジックを柔軟に組み立てられます。
この記事では、初心者でも確実に理解できるように、最も実務で使う重複チェック手法を体系的に解説し、1列・複数列・Dictionary・配列処理まで全ての基礎と応用を“完全網羅”します。
目次
- ✅ 重複チェックとは?重複を削除する前に必須の“判定処理”のこと
- ・重複チェックは「削除」とは別の処理
- ✅ VBAで重複チェックを行う主な方法(3大アプローチ)
- ✅ 方法1:COUNTIF を使って重複チェック(初心者でも簡単)
- ・最も分かりやすい基本形
- 【サンプル①】1列の重複チェック(色付け)
- ・メリット
- ・デメリット
- 【応用】重複が“あるかどうかだけ”判定する
- 【応用】重複データを別シートに書き出す
- ❗ COUNTIF を使う場合の注意点
- ✅ 方法2:Dictionary を使って重複チェック(実務で最も多い)
- ・Dictionary を使うメリット
- 【サンプル②】1列の重複チェック(Dictionary)
- ・ポイント
- 【サンプル③】重複データを別列に抽出(1列)
- ・何ができるか
- 【応用】複数列(商品コード+日付)の重複チェック
- ・複数列重複が必要な実務例
- 【応用】重複行の位置を取得する(行番号収集)
- ❗ Dictionary の注意点
- ✅ 方法3:配列で高速に重複チェック(大量データ向け)
- 【サンプル④】配列+Dictionaryで重複チェック(高速)
- ・配列版のメリット
- ❗ 実務での“よくある重複チェックの失敗例”
- ・失敗①:目視では重複しているのに判定されない
- ・失敗②:“00123” と “123” が違うはずなのに同じ扱い
- ・失敗③:日付の“見た目”と“内部値”が違う
- ・失敗④:RemoveDuplicates と判定ロジックが食い違う
- 【実務向け】重複チェックしてから削除・抽出へ進む流れ
- 【実務テンプレート】1列の重複チェックを汎用関数化する
- 【実務テンプレート】重複項目を一覧化する関数
- 🧠 ChatGPT 生成コードでの重複チェック注意点
- 🧠 RPA(UiPath / Power Automate)との連携で重複チェックは必須
- 【実務例】重複チェックの活用シーン
- ・顧客マスタの不正重複検知
- ・売上データの重複チェック
- ・勤怠データのミス入力防止
- ・商品コードの整合性チェック
- ・RPA用データの前処理
- ・システム登録前の検証処理
- 【補足】複数列の重複チェックは“組み合わせキー”で対応
- 【応用】日付の重複チェックは CDate が重要
- 【応用】重複チェック後に色付け+コメント付与
- 【応用】重複回数のカウント
- 【応用】シート間の重複比較
- 【応用】エラー値(#N/A)を含む場合のチェック
- ❗ 実務での事前整形(前処理)が最も重要
- 🟩 重複チェックは「削除」「抽出」「まとめる」処理の前提
- ✅ まとめ:VBAでの重複チェックは実務で最も重要なデータ整備技術のひとつ
✅ 重複チェックとは?重複を削除する前に必須の“判定処理”のこと
・重複チェックは「削除」とは別の処理
Excel の標準機能「重複の削除」は“削除”であり、“チェック”ではありません。
重複チェックとは、
・重複があるかどうか
・どの行が重複しているか
・重複項目だけ抽出する
・重複回数をカウントする
などの判定処理を指します。
削除ではなく“確認する”目的で使うため、安全性が高く、実務向けです。
✅ VBAで重複チェックを行う主な方法(3大アプローチ)
重複チェックは次の3種類が代表です。
- WorksheetFunction.CountIf を使う方法(最も簡単)
- Dictionary を使う方法(重複行・重複一覧の取得が簡単)
- 配列を使った高速重複チェック(大量データ向け)
それぞれ用途やメリットが異なるため、実務での使い分けが重要です。
参考:【VBA】Variant型とは?便利だが危険な理由と使いどころ|実務で失敗しないための徹底ガイド
✅ 方法1:COUNTIF を使って重複チェック(初心者でも簡単)
・最も分かりやすい基本形
If WorksheetFunction.CountIf(Range("A:A"), Cells(i, 1).Value) > 1 Then
1行ずつ見て、「同じ値が2つ以上ある=重複あり」と判定できます。
【サンプル①】1列の重複チェック(色付け)
Sub CheckDuplicate_CountIf()
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
If WorksheetFunction.CountIf(Range("A:A"), Cells(i, 1).Value) > 1 Then
Cells(i, 1).Interior.Color = vbYellow
End If
Next i
End Sub
・メリット
- コードが短い
- ロジックが直感的でわかりやすい
- 少量データでは高速
・デメリット
- 10,000 行を超えると遅い
- 空白・全角/半角の扱いに弱い
- 複数列の重複には対応しづらい
チェックメインで構わない場合に向いています。
【応用】重複が“あるかどうかだけ”判定する
If WorksheetFunction.CountIf(Range("A:A"), key) > 1 Then
MsgBox "重複があります"
End If
検索目的で便利です。
【応用】重複データを別シートに書き出す
COUNTIF の結果を使って抽出できます。参考:【VBA】複数列の重複削除する方法|セル単位・行単位で処理する実務向けテクニック
❗ COUNTIF を使う場合の注意点
- 商品コード「00123」と「123」が同じと判定される
- 日付が文字列扱いになる場合あり
- 全角・半角混在で誤判定の可能性
より正確に判定したい場合は、Dictionary が最適です。
✅ 方法2:Dictionary を使って重複チェック(実務で最も多い)
・Dictionary を使うメリット
- 重複判定が高速
- 重複データだけ抽出できる
- 重複行、重複項目の位置がわかる
- 複数列にも対応可能
- 元データを壊さずチェックできる
実務では Dictionary の利用率が最も高いと言えます。
【サンプル②】1列の重複チェック(Dictionary)
Sub CheckDuplicate_Dic()
Dim dic As Object
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long, key As String
Set dic = CreateObject("Scripting.Dictionary")
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
key = CStr(ws.Cells(i, 1).Value)
If dic.Exists(key) Then
ws.Cells(i, 1).Interior.Color = vbYellow
Else
dic.Add key, i
End If
Next i
End Sub
・ポイント
- すべて文字列化(CStr)して誤判定防止
dic.Exists(key)が重複判定- 元データを壊さない
「重複行だけ色付け」「重複行を抽出」など柔軟に加工できます。
【サンプル③】重複データを別列に抽出(1列)
Sub ExtractDuplicate_Dic()
Dim dic As Object
Dim dupDic As Object
Dim i As Long, lastRow As Long
Dim key As String, r As Long
Set dic = CreateObject("Scripting.Dictionary")
Set dupDic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
key = CStr(Cells(i, 1).Value)
If dic.Exists(key) Then
dupDic(key) = ""
Else
dic.Add key, ""
End If
Next i
r = 2
For Each key In dupDic.Keys
Cells(r, 3).Value = key
r = r + 1
Next key
End Sub
・何ができるか
- 重複一覧の作成
- 元データからの重複抽出
- 別シートに重複リスト作成
- マスタ比較・異常値チェック
実務では非常に便利です。
【応用】複数列(商品コード+日付)の重複チェック
複合同一キーにして判定します。
key = Cells(i, 1).Value & "_" & Cells(i, 2).Value
・複数列重複が必要な実務例
- 商品コード × 店舗
- 顧客ID × 日付
- 社員ID × 勤務日
- 部門 × 商品名
ほぼ全ての業務データで使います。
【応用】重複行の位置を取得する(行番号収集)
dic(key) = dic(key) & "," & i
どの行が重複しているか可視化できます。
❗ Dictionary の注意点
- 文字列として扱うため、型の違いに注意
- 空白やNULLをどう扱うか決める必要あり
- 全角半角混在は Trim / StrConv で事前処理推奨
✅ 方法3:配列で高速に重複チェック(大量データ向け)
10,000行以上のデータや、RPA前処理には配列方式が最適です。
【サンプル④】配列+Dictionaryで重複チェック(高速)
Sub CheckDuplicate_Array()
Dim dic As Object
Dim arr, lastRow As Long
Dim i As Long, key As String
Set dic = CreateObject("Scripting.Dictionary")
arr = Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value
For i = 1 To UBound(arr)
key = CStr(arr(i, 1))
If dic.Exists(key) Then
Cells(i + 1, 1).Interior.Color = vbYellow
Else
dic.Add key, True
End If
Next i
End Sub
・配列版のメリット
- とにかく速い
- VBA の最速に近い方法
- RPA(UiPath/PAD)と相性が良い
❗ 実務での“よくある重複チェックの失敗例”
・失敗①:目視では重複しているのに判定されない
→ 全角/半角、空白、改行の混在
・失敗②:“00123” と “123” が違うはずなのに同じ扱い
→ 商品コード・社員番号で注意
・失敗③:日付の“見た目”と“内部値”が違う
→ CDate で統一する必要
・失敗④:RemoveDuplicates と判定ロジックが食い違う
→ Excelの仕様とVBAの仕様が違うため
読者がつまずきやすいポイントなので、丁寧に解説することで滞在時間が伸びます。
【実務向け】重複チェックしてから削除・抽出へ進む流れ
- 重複しているか確認
- 重複行だけ抽出
- 重複件数を確認
- 必要に応じて削除・まとめ
このステップで実務のミスを防げます。
【実務テンプレート】1列の重複チェックを汎用関数化する
Function HasDuplicate(rng As Range) As Boolean
Dim dic As Object, arr, i As Long, key As String
Set dic = CreateObject("Scripting.Dictionary")
arr = rng.Value
For i = 1 To UBound(arr)
key = CStr(arr(i, 1))
If dic.Exists(key) Then
HasDuplicate = True
Exit Function
Else
dic.Add key, ""
End If
Next i
End Function
「重複があれば True」
「なければ False」
となり、任意処理と組み合わせ可能です。
【実務テンプレート】重複項目を一覧化する関数
Function GetDuplicateList(rng As Range) As Object
Dim dic As Object, dupDic As Object
Dim arr, i As Long, key As String
Set dic = CreateObject("Scripting.Dictionary")
Set dupDic = CreateObject("Scripting.Dictionary")
arr = rng.Value
For i = 1 To UBound(arr)
key = CStr(arr(i, 1))
If dic.Exists(key) Then
dupDic(key) = ""
Else
dic.Add key, ""
End If
Next i
Set GetDuplicateList = dupDic
End Function
この関数を使えば、
- リスト化
- 抽出
- 件数確認
が簡単にできます。
🧠 ChatGPT 生成コードでの重複チェック注意点
ChatGPT が生成するコードは便利ですが、よくある問題として:
- Variant のまま比較して誤判定
- 空白や改行の前処理がない
- 複数列対応になっていない
- 型変換(CStr/CDate)が不十分
読者に「AIコードの改善方法」を提示することで、高品質の記事になります。
🧠 RPA(UiPath / Power Automate)との連携で重複チェックは必須
RPA の Excel 操作では「重複チェック」を外部で行う方が安定します。
- 大量データの判定をVBAで前処理
- 重複一覧だけ RPA に渡す
- マスタ化の事前検証に利用
VBA × RPA の組み合わせは実務で非常に強力です。
【実務例】重複チェックの活用シーン
・顧客マスタの不正重複検知
・売上データの重複チェック
・勤怠データのミス入力防止
・商品コードの整合性チェック
・RPA用データの前処理
・システム登録前の検証処理
チェックのみの処理はミスが少なく、安全性も高いです。
【補足】複数列の重複チェックは“組み合わせキー”で対応
例:商品コード × 店舗
key = Cells(i, "A").Value & "|" & Cells(i, "B").Value
- 区切り文字「|」や「_」を使う
- Trim / CStr / StrConv で整形すると正確
複数列での判定は実務で必須です。
【応用】日付の重複チェックは CDate が重要
key = CDate(Cells(i, 1).Value)
見た目が同じでも内部値が異なる場合があるため注意が必要です。
【応用】重複チェック後に色付け+コメント付与
Cells(i, 1).AddComment "重複しています"
Excel で可視化するとユーザーに喜ばれます。
【応用】重複回数のカウント
dic(key) = dic(key) + 1
1列の重複件数を集計できます。
【応用】シート間の重複比較
Sheet1 と Sheet2 の ID が重複しているか確認する用途も多いです。
【応用】エラー値(#N/A)を含む場合のチェック
Variantのまま比較すると誤判定する可能性があります。
❗ 実務での事前整形(前処理)が最も重要
重複チェックの精度を上げるための下処理:
- Trim(前後空白除去)
- Replace(改行削除)
- StrConv(全角半角の統一)
- CStr、CDate(型統一)
特に顧客マスタ・商品コードで必須です。
🟩 重複チェックは「削除」「抽出」「まとめる」処理の前提
重複処理の全体像は次の通りです:
- 重複チェック(今回)
- 重複データの抽出
- 重複件数のカウント
- 重複削除
- 重複まとめ(合計、最新日付)
シリーズ記事として構成できるため、SEO と滞在時間が大幅に向上します。
✅ まとめ:VBAでの重複チェックは実務で最も重要なデータ整備技術のひとつ
この記事で解説したポイントを整理します。
- COUNTIF・Dictionary・配列の3つの方法が基本
- COUNTIF は簡単だが大量データには非向き
- Dictionary は高精度・高速で最も実務向け
- 配列版は速度重視の大量データ向け
- 文字列変換・空白・全角/半角の前処理が重要
- 複数列は組み合わせキーで対応
- RPA・ChatGPTと組み合わせると業務効率化が大幅向上
- 重複チェックは削除・抽出・集計の前段階として必須
Excel VBA の重複チェックができるようになると、
データ品質が向上し、業務の自動化・標準化が一気に進みます。