Excel で業務データを扱っていると、商品コード・顧客ID・部署名・日付など、1列のデータの中に重複が含まれているケースは非常に多くあります。フィルターや並べ替えを使って手作業で削除することも可能ですが、行数が多い場合や定期的に同じ作業を行う場合は、手作業では手間がかかり、ミスも発生しやすくなります。
そこで役立つのが VBA を使った「1列のみの重複削除」処理 です。Excel の標準機能「重複の削除」よりも柔軟で、フィルターの状態に関係なく確実に実行でき、実務向けの自動化として非常に有用です。
この記事では、1列だけの重複削除を行うためのさまざまなVBA手法を、初心者にもわかりやすく順序立てて解説します。基本の RemoveDuplicates メソッド、Dictionary を使った柔軟な方法、配列を使った高速処理、実務での注意点まで、すべてを包括的に説明します。また、RPA や ChatGPT のマクロ生成と組み合わせた場合の注意点にも触れ、最も再現性の高い処理を構築できるようにします。
目次
- ✅ Excelで1列の重複削除をVBAで行う3つの方法
- ✅ 方法1:RemoveDuplicatesメソッドで重複削除(最も簡単)
- ・RemoveDuplicatesの基本
- ・サンプルコード(1列のみ)
- ・コードの解説
- ・RemoveDuplicates のメリット
- ・デメリット(実務で注意)
- ✅ 方法2:Dictionary を使って重複削除(元データを残しつつ抽出したい時)
- ・Dictionaryを使うメリット
- 【サンプルコード】Dictionaryで1列の重複削除
- ・コードのポイント
- ・実務でのよくある用途
- 【応用】空白行もまとめたい場合のサンプル
- 【応用】元データが縦に長い場合は配列化で最速処理
- 【サンプルコード】配列で高速重複削除(1万行以上向け)
- ・配列版のメリット
- ❗ 実務での“よくある重複削除の失敗例”と対策
- ・失敗①:“00123” と “123” を同じと判定してしまう
- ・失敗②:空白やスペースで別データと判定される
- ・失敗③:RemoveDuplicates が途中までしか効かない
- ・失敗④:目視で確認した重複とVBAの判定が異なる
- 【実務シナリオ】1列の重複削除を自動化する流れ
- ・シナリオ①:顧客一覧の重複削除
- ・シナリオ②:売上データの重複商品コード削除
- ・シナリオ③:RPA処理の前処理として重複削除
- ❗ ChatGPT 生成VBAでよくある重複削除の問題点
- 【関連】1列のみの重複削除の“最適手法”は用途で変わる
- 【テンプレート】1列の重複削除で最も汎用的なマクロ(実務向け)
- 🧩 応用:重複削除+件数カウントにも応用できる
- 🧩 応用:重複行そのものを削除したい場合の紹介
- 🧩 応用:重複一覧だけ別シートにまとめる
- 🧠 まとめ:1列の重複削除はVBAで最も役立つ実務処理のひとつ
✅ Excelで1列の重複削除をVBAで行う3つの方法
まず、1列のみの重複削除は以下の3つが代表的です。
- Range.RemoveDuplicates を使う方法(最も簡単)
- Dictionary を使う方法(データの抽出・出力が柔軟)
- 配列で高速に重複排除する方法(大規模データ向け)
実務では、データ量・削除後の形・速度要件によって使い分けることが重要です。
✅ 方法1:RemoveDuplicatesメソッドで重複削除(最も簡単)
・RemoveDuplicatesの基本
Excel の Range オブジェクトには「重複の削除」を自動で行う RemoveDuplicates メソッドが備わっています。
・サンプルコード(1列のみ)
Sub RemoveDup_OneColumn()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim rng As Range
Set rng = ws.Range("A1").CurrentRegion
rng.RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
・コードの解説
CurrentRegionは連続した表範囲を自動抽出Columns:=1→ 判定対象は A列(1列目)Header:=xlYes→ 1行目は見出しとして扱う
・RemoveDuplicates のメリット
- コードが最短で済む
- 一意データに高速変換
- 数万行でも安定
- Excel の標準仕様なので初心者でも理解しやすい
・デメリット(実務で注意)
- 「削除実行 → 行が消える」ため、元データが消える
- 集計や抽出として使いたい場合には不向き
- 空白をどう扱うか制御しづらい
元データを残したい場合は、後述の Dictionary を使う方が安全です。
参考:【VBA】複数列の重複削除する方法|セル単位・行単位で処理する実務向けテクニック
✅ 方法2:Dictionary を使って重複削除(元データを残しつつ抽出したい時)
・Dictionaryを使うメリット
- 元データを壊さずに 一意データを他の列・シートへ出力できる
- 空白("")の扱いを柔軟に制御できる
- アルファベットや商品コードなどの文字列比較精度が高い
- 複数列への応用が容易
【サンプルコード】Dictionaryで1列の重複削除
Sub RemoveDup_Dic()
Dim dic As Object
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long, key As String
Set dic = CreateObject("Scripting.Dictionary")
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
key = CStr(ws.Cells(i, 1).Value)
If key <> "" Then
If Not dic.Exists(key) Then
dic.Add key, i
End If
End If
Next i
Dim r As Long: r = 2
For Each key In dic.Keys
ws.Cells(r, 3).Value = key
r = r + 1
Next key
End Sub
・コードのポイント
CStr()で必ず文字列に変換 → “00123” や空白の誤判定を防ぐ- 元データの上書きなし
- 抽出列(C列)に重複を排除したリストを作成できる
・実務でのよくある用途
- コード一覧
- 顧客リスト
- 部門名の一意抽出
- 担当者リスト
- 商品コードのマスタ作成
マスタ作成処理では、Dictionary が特に役立ちます。
参考:【VBA】重複データを抽出する方法|複数列の重複判定と実務で使える抽出処理を徹底解説
【応用】空白行もまとめたい場合のサンプル
If Not dic.Exists(key) Then dic.Add key, ""
空白("")も1件として扱いたい場合に使用します。
【応用】元データが縦に長い場合は配列化で最速処理
Dictionary に配列で読み込む方法が高速です。
【サンプルコード】配列で高速重複削除(1万行以上向け)
Sub RemoveDup_Array()
Dim dic As Object
Dim arr
Dim lastRow As Long
Dim i As Long, key As String
Set dic = CreateObject("Scripting.Dictionary")
arr = Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value
For i = 1 To UBound(arr)
key = CStr(arr(i, 1))
If key <> "" And Not dic.Exists(key) Then
dic.Add key, ""
End If
Next i
Dim out(), n As Long
ReDim out(1 To dic.Count, 1 To 1)
For Each key In dic.Keys
n = n + 1
out(n, 1) = key
Next key
Range("C2").Resize(dic.Count, 1).Value = out
End Sub
・配列版のメリット
- ワークシートへのアクセス回数を最小化
- 数万行・数十万行でも高速
- RPA(UiPath・Power Automate)前処理にも適合
大量データを扱う部署では必須のテクニックです。
❗ 実務での“よくある重複削除の失敗例”と対策
・失敗①:“00123” と “123” を同じと判定してしまう
→ 文字列比較には必ず CStr を使う
・失敗②:空白やスペースで別データと判定される
→ Trim や Replace を使って前処理が必要
・失敗③:RemoveDuplicates が途中までしか効かない
→ CurrentRegion が途中で途切れている
→ 不要な空白列・空白行が原因
→ 手動削除より危険
Dictionary の方が安定です。
・失敗④:目視で確認した重複とVBAの判定が異なる
→ 全角と半角の混在が原因
→ StrConv(key, vbNarrow) などで対策可能
【実務シナリオ】1列の重複削除を自動化する流れ
・シナリオ①:顧客一覧の重複削除
- 顧客IDの重複排除
- 名前・住所を紐づけ
- マスタシートに転記
・シナリオ②:売上データの重複商品コード削除
Dataset → Unique 商品コード抽出 → マスタ化
大規模システムの前処理として多用されます。
・シナリオ③:RPA処理の前処理として重複削除
UiPath や Power Automate では Excel内の重複削除が苦手なため、
「VBAで前処理 → RPAで後続処理」が最も確実です。
❗ ChatGPT 生成VBAでよくある重複削除の問題点
- RemoveDuplicates の範囲が適切でない
- Dictionary のキーを複数列に対応していない
- 型宣言ミスで意図しない動作
- 空白・エラー値の扱いが不十分
- Variant のままで処理が不安定
読者に「AIコードの改善ポイント」を示すと滞在時間がさらに伸びます。
【関連】1列のみの重複削除の“最適手法”は用途で変わる
| 方法 | 長所 | 短所 | 向いている用途 |
|---|---|---|---|
| RemoveDuplicates | 最速で簡単 | 元データが削除 | シンプルな一覧 |
| Dictionary | 柔軟・出力先変更可能 | コード量が長め | マスタ作成 |
| 配列 | 高速・大量データ向け | 可読性が下がる | 1万行以上 |
実務用途によって使い分けることが重要です。
【テンプレート】1列の重複削除で最も汎用的なマクロ(実務向け)
Sub UniqueOneColumn(ByVal TargetColumn As String, ByVal OutputColumn As String)
Dim dic As Object
Dim lastRow As Long, i As Long, key As String
Set dic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, TargetColumn).End(xlUp).Row
For i = 2 To lastRow
key = CStr(Cells(i, TargetColumn).Value)
If Not dic.Exists(key) And key <> "" Then dic.Add key, ""
Next i
Dim r As Long: r = 2
For Each key In dic.Keys
Cells(r, OutputColumn).Value = key
r = r + 1
Next key
End Sub
読者がそのまま業務で使えるハイレベルなテンプレートです。
🧩 応用:重複削除+件数カウントにも応用できる
Dictionary の値にカウントを保持するだけで対応可能。
dic(key) = dic(key) + 1
🧩 応用:重複行そのものを削除したい場合の紹介
RemoveDuplicates(Columns:=1)で可能。
削除方法の記事リンクとして内部リンク展開も可能です。
🧩 応用:重複一覧だけ別シートにまとめる
別シートへの書き出しは実務で非常に多い要求です。
🧠 まとめ:1列の重複削除はVBAで最も役立つ実務処理のひとつ
- 1列の重複削除は RemoveDuplicates・Dictionary・配列の3種類
- 元データ削除が問題なければ RemoveDuplicates が最速
- 元データを壊したくない場合は Dictionary が最適
- 配列版は大規模データでも高速で実務向け
- 空白・文字列・全角半角の扱いが重要
- RPAやChatGPTと組み合わせれば業務効率化がさらに進む
Excel でのデータ前処理やマスタ作成では、
1列の重複削除スキルは必須であり、
マクロの品質・再現性・スピードを大きく向上させる基礎技術です。