Excel VBA 逆引き集 | 重複をマーク

Excel VBA
スポンサーリンク

重複をマーク

「重複している値を見つけて、セルにマークを付けたい」——削除はせず、まず“見える化”するテンプレです。初心者でも安心して使えるように、色付けやコメント追加などの方法をかみ砕いて説明します。


基本の考え方

  • 対象列: どの列を基準に重複判定するか決める(例:A列のコード)。
  • マーク方法: セルの背景色を塗る/コメントを付ける/別列に「重複」と書く。
  • 安全策: 元データは消さない。まずは「見える化」だけ。

共通ユーティリティ(速度・正規化)

Option Explicit

Private Sub SpeedOn()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
End Sub

Private Sub SpeedOff()
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

Private Function NormKey(ByVal v As Variant) As String
    NormKey = UCase$(Trim$(CStr(v)))
End Function
VB
  • SpeedOn/Off: 画面更新や計算を止めて高速化。
  • NormKey: 空白や大小文字の違いで誤判定しないように正規化。

テンプレ1:重複セルを色でマーク(単一列)

A列の重複を黄色で塗ります。

Sub MarkDuplicates_Color()
    SpeedOn
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i As Long, k As String

    '一旦色をクリア
    ws.Range("A2:A" & lastRow).Interior.ColorIndex = xlNone

    For i = 2 To lastRow
        k = NormKey(ws.Cells(i, "A").Value)
        If Len(k) = 0 Then GoTo cont
        If dict.Exists(k) Then
            ws.Cells(i, "A").Interior.Color = vbYellow
            ws.Cells(dict(k), "A").Interior.Color = vbYellow
        Else
            dict(k) = i
        End If
cont:
    Next
    SpeedOff
    MsgBox "重複セルを黄色でマークしました。"
End Sub
VB
  • ポイント: 初回と2回目以降両方塗ると「重複箇所」が一目で分かる。

テンプレ2:重複セルにコメントを付ける

A列の重複セルに「重複あり」とコメントを付けます。

Sub MarkDuplicates_Comment()
    SpeedOn
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i As Long, k As String

    '既存コメント削除
    ws.Range("A2:A" & lastRow).ClearComments

    For i = 2 To lastRow
        k = NormKey(ws.Cells(i, "A").Value)
        If Len(k) = 0 Then GoTo cont
        If dict.Exists(k) Then
            ws.Cells(i, "A").AddComment "重複あり"
            ws.Cells(dict(k), "A").AddComment "重複あり"
        Else
            dict(k) = i
        End If
cont:
    Next
    SpeedOff
    MsgBox "重複セルにコメントを付けました。"
End Sub
VB
  • ポイント: コメントなら色を変えずに「重複」を伝えられる。

テンプレ3:別列に「重複」と書く

A列の重複を判定し、B列に「重複」と表示します。

Sub MarkDuplicates_FlagColumn()
    SpeedOn
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i As Long, k As String

    ws.Range("B2:B" & lastRow).ClearContents

    For i = 2 To lastRow
        k = NormKey(ws.Cells(i, "A").Value)
        If Len(k) = 0 Then GoTo cont
        If dict.Exists(k) Then
            ws.Cells(i, "B").Value = "重複"
            ws.Cells(dict(k), "B").Value = "重複"
        Else
            dict(k) = i
        End If
cont:
    Next
    SpeedOff
    MsgBox "重複セルをB列にマークしました。"
End Sub
VB
  • ポイント: 色やコメントが苦手な人でも「文字」で分かりやすい。

複合キー版:コード×日付で重複マーク

A列(コード)とB列(日付)の組み合わせで重複を判定し、色でマーク。

Private Function BuildKey2(ByVal v1 As Variant, ByVal v2 As Variant) As String
    Dim p2 As String
    If IsDate(v2) Then p2 = Format$(CDate(v2), "yyyy-mm-dd") Else p2 = CStr(v2)
    BuildKey2 = NormKey(v1) & "|" & UCase$(Trim$(p2))
End Function

Sub MarkDuplicates_Composite()
    SpeedOn
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i As Long, key As String

    ws.Range("A2:B" & lastRow).Interior.ColorIndex = xlNone

    For i = 2 To lastRow
        key = BuildKey2(ws.Cells(i, "A").Value, ws.Cells(i, "B").Value)
        If Len(key) = 0 Then GoTo cont
        If dict.Exists(key) Then
            ws.Range("A" & i & ":B" & i).Interior.Color = vbYellow
            ws.Range("A" & dict(key) & ":B" & dict(key)).Interior.Color = vbYellow
        Else
            dict(key) = i
        End If
cont:
    Next
    SpeedOff
    MsgBox "複合キーの重複を黄色でマークしました。"
End Sub
VB

例題で練習

'例1:A列の重複を黄色でマーク
Sub Example_Color()
    MarkDuplicates_Color
End Sub

'例2:A列の重複にコメントを付ける
Sub Example_Comment()
    MarkDuplicates_Comment
End Sub

'例3:A列の重複をB列に「重複」と書く
Sub Example_Flag()
    MarkDuplicates_FlagColumn
End Sub

'例4:コード×日付の複合キーで重複をマーク
Sub Example_Composite()
    MarkDuplicates_Composite
End Sub
VB

初心者向けポイント

  • まずは見える化: 削除よりも「マーク」から始めると安心。
  • 方法を選べる: 色/コメント/別列フラグ、好みに合わせて。
  • 複合キー: 実務では「コード×日付」など複数列で判定することが多い。

実務の落とし穴と対策

  • 表記揺れで誤判定: NormKeyでTrim+大文字化。必要なら半角化も。
  • 日付の文字列/数値混在: Format(“yyyy-mm-dd”)で統一。
  • 大量行で遅い: 配列+辞書+SpeedOn/Offで高速化。
  • いきなり削除は危険: まずマーク→確認→削除の2段階運用が安全。
タイトルとURLをコピーしました