トップ > 汎用コード > 重複データを検索する

重複データ検索2010.06.09    更新:2026.04.22

選択セル範囲内の重複データを検索し、色を付けるマクロです。選択範囲が複数ある場合にも対応しており、最大20色まで色分けします。
セル範囲を選択し、マクロ「highlightDuplicateCells」を実行します。


【お薦め】Excelの作業効率を高める80以上の様々な機能を凝縮した無料のExcelアドイン
 nExTools(ネクスツールズ)アドイン

サンプルコード

コードの貼り付け場所   VBAコードをカラーで印刷・Web掲載するためのツールはこちら

'***************************************************************
'* 選択セル範囲の重複データのセルを色分けする
'*--------------------------------------------------------------
'* 概要     | 選択セル範囲内の重複データを検索し色を付ける
'*          | 選択範囲が複数ある場合にも対応し20色まで色分けする
'*          | 参考:https://excel.syogyoumujou.com/vba/overlap.html
'* 引数     | なし
'* 戻り値   | なし
'* 作成日   | 2010.06.09
'*--------------------------------------------------------------
'* 改修履歴 | 2026.04.22
'***************************************************************
Public Sub highlightDuplicateCells()
On Error GoTo LBL_ERROR

    '------------------------------
    ' セル選択確認
    '------------------------------
    If TypeName(Application.Selection) <> "Range" Then
        MsgBox "セル範囲を選択してください", vbExclamation + vbOKOnly
        Exit Sub
    End If

    '------------------------------
    ' シートの保護確認
    '------------------------------
    If ActiveSheet.ProtectContents Then
        MsgBox "シートの保護を解除してください", vbExclamation + vbOKOnly
        Exit Sub
    End If

    '------------------------------
    ' セル範囲を集合
    '------------------------------
    ' セル範囲を複数選択している場合はセルを集合する
    Dim rngArea   As Range
    Dim rngTarget As Range
    For Each rngArea In Selection.Areas
        If rngTarget Is Nothing Then
            Set rngTarget = rngArea
        Else
            Set rngTarget = Union(rngArea, rngTarget)
        End If
    Next rngArea

    '------------------------------
    ' 重複値とセルアドレスを取得
    '------------------------------
    Dim dicDup As Object
    '《セル範囲の重複値とセルアドレスを Dictionary で取得》
    ' ** 引数:対象セル範囲
    '  戻り値:重複値とセルアドレスが登録された Dictionary オブジェクト
    Set dicDup = getDuplicateValuesAsDictionary(rngTarget)

    If dicDup.Count = 0 Then
        MsgBox "重複データはありません。", vbInformation
        Exit Sub
    End If

    '------------------------------
    ' 重複セルに色設定
    '------------------------------
    Dim lngCount   As Long
    Dim varKey     As Variant
    Dim varSplit   As Variant
    Dim varAddress As Variant

    For Each varKey In dicDup
        If 200 < Len(dicDup.Item(varKey)) Then
            ' セルアドレスの文字数が200文字を超えている場合はアドレスを分割し色付け
            varSplit = Split(dicDup.Item(varKey), ",")
            For Each varAddress In varSplit
                Range(varAddress).Interior.ColorIndex = (lngCount Mod 20) + 34
            Next varAddress
        Else
            ' 対象セルアドレスに一括色付け
            Range(dicDup.Item(varKey)).Interior.ColorIndex = (lngCount Mod 20) + 34
        End If
        lngCount = lngCount + 1
    Next varKey
    Exit Sub

'------------------------------
' エラー処理
'------------------------------
LBL_ERROR:
    MsgBox "エラー番号:" & Err.Number & vbLf & Err.Description, vbExclamation
End Sub

'*************************************************************** '* セル範囲の重複値とセルアドレスをDictionaryで返す '*-------------------------------------------------------------- '* 概要 | 指定したセル範囲の重複した値とセルアドレスを '* | Dictionaryオブジェクトで返す '* | 参考:https://excel.syogyoumujou.com/vba/overlap.html '* 引数 | 1) pRngTarget:対象セル範囲(ByRef) '* 戻り値 | Object型(Dictionaryオブジェクト) '* | 成功 :Key :重複値 '* | Item:セルアドレス '* | (例:A1,B2,D4) '* | エラー:Nothing '* 作成者 | S.Kubo '* 作成日 | 2024.04.12 '*-------------------------------------------------------------- '* 改修履歴 | 2026.04.22 '*************************************************************** Public Function getDuplicateValuesAsDictionary(ByRef pRngTarget As Range) As Object On Error GoTo LBL_ERROR '------------------------------ ' Dictionaryオブジェクトを生成 '------------------------------ Dim dic As Object Dim dicDup As Object Set dic = CreateObject("Scripting.Dictionary") Set dicDup = CreateObject("Scripting.Dictionary") '------------------------------ ' 対象セル範囲を適正化 '------------------------------ ' シートの使用セル範囲と対象セルの共通セルを取得 Set pRngTarget = Intersect(pRngTarget.Worksheet.UsedRange, pRngTarget) If pRngTarget Is Nothing Then Exit Function '------------------------------ ' 重複値とセルアドレスを取得 '------------------------------ Dim rng As Range Dim var As Variant Dim strAddress As String For Each rng In pRngTarget ' セル値を変数に代入(エラー値の場合は表示テキストを代入) If IsError(rng) Then var = rng.Text Else var = rng.Value If Not IsEmpty(var) Then ' 値がEmpty以外の場合 If Not dic.Exists(var) Then ' dic に値が未登録の場合は dic に値とセルアドレスを登録 dic.Add var, rng.Address(False, False) Else ' dic に値が登録されている場合はその値は重複値のため dicDup に登録 If Not dicDup.Exists(var) Then ' dicDup に値が未登録の場合は値とセルアドレスを登録 dicDup.Add var, dic.Item(var) & "," & rng.Address(False, False) Else ' dicDup に値が登録されている場合はセルアドレスを追加 strAddress = dicDup(var) dicDup(var) = strAddress & "," & rng.Address(False, False) End If End If End If Next rng ' 重複値の登録がない場合は抜ける If dicDup.Count = 0 Then Exit Function '------------------------------ ' 戻り値設定 '------------------------------ Set getDuplicateValuesAsDictionary = dicDup Exit Function '------------------------------ ' エラー処理 '------------------------------ LBL_ERROR: Set getDuplicateValuesAsDictionary = Nothing End Function

データが多い場合には時間を要します。
この処理は nExTools(ネクスツールズ)アドイン に機能として追加していますので、よければ活用ください。



ページトップへ戻る

Excel 汎用コード

Copyright(C) 2009- 坂江 保 All Rights Reserved.