Excelでデータ管理をしていると、同じ値が何度も入力される“重複”に悩まされることがあります。特に名簿や商品一覧、取引履歴などでは、重複データがあると集計ミスや二重登録の原因になります。この記事では、VBA(Visual Basic for Applications)を使って、重複データのチェックを自動化する方法、そして見つけた重複に対してフィールド(セル)の値を自動で修正するテクニックまで詳しく解説します。
「重複を見つけるだけでなく、どう直すか」までわかる実践的な内容となっています。VBA初心者の方でも理解できるよう丁寧に説明していますので、ぜひ参考にしてみてください。
VBAで重複チェックを行う基本の考え方
VBAで重複をチェックするためには、まず「どの範囲の、どの列に注目するか」を明確にする必要があります。たとえば「A列にある社員IDに重複があるかを確認する」といった形です。
以下は基本的な考え方です:
- 範囲を指定する(例:A2からA100まで)
- 各セルの値をコレクションやディクショナリに格納して、すでに存在するかをチェック
- 重複があれば、別の列に「重複」と表示する
この基本的な仕組みを元に、次の項目で実際のコードを見ていきましょう。
重複チェックの基本コード例
まずはシンプルに「A列の値が重複しているかどうか」を確認し、重複している場合は同じ行のB列に「重複」と表示するコードをご紹介します。
Sub CheckDuplicates()
Dim lastRow As Long
Dim dict As Object
Dim i As Long
Dim val As String
Set dict = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
val = Cells(i, 1).Value
If val <> "" Then
If dict.exists(val) Then
Cells(i, 2).Value = "重複"
Else
dict.Add val, True
Cells(i, 2).Value = ""
End If
End If
Next i
MsgBox "重複チェックが完了しました。"
End Sub
このコードを実行するだけで、A列の中で重複しているセルを判別し、B列に「重複」と表示できます。
重複の内容を自動的に修正するには?
重複をチェックするだけでなく、自動で修正したい場合もあります。たとえば、同じ名前のデータが複数ある場合に、2件目以降の名前に「_1」「_2」などの連番をつける方法です。
以下にそのような例を示します。
Sub FixDuplicates()
Dim lastRow As Long
Dim dict As Object
Dim i As Long
Dim val As String
Dim newVal As String
Dim count As Long
Set dict = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
val = Cells(i, 1).Value
If val <> "" Then
If dict.exists(val) Then
count = dict(val) + 1
dict(val) = count
newVal = val & "_" & count
Cells(i, 1).Value = newVal
Else
dict.Add val, 0
End If
End If
Next i
MsgBox "重複の修正が完了しました。"
End Sub
このコードでは、たとえば「田中」という名前が3件あった場合、それぞれ「田中」「田中_1」「田中_2」と自動的に変更されます。
編集対象のフィールドを指定する方法
上記の例ではA列固定ですが、より汎用的に使うために、編集対象のフィールド(列)を変数化すると便利です。たとえば、列番号をユーザーが選択できるようにしたり、シート構成が変わっても対応できるようにする工夫です。
以下は、列を指定できるバージョンのコードです:
Sub FixDuplicatesInColumn()
Dim targetCol As Long
Dim lastRow As Long
Dim dict As Object
Dim i As Long
Dim val As String
Dim newVal As String
Dim count As Long
targetCol = 1 ' A列 = 1、B列 = 2 として指定
Set dict = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, targetCol).End(xlUp).Row
For i = 2 To lastRow
val = Cells(i, targetCol).Value
If val <> "" Then
If dict.exists(val) Then
count = dict(val) + 1
dict(val) = count
newVal = val & "_" & count
Cells(i, targetCol).Value = newVal
Else
dict.Add val, 0
End If
End If
Next i
MsgBox "指定列の重複修正が完了しました。"
End Sub
targetCol
の値を変えるだけで、任意の列に対応できます。
よくあるミスとその対処法
1. 空白セルに対応していない
→ 条件に If val <> "" Then
を加えることで空白をスキップできます。
2. 元のデータを保持しておきたい
→ 修正する代わりに、新しい列に編集済みデータを出力しましょう。
vbaコピーする編集するCells(i, targetCol + 1).Value = newVal
まとめ:重複チェックから自動修正までVBAでスマートに処理
VBAを使えば、Excelでの重複データ処理を「チェックする」だけでなく、「自動的に修正する」ところまで一括で行うことができます。
本記事では以下のポイントを解説しました:
- 重複のチェック方法(ディクショナリを活用)
- 重複に対するラベル付けの方法
- 自動修正でフィールドに連番を追加するテクニック
- 編集対象フィールドを柔軟に指定する方法
繰り返しの作業やミスを減らし、データ管理の精度を高めるためにも、ぜひVBAを活用してみてください。
業務効率が格段にアップします!