VBAで重複チェック&フィールドの値を自動修正する方法を徹底解説!

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を活用してみてください。
業務効率が格段にアップします!

タイトルとURLをコピーしました