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

【VBA】重複削除で“最新データだけ残す”方法|複数条件にも対応できる実務最強テクニック

Excelで業務データを扱っていると、「重複しているデータのうち最新のものだけ残したい」という場面が非常に多くあります。例えば次のような状況です。

  • 最新の売上データだけ残したい
  • 顧客ごとの“最新購入日”の行だけを残したい
  • 社員IDごとに最新の勤怠データだけ抽出したい
  • 商品コード × 店舗 × 日付 の組み合わせで最新情報だけに整理したい

日付が最も新しい行だけを残したい、というニーズはほぼすべての業務で発生します。

Excel標準の「重複の削除」機能では 最新日付を基準に残す といった柔軟な処理はできず、完全な手動操作に頼らざるを得ません。
しかしこれは人に依存するとミスが発生しやすく、大量データではなおさら危険です。

そこで効果を発揮するのが VBAを使った“最新データだけ残す重複削除処理” です。

この記事では、

  • 最新データを残すための考え方
  • 1列・複数列の重複で最新行を残すロジック
  • Dictionaryを使った高速処理
  • 大量データ向けの配列処理
  • 実務で起きる失敗例と対策
    までを含め、“今日からそのまま使える”レベルで徹底解説します。

目次

✅ 最新データだけ残す重複削除とは?実務では“必須”のデータ整形

・最新日付をキーに重複データの取捨選択を行う処理

例えば次のような表があったとします。

商品コード日付数量
A0012024/01/015
A0012024/02/017 ← 最新なので残す
A0012024/01/153
A0022024/01/0310

この場合、「A001」に関しては最新の日付「2024/02/01」の行だけを残し、
それ以外は削除する必要があります。


・Excel標準機能では最新データを残す仕組みはない

Excelの「重複の削除」は

  • 最初の1件を残し、残りを削除する機能
    であり、「最新の1件」を残す機能ではありません。

日付順に並べてから手動で削除することもできますが、

  • 並べ替え忘れ
  • 他列による誤並べ替え
  • 行が大量で操作が重い
  • シート構造が変わると再現性がなくなる

など、ミスにつながる原因が多いです。


・VBAなら完全自動化・安全・高速

VBAを使えば、

  • 商品コードごとに最新日付行を残す
  • 社員IDごとに最新勤務記録を残す
  • 顧客ID × 店舗 × 日付 の複合条件で最新行を残す

など、実務に対応した複雑な処理が 確実に再現可能 です。


✅ 最新データを残す処理の基本ロジック(最重要)

最新データを残すために必要な考え方は次のとおりです。


① 複合キーを作る(例:商品コード × 店舗)

key = code & "|" & shop

② Dictionaryにキーを保持する

If dic.Exists(key) Then
    'すでに同じコードのデータがある

③ 日付を比較し、最新の行を採用する

If currentDate > dic(key) Then
    '最新データなら古い行を削除し、新しい行を採用

④ 削除は下から行う(行番号ズレ防止)


この流れを理解しておけば、どんな複数条件でも応用できます。


✅ 最新日付を残す重複削除(1条件)の基本コード

・最も基本的なパターン(A列 = コード、B列 = 日付)

Sub DeleteKeepLatest_OneColumn()
    Dim dic As Object
    Dim lastRow As Long
    Dim i As Long
    Dim key As String
    Dim dt As Date
    
    Set dic = CreateObject("Scripting.Dictionary")
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    For i = lastRow To 2 Step -1
        
        key = CStr(Cells(i, 1).Value)
        dt = CDate(Cells(i, 2).Value)
        
        If dic.Exists(key) Then
            If dt <= dic(key) Then
                Rows(i).Delete
            Else
                Rows(dic(key & "_row")).Delete
                dic(key) = dt
                dic(key & "_row") = i
            End If
        Else
            dic.Add key, dt
            dic.Add key & "_row", i
        End If
    Next i
End Sub

・解説(ここが重要)

  • Dictionary で「最新日付」と「行番号」を保持
  • dt <= dic(key) の場合は古いデータ → 削除
  • dt > dic(key) の場合は最新データが見つかる → 古い行を削除
  • 削除順序は下から(行ズレ防止)
  • CDateで日付型に変換し比較を安定化

実務で最も使われる安全なロジックです。

参考:【VBA】日付を判定する方法:IsDate・VarType・DateValue・CDate


✅ 最新データだけ残す(複数条件:商品 × 店舗 × 日付)

・複数列を結合して複合キーを作る

key = CStr(A列) & "|" & CStr(B列)

これで商品コード × 店舗コードの組み合わせごとに最新日付を取得できます。


【サンプル】複数条件で最新データを残す(A列×B列×C列)

