Excelで業務データを扱っていると、「重複しているデータのうち最新のものだけ残したい」という場面が非常に多くあります。例えば次のような状況です。
- 最新の売上データだけ残したい
- 顧客ごとの“最新購入日”の行だけを残したい
- 社員IDごとに最新の勤怠データだけ抽出したい
- 商品コード × 店舗 × 日付 の組み合わせで最新情報だけに整理したい
日付が最も新しい行だけを残したい、というニーズはほぼすべての業務で発生します。
Excel標準の「重複の削除」機能では 最新日付を基準に残す といった柔軟な処理はできず、完全な手動操作に頼らざるを得ません。
しかしこれは人に依存するとミスが発生しやすく、大量データではなおさら危険です。
そこで効果を発揮するのが VBAを使った“最新データだけ残す重複削除処理” です。
この記事では、
- 最新データを残すための考え方
- 1列・複数列の重複で最新行を残すロジック
- Dictionaryを使った高速処理
- 大量データ向けの配列処理
- 実務で起きる失敗例と対策
までを含め、“今日からそのまま使える”レベルで徹底解説します。
目次
- ✅ 最新データだけ残す重複削除とは?実務では“必須”のデータ整形
- ・最新日付をキーに重複データの取捨選択を行う処理
- ・Excel標準機能では最新データを残す仕組みはない
- ・VBAなら完全自動化・安全・高速
- ✅ 最新データを残す処理の基本ロジック(最重要)
- ① 複合キーを作る(例:商品コード × 店舗)
- ② Dictionaryにキーを保持する
- ③ 日付を比較し、最新の行を採用する
- ④ 削除は下から行う(行番号ズレ防止)
- ✅ 最新日付を残す重複削除(1条件)の基本コード
- ・最も基本的なパターン(A列 = コード、B列 = 日付)
- ・解説(ここが重要)
- ✅ 最新データだけ残す(複数条件:商品 × 店舗 × 日付)
- ・複数列を結合して複合キーを作る
- 【サンプル】複数条件で最新データを残す(A列×B列×C列)
- ・実務で多いパターン
- ✅ RemoveDuplicatesにはできない“最新データのみ残す処理”
- ❗ 最新日付判定でよく起きるエラーと原因(実務で非常に多い)
- ・原因1:日付が文字列扱いになっている
- ・原因2:空白セルでエラー
- ・原因3:シリアル値のまま比較して誤削除
- ・原因4:全角スペースや改行混入
- ・原因5:"2024/1/5" と "2024/01/05" が別判定
- ・原因6:結合キーに空白が混ざると別キー扱い
- 🧠 高速化のための“配列アプローチ”も紹介
- 【サンプル】配列+Dictionaryで最新データだけ残す(高速版)
- 🧠 実務例:最新データだけ残したいときの具体的な用途
- 🧠 RPA(UiPath / Power Automate)との相性が抜群
- 🧠 ChatGPTと組み合わせて効率化できるポイント
- ✅ まとめ:VBAで最新データだけ残す重複削除は実務で最強レベルの自動化技術
✅ 最新データだけ残す重複削除とは?実務では“必須”のデータ整形
・最新日付をキーに重複データの取捨選択を行う処理
例えば次のような表があったとします。
| 商品コード | 日付 | 数量 |
|---|---|---|
| A001 | 2024/01/01 | 5 |
| A001 | 2024/02/01 | 7 ← 最新なので残す |
| A001 | 2024/01/15 | 3 |
| A002 | 2024/01/03 | 10 |
この場合、「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自動化の幅が大きく広がり、業務でのデータ処理品質が一気に向上します。