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

调整Excel VBA宏:基于单列唯一标识符删除重复行

嘿,我来帮你搞定这个需求!你现有的宏已经能实现工作表间的复制粘贴,现在要加上基于B列唯一标识符删除重复行的功能对吧?我把修改后的完整宏代码写出来,再给你拆解说明每个部分的作用:

修改后的完整宏代码
Sub SummarySort()
    Dim sEnd As Long
    Dim wsSummary As Worksheet, wsPortfolio As Worksheet
    
    ' 定义工作表对象,避免频繁切换工作表(更高效稳定)
    Set wsSummary = ThisWorkbook.Sheets("Summary")
    Set wsPortfolio = ThisWorkbook.Sheets("Portfolio")
    
    ' 清空Summary表A2到E250的内容(如果要动态清空可看后面提示)
    wsSummary.Range("A2:E250").ClearContents
    
    ' 获取Portfolio表中B列数据的最后一行(从B5往下找)
    sEnd = wsPortfolio.Range("B5").End(xlDown).Row
    
    ' 复制Portfolio表B5到E列的内容,粘贴到Summary表A2开始的位置
    wsPortfolio.Range("B5:E" & sEnd).Copy wsSummary.Range("A2")
    
    ' 关键新增:基于B列删除重复行(这里指Summary表的B列,对应唯一标识符)
    Dim lastRowSummary As Long
    lastRowSummary = wsSummary.Range("B2").End(xlDown).Row
    wsSummary.Range("A2:E" & lastRowSummary).RemoveDuplicates Columns:=2, Header:=xlNo
    
    ' 如果你唯一标识符复制到了Summary的A列,把上面的Columns:=2改成Columns:=1就行
End Sub
代码细节说明
  • 我把原来的Select操作换成了工作表对象引用(wsSummary和wsPortfolio),这是VBA的最佳实践,避免因为用户手动切换工作表导致代码出错,运行也更快。
  • 复制数据的部分我根据你原代码的片段补全了,如果你实际要复制的列不是B到E,直接调整wsPortfolio.Range("B5:E" & sEnd)里的列范围就行。
  • 去重的核心是RemoveDuplicates方法:
    • Columns:=2指定基于第2列(也就是B列)判断重复,要是你的唯一标识符在其他列,改成对应数字就行(比如A列是1)。
    • Header:=xlNo是因为你的数据从A2开始,没有表头;如果粘贴的数据带表头,改成xlYes。
  • 我新增了lastRowSummary变量来获取Summary表数据的最后一行,确保去重范围刚好覆盖所有有效数据,不会包含空行。
额外小提示
  • 如果担心原来的A2:E250清空范围不够用,可以改成动态清空:
    If wsSummary.Range("A2").Value <> "" Then
        wsSummary.Range("A2:E" & wsSummary.Cells(wsSummary.Rows.Count, "A").End(xlUp).Row).ClearContents
    End If
    
    这样不管数据有多少行,都能精准清空。
  • 运行宏前记得备份数据哦,防止意外情况!

内容的提问来源于stack exchange,提问作者MCT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:31:37