You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel数据表去重:保留最新呼叫日期的账户记录

批量去重:保留账户最新呼叫日期的记录

问题背景

现有名为dt的Excel数据表,存储账户(Account)呼叫记录,要求账户记录唯一无重复。因录入操作失误,更新账户呼叫备注时未直接修改原记录,而是将含更新备注的整条记录复制到主表,导致账户记录重复。需实现:若账户存在重复条目,仅保留含最新呼叫日期的条目,删除其余重复项,实际数据量超10万条,手动删除不可行。已通过=COUNTIF(dt[Account],[@Account])识别重复账户,但无法完成符合要求的批量去重。

解决方案

针对10万+数据量,推荐以下两种高效批量去重方法:

方法1:Power Query(推荐,稳定高效)

Power Query对大数据量处理性能优异,步骤如下:

  1. 选中dt数据表的任意单元格,点击「数据」选项卡 → 「从表格/区域」(Excel 2016及以上版本支持),将数据导入Power Query编辑器。
  2. 点击「转换」选项卡 → 「分组依据」:
    • 分组列选择Account
    • 添加第一个聚合列:列名设为最新呼叫日期,操作选「最大值」,目标列选Calling date
    • 添加第二个聚合列:列名设为所有记录,操作选「所有行」
  3. 点击所有记录列右侧的展开箭头,选择「展开到新行」,展开该账户的全部记录。
  4. 添加自定义列,输入公式:= [Calling date] = [最新呼叫日期],标记每条记录是否为该账户的最新日期条目。
  5. 筛选自定义列,仅保留值为TRUE的行。
  6. 删除最新呼叫日期和自定义列,点击「主页」→ 「关闭并上载」,将处理后的数据导出到新工作表。

方法2:VBA代码(适合熟悉VBA的用户)

运行前务必备份原数据,避免数据丢失:

Sub RemoveDuplicatesKeepLatest()
    Dim ws As Worksheet
    Dim lastRow As Long, i As Long
    Dim accountDict As Object
    Dim maxDate As Date, currentDate As Date
    
    '替换为你的数据表所在工作表名称
    Set ws = ThisWorkbook.Worksheets("dt")
    '假设Account列在A列,按需修改列号
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    Set accountDict = CreateObject("Scripting.Dictionary")
    
    '第一步:遍历记录,存储每个账户的最新呼叫日期
    For i = 2 To lastRow '假设第一行是表头
        '假设Calling date列在B列,按需修改列号
        currentDate = IIf(IsEmpty(ws.Cells(i, "B").Value), DateSerial(1900, 1, 1), ws.Cells(i, "B").Value)
        accountKey = ws.Cells(i, "A").Value
        
        If accountDict.Exists(accountKey) Then
            If currentDate > accountDict(accountKey) Then
                accountDict(accountKey) = currentDate
            End If
        Else
            accountDict(accountKey) = currentDate
        End If
    Next i
    
    '第二步:从下往上遍历,删除非最新日期的重复记录
    For i = lastRow To 2 Step -1
        accountKey = ws.Cells(i, "A").Value
        currentDate = IIf(IsEmpty(ws.Cells(i, "B").Value), DateSerial(1900, 1, 1), ws.Cells(i, "B").Value)
        
        If currentDate < accountDict(accountKey) Then
            ws.Rows(i).Delete
        End If
    Next i
    
    Set accountDict = Nothing
    MsgBox "去重完成!"
End Sub

使用说明:

  • 按Alt+F11打开VBA编辑器,插入模块后粘贴代码。
  • 根据实际列位置修改代码中Account(A列)和Calling date(B列)的列号。
  • 代码已处理Calling date为空值的情况,将空值设为1900年1月1日,确保有有效日期的记录被保留。

注意事项

  • 若Calling date存在空值,Power Query会自动忽略空值,保留该账户下有日期的最新记录;VBA代码已内置空值处理逻辑。
  • 10万+数据量下,Power Query比VBA更稳定,不易出现内存溢出问题。

内容的提问来源于stack exchange,提问作者Syed Waqqas Uzair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:22:50