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

【VBA】1列だけの重複削除を行う方法|最速で一意データに整理するテクニック

Excel で業務データを扱っていると、商品コード・顧客ID・部署名・日付など、1列のデータの中に重複が含まれているケースは非常に多くあります。フィルターや並べ替えを使って手作業で削除することも可能ですが、行数が多い場合や定期的に同じ作業を行う場合は、手作業では手間がかかり、ミスも発生しやすくなります。

そこで役立つのが VBA を使った「1列のみの重複削除」処理 です。Excel の標準機能「重複の削除」よりも柔軟で、フィルターの状態に関係なく確実に実行でき、実務向けの自動化として非常に有用です。

この記事では、1列だけの重複削除を行うためのさまざまなVBA手法を、初心者にもわかりやすく順序立てて解説します。基本の RemoveDuplicates メソッド、Dictionary を使った柔軟な方法、配列を使った高速処理、実務での注意点まで、すべてを包括的に説明します。また、RPA や ChatGPT のマクロ生成と組み合わせた場合の注意点にも触れ、最も再現性の高い処理を構築できるようにします。

目次

✅ Excelで1列の重複削除をVBAで行う3つの方法

まず、1列のみの重複削除は以下の3つが代表的です。

  1. Range.RemoveDuplicates を使う方法(最も簡単)
  2. Dictionary を使う方法(データの抽出・出力が柔軟)
  3. 配列で高速に重複排除する方法(大規模データ向け)

実務では、データ量・削除後の形・速度要件によって使い分けることが重要です。


✅ 方法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 を使う


・失敗②:空白やスペースで別データと判定される

TrimReplace を使って前処理が必要


・失敗③:RemoveDuplicates が途中までしか効かない

→ CurrentRegion が途中で途切れている
→ 不要な空白列・空白行が原因
→ 手動削除より危険

Dictionary の方が安定です。


・失敗④:目視で確認した重複とVBAの判定が異なる

→ 全角と半角の混在が原因
StrConv(key, vbNarrow) などで対策可能


【実務シナリオ】1列の重複削除を自動化する流れ

・シナリオ①:顧客一覧の重複削除

  1. 顧客IDの重複排除
  2. 名前・住所を紐づけ
  3. マスタシートに転記

・シナリオ②:売上データの重複商品コード削除

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列の重複削除スキルは必須であり、
マクロの品質・再現性・スピードを大きく向上させる基礎技術です。

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