重複をマーク
「重複している値を見つけて、セルにマークを付けたい」——削除はせず、まず“見える化”するテンプレです。初心者でも安心して使えるように、色付けやコメント追加などの方法をかみ砕いて説明します。
基本の考え方
- 対象列: どの列を基準に重複判定するか決める(例: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段階運用が安全。
