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

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

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


【お薦め】マクロ・プロシージャを管理する無料のツール!
 Excelマクロ管理ツール

サンプルコード

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

'------------------------------------------------------------------------------
' 選択セル範囲の重複データのセルを色分けするマクロ
'------------------------------------------------------------------------------
' 選択セル範囲内の重複データを検索し色を付けるマクロです。
' 選択範囲が複数ある場合にも対応しており20色まで色分けします。
'[掲載ページ]
' https://excel.syogyoumujou.com/vba/overlap.html
'[作成日]2010.06.09 [更新日]2024.04.13
'------------------------------------------------------------------------------
Sub setColorDuplicateCells()
    '------------------------------------------
    ' セルを選択しているか確認
    '------------------------------------------
    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
    
    '------------------------------------------
    ' 対象セル範囲の重複値とセルアドレスを取得
    '------------------------------------------
    Dim dicDup As Object
    Set dicDup = getDuplicateValuesAsDictionary(rngTarget)
    If dicDup.Count = 0 Then
        MsgBox "重複データはありません。", vbInformation + vbOKOnly
        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
        Else
            '対象セルアドレスに一括色付け
            Range(dicDup.Item(varKey)).Interior.ColorIndex = (lngCount Mod 20) + 34
        End If
        lngCount = lngCount + 1
    Next
End Sub

'------------------------------------------------------------------------------ ' 対象セル範囲の重複値とセルアドレスを取得する関数 '------------------------------------------------------------------------------ ' 引数に指定したセル範囲の重複した値とセルアドレスを取得 '[引数] ' rngTarget:対象セル範囲 '[戻り値] ' Dictionaryオブジェクト ' Key :重複値 ' Item:セルアドレス(Itemに設定されるセルアドレス例:A1,B2,D4) '[作成日]2024.04.12 '------------------------------------------------------------------------------ Function getDuplicateValuesAsDictionary(ByRef rngTarget As Range) As Object '-------------------------------------- ' 戻り値のDictionaryオブジェクトを生成 '-------------------------------------- Set getDuplicateValuesAsDictionary = CreateObject("Scripting.Dictionary") '-------------------------------------- ' 対象セル範囲を適正化 '-------------------------------------- ' シートの使用セル範囲と対象セルの共通セルを取得 Set rngTarget = Intersect(rngTarget.Worksheet.UsedRange, rngTarget) If rngTarget Is Nothing Then Exit Function '-------------------------------------- ' 重複値とセルアドレスを取得 '-------------------------------------- ' Dictionaryオブジェクトを生成 Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") Dim rng As Range Dim var As Variant Dim strAddress As String For Each rng In rngTarget ' セル値を変数に代入(エラー値の場合は表示テキストを代入) If IsError(rng) Then var = rng.Text Else var = rng.Value ' 値がEmpty以外の場合は重複確認対象 If Not IsEmpty(var) Then If Not dic.Exists(var) Then ' dicに値が未登録の場合は dicに値とセルアドレスを登録 dic.Add var, rng.Address(False, False) Else ' dicに値が登録されている場合は 重複値として 戻り値に値を設定 If Not getDuplicateValuesAsDictionary.Exists(var) Then ' 戻り値に値が未登録の場合は 戻り値に値とセルアドレスを登録 getDuplicateValuesAsDictionary.Add var, dic.Item(var) & "," & rng.Address(False, False) Else ' 戻り値に値が登録されている場合は 登録されていセルアドレスにセルアドレスを追加 strAddress = getDuplicateValuesAsDictionary.Item(var) getDuplicateValuesAsDictionary.Remove var getDuplicateValuesAsDictionary.Add var, strAddress & "," & rng.Address(False, False) End If End If End If Next End Function

データが膨大な場合、時間がかかります。
このコードを発展させた「重複するデータを検索」アドインは、データ担当者必須のお薦めアドインです。



ページトップへ戻る

Excel 汎用コード

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