Sub DeleteKeepLatest_MultiColumn()
    Dim dic As Object
    Dim lastRow As Long
    Dim i As Long
    Dim key As String
    Dim dt As Date
    
    Set dic = CreateObject("Scripting.Dictionary")
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = lastRow To 2 Step -1
        
        key = CStr(Cells(i, 1).Value) _
            & "|" & CStr(Cells(i, 2).Value)
        
        dt = CDate(Cells(i, 3).Value)
        
        If dic.Exists(key) Then
            
            If dt <= dic(key) Then
                Rows(i).Delete
            Else
                Rows(dic(key & "_row")).Delete
                dic(key) = dt
                dic(key & "_row") = i
            End If
            
        Else
            dic.Add key, dt
            dic.Add key & "_row", i
        End If
    Next i
End Sub

・実務で多いパターン

  • 商品コード × 店舗 × 日付
  • 顧客ID × 購入チャネル × 日付
  • 社員ID × 事業所 × 勤務日

どんな複数条件でも簡単に応用できます。

参考:【VBA】If文の複数条件をリストで判定する方法|効率的な条件分岐の書き方と応用




✅ RemoveDuplicatesにはできない“最新データのみ残す処理”

Excel内部の RemoveDuplicates は
「上から残す」仕組みのため、最新データを残す用途には 不適合 です。

VBAで最新だけ残すことにより、

  • 並べ替え不要
  • シート構造の変化に対応
  • 一括処理で手動作業ゼロ
  • 大量データでも高速

というメリットが得られます。


❗ 最新日付判定でよく起きるエラーと原因(実務で非常に多い)

・原因1:日付が文字列扱いになっている

対策 → CDateで必ず日付型に変換する


・原因2:空白セルでエラー

対策 → IsDateでチェック

If Not IsDate(Cells(i, 3).Value) Then

・原因3:シリアル値のまま比較して誤削除

対策 → CDateで型統一


・原因4:全角スペースや改行混入

対策 → Trim / Replace を併用


・原因5:"2024/1/5" と "2024/01/05" が別判定

対策 → CDateで統一することで防止


・原因6:結合キーに空白が混ざると別キー扱い

対策 → 全列に Trim を使う

CStr(Trim(Cells(i,1).Value))

🧠 高速化のための“配列アプローチ”も紹介

10万行などの大量データでは、
「配列に読み込んで処理 → 必要な行だけ書き戻す」
方法が最速です。


【サンプル】配列+Dictionaryで最新データだけ残す(高速版)

Sub DeleteKeepLatest_Array()
    Dim dic As Object
    Dim arr, i As Long
    Dim lastRow As Long
    Dim key As String, dt As Date
    
    Set dic = CreateObject("Scripting.Dictionary")
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    arr = Range("A2:C" & lastRow).Value
    
    For i = 1 To UBound(arr)
        
        key = CStr(arr(i, 1)) & "|" & CStr(arr(i, 2))
        dt = CDate(arr(i, 3))
        
        If dic.Exists(key) Then
            If dt > dic(key) Then dic(key) = dt
        Else
            dic.Add key, dt
        End If
    Next i
End Sub

抽出後の行削除処理は別途必要ですが、
大規模データでは最も速い方法です。


🧠 実務例:最新データだけ残したいときの具体的な用途

・顧客データ整理(最新の連絡先情報を残す)
・売上データの更新(最新売上のみ抽出)
・勤怠データ(最新の勤怠修正を残す)
・マスタデータの更新(上書き更新として使う)
・CSVデータの突き合わせ(最新記録だけ残す)

現場では「最新だけ残す」要件は必ず発生します。


🧠 RPA(UiPath / Power Automate)との相性が抜群

RPAではExcel重複データを扱うと処理が非常に遅くなるため、
RPA前処理としてVBAで最新行だけ残す
と格段に高速化します。

  • データ量が減る
  • 後続処理の安定性向上
  • 入力ミスの検出が簡単
  • メモリ使用量が大幅に削減

現場では“VBAで重複削除 → RPAで処理”が鉄板の流れです。


🧠 ChatGPTと組み合わせて効率化できるポイント

ChatGPTに

  • 複数列
  • 最新日付
  • 削除は下から
  • CDate必須
  • Trimを使う

と指示するだけで、安定したコードが生成できます。
この記事に書いた知識を前提にプロンプトを作ると、はるかに高品質なコードが生成されます。


✅ まとめ:VBAで最新データだけ残す重複削除は実務で最強レベルの自動化技術

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

  • 最新データだけ残すには「複合キー×日付比較」が必須
  • RemoveDuplicatesでは実現できない
  • Dictionaryは一意性チェック・最新判定に最適
  • 削除は必ず下から行う
  • 日付はCDateで型統一しないと誤判定する
  • 空白・文字列・書式ゆれはTrimで整形
  • 複数条件でも結合キーで簡単に対応可能
  • 大量データでは配列を使うと高速化
  • RPA・ChatGPTと組み合わせると業務効率は最大化

最新行だけ残す仕組みが作れるようになると、VBAによるExcel自動化の幅が大きく広がり、業務でのデータ処理品質が一気に向上します。

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