Excelでデータを扱う場面において、「同じ顧客が複数行存在し、最新の取引日だけを残したい」「社員の勤怠記録から最終出社日を一覧化したい」など、重複を排除しつつ、特定の条件で最新情報だけを抽出したいというニーズは非常に多くあります。
このような処理を正しく行うには、単に「重複の削除」をするだけでは不十分で、最新の日付を条件として「最も新しい1件」を残すという処理が必要です。
この記事では、「重複削除+最新日付だけを残す」処理をExcelで実現する方法を、以下の3つのアプローチで詳しく解説します。
関数(MAXIFS / FILTERなど)
Power Queryによる自動化
VBAによる一括処理
目次
どのような場面で役立つのか?
以下のような実務シーンで非常に重宝される処理です。
シーン | 内容 |
---|---|
顧客の最新購入履歴抽出 | 同一顧客の中で最も新しい注文日だけを残す |
勤怠管理 | 社員ごとの最終出勤日を一覧化 |
システムログ集計 | ユーザーごとの最新ログイン履歴を取得 |
サンプルデータと目的
まず、以下のような表があるとします:
氏名 | 日付 | ステータス |
---|---|---|
山田 | 2024/04/01 | 出勤 |
佐藤 | 2024/04/02 | 出勤 |
山田 | 2024/04/05 | 有給 |
佐藤 | 2024/04/01 | 欠勤 |
この中から、「名前ごとに最新の日付のレコードだけを残す」というのが目的です。
【Excel】重複削除を正しく行う方法|関数・フィルター・Power Queryを使いこなす実践ガイド
✅ 関数で最新レコードだけを抽出する方法(Excel 365対応)
使用関数:FILTER + MAXIFS
=FILTER(A2:C5, B2:B5 = MAXIFS(B2:B5, A2:A5, A2:A5))
この式は、A列(氏名)が同じ中で、B列(日付)が最大(最新)である行だけを抽出します。
注意点
Excel 365 / Excel 2021 以降で対応
名前の並び順が関係するため、ソートをしておくとより確実です
同名で同一日付のデータが複数あれば、すべて返されます(最新が重複している場合)
【Excel】削除せずに最新データだけを別シートへ出力する方法|関数・Power Query・VBAによる自動抽出テクニック
✅ Power Queryで「重複削除+最新日付」処理を自動化する方法
Power Queryを使えば、ノーコードで再利用可能な最新抽出処理が可能です。
手順
データを範囲選択 →「データ」タブ →「テーブルまたは範囲から」
Power Queryエディタが開く
「ホーム」タブ →「並べ替え」で「日付」を降順にソート
「名前」列を選択 →「上位の行を保持」→「グループごとに1件保持」
「閉じて読み込む」で出力
メリット
自動更新に対応(元データが更新されてもワンクリックで再処理)
複数条件(例:部署×社員)でも処理可能
繰り返し処理に強い
【Excel】重複を色付けして視覚的にわかりやすくする方法|条件付き書式・関数・応用設定まで徹底解説
✅ VBAで一括処理する方法(高度な業務自動化)
Excel VBAを使えば、大量のデータに対して高速に処理できます。
サンプルコード(氏名ごとに最新日付のレコードだけを残す)
Sub 最新日付のみ抽出()
Dim dict As Object
Dim lastRow As Long, i As Long
Dim name As String, dateVal As Date
Dim ws As Worksheet, resultWs As Worksheet
Dim outRow As Long
Set dict = CreateObject("Scripting.Dictionary")
Set ws = ActiveSheet
Set resultWs = Worksheets.Add
resultWs.Name = "最新レコード"
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
outRow = 2
' データスキャン
For i = 2 To lastRow
name = ws.Cells(i, 1).Value
dateVal = ws.Cells(i, 2).Value
If Not dict.exists(name) Then
dict.Add name, i
Else
If ws.Cells(dict(name), 2).Value < dateVal Then
dict(name) = i
End If
End If
Next i
' ヘッダーコピー
ws.Range("A1:C1").Copy resultWs.Range("A1")
' 最新行だけを転記
For Each name In dict.Keys
ws.Range("A" & dict(name) & ":C" & dict(name)).Copy resultWs.Range("A" & outRow)
outRow = outRow + 1
Next name
MsgBox "最新日付のみ抽出が完了しました。", vbInformation
End Sub
特徴
任意のシートを対象にできる
日付が最新の行だけを新しいシートにコピー
1000件以上のデータでも数秒で処理可能
・実務でありがちな「落とし穴」と対策
落とし穴 | 対策方法 |
---|---|
日付の形式が文字列になっている | セルの書式を「日付」に統一 |
同じ名前で同一日付の行が複数ある場合 | FILTER関数やVBAでは全件残る。Power Queryで1件指定が有効 |
スペース違いなどで「別名」と判定される | TRIM関数やCLEAN関数で前処理を行う |
・ 重複削除と最新レコード抽出の違い
処理内容 | 結果 |
---|---|
単純な重複削除(同一行) | 同じ内容の行は1件だけ残す(完全一致のみ) |
重複キー+最新日付のレコード抽出 | 指定キー(例:氏名)で最新の日付行を1件残す |
・まとめ:重複削除+最新日付抽出をマスターすればExcel処理の幅が大きく広がる!
Excelでの「重複削除+最新日付だけを残す」処理は、単なるデータ整理にとどまらず、最新情報の抽出・履歴の管理・営業活動の効率化など、さまざまな実務に活用できます。
方法 | 特徴 |
---|---|
関数(MAXIFS/FILTER) | Excel 365以降向け。関数のみで完結。 |
Power Query | 再利用可能な自動処理に最適。複数条件にも強い。 |
VBAマクロ | 高速かつ大量データ向け。手動操作も最小限に抑えられる |
ぜひ目的や利用環境に応じて最適な方法を選び、Excelの可能性を最大限に活用してみてください!