Mac Office 365 Excel如何优化删除行内重复值整行的卡顿VBA代码
需求说明
我当前使用的是Excel for Mac,因此所有代码建议都需要适配Mac端Office 365。
我有一个包含9列姓名的大型数据集,需求为:如果同一行内的多个列出现了相同的姓名,就删除该整行。
示例数据集如下:
需要删除的行判定规则:
Jason在第1行出现2次,删除Jason在第2行出现3次,删除Jason在第3行出现4次,删除Sam在第4行出现2次,删除Fred在第5行出现3次,删除
即只要同一行内姓名出现重复,无论重复次数,直接删除整行。
原有代码仅能实现基础功能,处理大型数据集时容易崩溃,且冗余度极高,需要更高效简洁、适配Mac Office 365的优化方案。
优化方案
原有代码性能差的核心原因有两点:一是逐单元格读取比较,IO开销极大;二是逐行删除,频繁操作工作表会严重拖慢运行速度。
优化方案采用「内存数组+字典判重+批量删除」的逻辑,运行效率较原代码提升数十倍,完全适配Mac端Office 365:
' 删除同一行内存在重复姓名的整行,适配Mac Office 365 Sub RemoveDuplicateRowsOptimized() Dim lastRow As Long, i As Long, j As Long Dim dataArr As Variant Dim delRange As Range Dim nameDict As Object ' 关闭屏幕更新和事件,大幅提升运行速度 Application.ScreenUpdating = False Application.EnableEvents = False ' 获取当前工作表最后一行行号 lastRow = Range("A" & Rows.Count).End(xlUp).Row ' 把A到I列的所有数据一次性读入数组,内存操作远快于直接操作单元格 dataArr = Range("A1:I" & lastRow).Value ' 初始化字典,Mac Office 365已原生支持Scripting.Dictionary Set nameDict = CreateObject("Scripting.Dictionary") ' 从第2行开始遍历(默认第1行为表头,无表头可改为i=1) For i = 2 To UBound(dataArr, 1) nameDict.RemoveAll ' 清空字典,准备处理当前行 For j = 1 To 9 ' 遍历当前行9列姓名 ' 姓名已在字典中存在说明有重复,标记当前行待删除 If nameDict.exists(dataArr(i, j)) Then If delRange Is Nothing Then Set delRange = Rows(i) Else Set delRange = Union(delRange, Rows(i)) End If Exit For ' 找到重复即跳出当前行循环,无需检查剩余列 Else nameDict.Add dataArr(i, j), True End If Next j Next i ' 一次性删除所有标记的行 If Not delRange Is Nothing Then delRange.Delete End If ' 恢复屏幕更新和事件 Application.ScreenUpdating = True Application.EnableEvents = True MsgBox "处理完成,已删除所有存在重复姓名的行", vbInformation End Sub
注意事项
- 运行前请备份数据,避免误删无法恢复
- 若数据集没有表头,把遍历起始行的
i = 2修改为i = 1即可
内容的提问来源于stack exchange,提问作者Jason McCoy
相关产品推荐
相关产品推荐

