Excelでデータを扱っていると、「値だけ重複している行を削除したい」という場面が非常に多くあります。特に商品コード一覧、顧客ID一覧、部署コード一覧のように「1列の値だけをユニークにしたい」という処理は、日常業務のほとんどで発生します。しかし、Excel標準機能では余分な書式が残っていたり、大量データでは操作が重かったりと、必ずしも安定した結果になりません。
そのため、実務では VBAで“値だけを基準に重複削除する”処理を自動化する ことが非常に効果的です。1列のみの重複で行ごと削除したい、複数列ではなく値の重複だけを見たい、書式は無視して値だけ比較したい、といったニーズに確実に応えることができます。
この記事では、
- 値のみを基準に重複削除する考え方
- RemoveDuplicatesの使い方
- Dictionaryを使った手動削除の方法
- 値の比較でよくあるトラブルの原因
- 大量データでの高速化のポイント
- 実務の失敗例と注意点
など、現場でそのまま使えるテクニックを丁寧に解説します。
目次
- ✅ VBAで“値だけ”を基準に重複削除する仕組みとは?
- ・値が重複している行だけ削除し、最初の1件だけを残す処理
- ・Excel標準機能でも重複削除は可能だが弱点がある
- ・VBAなら値のみの重複判定を高速・安定・正確に行える
- ✅ RemoveDuplicatesで値だけ重複削除する【最も簡単な方法】
- ・A列の値のみ基準で重複削除(行は上から残す)
- ・RemoveDuplicatesの弱点(実務でよく問題になる点)
- ✅ Dictionaryを使って手動で重複削除する方法(安全・高速)
- ・行削除は必ず「下から」行うこと
- 【サンプルコード】値のみ基準で重複行を削除(安全版)
- ✅ 空白をどう扱うか?重複判定で最も多いトラブル
- ・空白を無視したい場合
- ・空白は削除対象にしたい場合
- ✅ 複数列は見ず「値だけ」で重複削除したい場合(実務で多い)
- ・A列だけ比較(B列・C列は無視)
- ✅ 高速版:配列に読み込んで重複チェックする方法
- 【サンプル】配列×Dictionaryで高速重複排除
- ✅ 実務でよくある場面:値だけ重複削除の活用例
- ・商品コード一覧の重複を整理
- ・顧客IDのリスト作成
- ・部署コード一覧
- ・マスタ作成時の一意リスト
- ・RPAの前処理
- 🧠 値だけ重複削除するときの“実務NG例”
- ・文字列ゆれを無視して比較すると誤判定
- ・型が混在していると別値扱いになる
- ・先頭に全角スペースが混入しているケース
- 🧠 ChatGPTに重複削除マクロを作らせるコツ
- 🧠 RPAとの併用:重複削除は“事前整形”として最適
- 🧠 必要であれば派生記事も作成可能
- ✅ まとめ:値だけ重複削除するVBAは実務で最も使われるデータ整形処理
✅ VBAで“値だけ”を基準に重複削除する仕組みとは?
・値が重複している行だけ削除し、最初の1件だけを残す処理
たとえば次のような表があるとします。
| A列(商品コード) |
|---|
| A001 |
| A002 |
| A001 ← 重複 |
| A003 |
| A002 ← 重複 |
「A001」「A002」はそれぞれ1件だけ残し、残りは削除したいわけです。
・Excel標準機能でも重複削除は可能だが弱点がある
Excelの「重複の削除」は便利ですが、
- 書式が残ってしまう
- 大量データではフリーズしやすい
- 関数が入っていると意図しない動作が起きる
- 別シートに残したい場合の処理が面倒
といった課題があります。
特に10万行を超えるデータだと、
操作が遅い・固まる・完了まで数分かかる
という問題が頻発します。
・VBAなら値のみの重複判定を高速・安定・正確に行える
VBAを使えば
- A列の値だけ比較して重複削除
- 書式を無視して値のみ判断
- 行削除を下から実施し安全
- 配列化で高速
という実務的な処理を完全自動化できます。
また、RemoveDuplicatesでは実現できない細かい制御も可能です。
✅ RemoveDuplicatesで値だけ重複削除する【最も簡単な方法】
・A列の値のみ基準で重複削除(行は上から残す)
Sub RemoveDup_OnValue()
Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
End Sub
・ポイント解説
Columns:=1で「A列の値だけ比較」- 最初に見つかった値を残し、以降の重複を削除
- 見出しがある場合は
Header:=xlYes - CurrentRegionを使うと表を丸ごと処理できる
シンプルな処理ならこれで十分です。
・RemoveDuplicatesの弱点(実務でよく問題になる点)
- 値だけではなく書式もまとめて削除される可能性
- 空白セルを重複として扱うため意図しない削除が起きる
- 関数が入っていると戻せなくなる
- 元に戻す(Undo)ができない
大量データでは速度面も不安が残ります。
そういった場面では、次に紹介する Dictionary を使った重複削除 が非常に有効です。
参考:【VBA】型変換(CInt/CLng/CStr/CDate)の使い分けと注意点|実務のデータ処理
✅ Dictionaryを使って手動で重複削除する方法(安全・高速)
・行削除は必ず「下から」行うこと
上から削除すると行番号がずれ、誤削除の原因になるため
For i = lastRow To 2 Step -1
が必須です。
【サンプルコード】値のみ基準で重複行を削除(安全版)
Sub DeleteDuplicateByValue()
Dim dic As Object
Dim lastRow As Long
Dim i As Long
Dim key As String
Set dic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
For i = lastRow To 2 Step -1
key = CStr(Trim(Cells(i, 1).Value))
If dic.Exists(key) Then
Rows(i).Delete
Else
dic.Add key, True
End If
Next i
End Sub
・ポイント解説
- Dictionaryが値の存在チェックに最適
- Trimで文字列のゆれ(空白混入)を除去
- CStrで型を統一し比較のブレを防止
- Trueを入れて存在だけ管理し軽量化
- 安全のため行は下から削除
大量データでも非常に高速に動作し、RemoveDuplicatesより安定しています。
参考:【VBA】シート全体のスペースを削除する方法:Trim 関数・Replace 関数
✅ 空白をどう扱うか?重複判定で最も多いトラブル
値の重複判定で最も多いミスが「空白セルの扱い」です。
ExcelのRemoveDuplicatesだと
- 空白も重複扱い
- 最初の1件だけ残り、残りの空白が削除される
という動作になります。
しかし実務上は、
- 空白は削除したくない
- 空白は無視したい
- 空白行は残すが重複行だけ消したい
といったケースが多いです。
・空白を無視したい場合
If key = "" Then GoTo Skip
・空白は削除対象にしたい場合
If dic.Exists(key) Then Rows(i).Delete
空白をどう扱うかで処理が変わるため、
コードには必ずコメントを書いておくとよいです。
✅ 複数列は見ず「値だけ」で重複削除したい場合(実務で多い)
たとえば、
- A列:商品コード
- B列:商品名
- C列:カテゴリ
があったとして、
「商品コード(A列)だけを基準に行削除したい」
という状況です。
・A列だけ比較(B列・C列は無視)
If dic.Exists(Cells(i, 1).Value) Then
RemoveDuplicatesでも Columns:=1 を指定すれば可能ですが、
Dictionary のほうが安全性が高く、調整も簡単です。
✅ 高速版:配列に読み込んで重複チェックする方法
大量データ(10万行以上)では配列化が最速です。
【サンプル】配列×Dictionaryで高速重複排除
Sub DeleteDuplicateByValue_Array()
Dim dic As Object
Dim arr, i As Long
Dim lastRow As Long
Dim key As String
Set dic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A2:A" & lastRow).Value
For i = UBound(arr, 1) To 1 Step -1
key = CStr(arr(i, 1))
If dic.Exists(key) Then
Rows(i + 1).Delete
Else
dic.Add key, True
End If
Next i
End Sub
配列は行番号がずれないため、
誤削除が減り、大規模データでも高速です。
✅ 実務でよくある場面:値だけ重複削除の活用例
・商品コード一覧の重複を整理
コードだけ見て重複を削除したい場面は非常に多いです。
・顧客IDのリスト作成
顧客管理システムから出力した一覧は重複が多いため、必須の前処理です。
・部署コード一覧
企業のマスタデータは重複しがち。
・マスタ作成時の一意リスト
大量の取引データからコードだけ抽出するときに重宝します。
・RPAの前処理
UiPathやPower Automateで処理速度を上げるために、VBAで重複削除してから渡すのが鉄板です。
参考:【VBA】RemoveDuplicatesの使い方|複数列の重複削除を自動化する実務向け
🧠 値だけ重複削除するときの“実務NG例”
・文字列ゆれを無視して比較すると誤判定
例:
"A001 "(後ろにスペース)
"A001"
→ 違うものとして扱われてしまう
Trim必須です。
・型が混在していると別値扱いになる
例:
1
"1"
この場合、RemoveDuplicatesでは同じ扱いになりますが、Dictionary比較では異なる場合があるため、CStrで統一するのが安全です。
・先頭に全角スペースが混入しているケース
システム出力のデータでよく発生します。
Trimでは取れないため Replace を併用します。
CleanVal = Replace(Cells(i,1).Value, " ", "")
🧠 ChatGPTに重複削除マクロを作らせるコツ
ChatGPTにコードを作らせる際は、
- 値のみ比較したい
- TrimとCStrで型統一したい
- 行削除は下から
- Dictionaryで高速処理
と明確に指示すると、より完成度の高いコードが返ります。
🧠 RPAとの併用:重複削除は“事前整形”として最適
UiPath や Power Automate は大量行のExcel処理が非常に重くなりがちです。
そのため、
- まずVBAで重複削除(データ量圧縮)
- 小さくなったデータをRPAに渡す
という流れが最も効率的です。
この処理だけで RPA の実行時間が 1/3 以下になります。
🧠 必要であれば派生記事も作成可能
- VBA 重複削除 複数列
- VBA RemoveDuplicates の使い方
- VBA 最新データだけ残す重複削除
- VBA 空白除外で重複削除
- VBA 一意データを別シートへ抽出
など、関連シリーズも制作できます。
✅ まとめ:値だけ重複削除するVBAは実務で最も使われるデータ整形処理
この記事の重要ポイントをまとめます。
- 値のみ比較して重複削除するにはRemoveDuplicatesかDictionaryを使う
- Dictionaryを使うと文字列ゆれ・空白トラブルを防げる
- 行削除は必ず下から行い誤削除を防止
- 型の混在はCStrで統一して比較の安定性アップ
- 空白セルは扱い方を明記しておかないとトラブルの元
- 大量データでは配列アプローチが最速
- RPA前処理として使うと処理速度が大幅向上
値だけ重複削除する処理は、どんな企業のどんな部署でも必要とされる重要な技術です。
一度VBAで自動化しておくだけで、日々の作業時間が大幅に削減されます。