VBAで自動化 VBA一覧 配列・データ操作 重複処理

【VBA】値だけを基準に重複削除する方法|RemoveDuplicatesとDictionary

Excelでデータを扱っていると、「値だけ重複している行を削除したい」という場面が非常に多くあります。特に商品コード一覧、顧客ID一覧、部署コード一覧のように「1列の値だけをユニークにしたい」という処理は、日常業務のほとんどで発生します。しかし、Excel標準機能では余分な書式が残っていたり、大量データでは操作が重かったりと、必ずしも安定した結果になりません。

そのため、実務では VBAで“値だけを基準に重複削除する”処理を自動化する ことが非常に効果的です。1列のみの重複で行ごと削除したい、複数列ではなく値の重複だけを見たい、書式は無視して値だけ比較したい、といったニーズに確実に応えることができます。

この記事では、

  • 値のみを基準に重複削除する考え方
  • RemoveDuplicatesの使い方
  • Dictionaryを使った手動削除の方法
  • 値の比較でよくあるトラブルの原因
  • 大量データでの高速化のポイント
  • 実務の失敗例と注意点
    など、現場でそのまま使えるテクニックを丁寧に解説します。

目次

✅ 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処理が非常に重くなりがちです。

そのため、

  1. まずVBAで重複削除(データ量圧縮)
  2. 小さくなったデータをRPAに渡す

という流れが最も効率的です。

この処理だけで RPA の実行時間が 1/3 以下になります。


🧠 必要であれば派生記事も作成可能

  • VBA 重複削除 複数列
  • VBA RemoveDuplicates の使い方
  • VBA 最新データだけ残す重複削除
  • VBA 空白除外で重複削除
  • VBA 一意データを別シートへ抽出

など、関連シリーズも制作できます。


✅ まとめ:値だけ重複削除するVBAは実務で最も使われるデータ整形処理

この記事の重要ポイントをまとめます。

  • 値のみ比較して重複削除するにはRemoveDuplicatesかDictionaryを使う
  • Dictionaryを使うと文字列ゆれ・空白トラブルを防げる
  • 行削除は必ず下から行い誤削除を防止
  • 型の混在はCStrで統一して比較の安定性アップ
  • 空白セルは扱い方を明記しておかないとトラブルの元
  • 大量データでは配列アプローチが最速
  • RPA前処理として使うと処理速度が大幅向上

値だけ重複削除する処理は、どんな企業のどんな部署でも必要とされる重要な技術です。
一度VBAで自動化しておくだけで、日々の作業時間が大幅に削減されます。

    -VBAで自動化, VBA一覧, 配列・データ操作, 重複処理