VBAで自動化 VBA一覧 配列・データ操作 重複処理

【VBA】重複チェックの方法|1列・複数列・高速判定まで実務で役立つ完全ガイド

Excel の実務では「重複が存在しているかどうか」を判定する“重複チェック”が非常に重要です。データ入力や大量データの取り込み、売上データや顧客情報の整備など、あらゆる場面で重複を検知してミスを防ぐことが求められます。

Excel の標準機能にも「重複の削除」や「条件付き書式で重複色付け」が用意されていますが、手動作業では不安定で、定期処理や大量データでは限界があります。そこで役立つのが VBA による 重複チェックの自動化 です。

VBA なら、

  • 存在チェック
  • 重複一覧の抽出
  • 重複場所の特定
  • 複数列条件での重複判定
  • 重複行の色付け
  • 重複時のエラー表示
    など、幅広いロジックを柔軟に組み立てられます。

この記事では、初心者でも確実に理解できるように、最も実務で使う重複チェック手法を体系的に解説し、1列・複数列・Dictionary・配列処理まで全ての基礎と応用を“完全網羅”します。

目次

✅ 重複チェックとは?重複を削除する前に必須の“判定処理”のこと

・重複チェックは「削除」とは別の処理

Excel の標準機能「重複の削除」は“削除”であり、“チェック”ではありません。

重複チェックとは、
・重複があるかどうか
・どの行が重複しているか
・重複項目だけ抽出する
・重複回数をカウントする
などの判定処理を指します。

削除ではなく“確認する”目的で使うため、安全性が高く、実務向けです。


✅ VBAで重複チェックを行う主な方法(3大アプローチ)

重複チェックは次の3種類が代表です。

  1. WorksheetFunction.CountIf を使う方法(最も簡単)
  2. Dictionary を使う方法(重複行・重複一覧の取得が簡単)
  3. 配列を使った高速重複チェック(大量データ向け)

それぞれ用途やメリットが異なるため、実務での使い分けが重要です。

参考:【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. 重複しているか確認
  2. 重複行だけ抽出
  3. 重複件数を確認
  4. 必要に応じて削除・まとめ

このステップで実務のミスを防げます。


【実務テンプレート】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(型統一)

特に顧客マスタ・商品コードで必須です。


🟩 重複チェックは「削除」「抽出」「まとめる」処理の前提

重複処理の全体像は次の通りです:

  1. 重複チェック(今回)
  2. 重複データの抽出
  3. 重複件数のカウント
  4. 重複削除
  5. 重複まとめ(合計、最新日付)

シリーズ記事として構成できるため、SEO と滞在時間が大幅に向上します。


✅ まとめ:VBAでの重複チェックは実務で最も重要なデータ整備技術のひとつ

この記事で解説したポイントを整理します。

  • COUNTIF・Dictionary・配列の3つの方法が基本
  • COUNTIF は簡単だが大量データには非向き
  • Dictionary は高精度・高速で最も実務向け
  • 配列版は速度重視の大量データ向け
  • 文字列変換・空白・全角/半角の前処理が重要
  • 複数列は組み合わせキーで対応
  • RPA・ChatGPTと組み合わせると業務効率化が大幅向上
  • 重複チェックは削除・抽出・集計の前段階として必須

Excel VBA の重複チェックができるようになると、
データ品質が向上し、業務の自動化・標準化が一気に進みます。

    -VBAで自動化, VBA一覧, 配列・データ操作, 重複処理