使用Range.RemoveDuplicates方法时触发Run-time error '1004'错误的技术求助
解决Excel VBA去重时的Run-time Error 1004问题
我之前也碰到过这个RemoveDuplicates的1004错误,咱们一步步排查可能的问题,给你对应的修复方案:
首先先把你的代码贴出来方便参考:
Set shUpl = Sheets("Upload") Dim LR as Long LR = shUpl.Cells(Rows.Count, 1).End(xlUp).Row shUpl.Range("A1:O" & LR).RemoveDuplicates Columns:=Array(1, 2, 3, 5, 6, 7, 8, 9, 10), Header:=xlYes
1. 工作表引用的常见坑
最容易触发错误的就是Sheets("Upload")的引用问题:
- 可能工作表名称有空格、大小写不一致(比如实际是" Upload"带前置空格,或者"upload"小写);
- 或者工作表被隐藏、保护了,
RemoveDuplicates无法操作受保护的工作表; - 还有可能你误引用了其他打开的工作簿的工作表,而非当前工作簿。
修复方案:
- 改用工作表的
CodeName(在VBA编辑器的属性窗口里的(Name)字段,比如Sheet1,这个不会随工作表名称修改而变化),稳定性拉满:Set shUpl = Sheet1 ' 替换成你Upload工作表的CodeName - 如果工作表被保护,先解除保护再执行去重:
shUpl.Unprotect Password:="你的密码" ' 没有密码就去掉Password参数 ' 执行去重代码 shUpl.Protect Password:="你的密码" ' 执行完再保护回去
2. 范围计算的细节错误
你的LR计算可能存在隐性问题:Rows.Count默认引用当前活动工作表的行数,而非shUpl的,导致最后一行计算偏差;另外,去重范围内如果有合并单元格,RemoveDuplicates会直接报错(它完全不支持合并单元格)。
修复方案:
- 明确指定
shUpl的Rows来计算最后一行:LR = shUpl.Cells(shUpl.Rows.Count, 1).End(xlUp).Row - 先取消去重范围内的所有合并单元格:
shUpl.Range("A1:O" & LR).UnMerge
3. 被忽略的筛选状态干扰
如果你的工作表处于自动筛选状态,RemoveDuplicates也会抛出1004错误,这个点很容易被忽略。
修复方案:
执行去重前先取消筛选:
If shUpl.AutoFilterMode Then shUpl.AutoFilterMode = False
4. 列参数与表头的验证
虽然你的列数组Array(1,2,3,5,6,7,8,9,10)在A1:O的范围内(A对应1,O对应15),但还是要检查:
- 这些列是否有完全空的列?空列可能导致去重逻辑异常;
- 确认第一行确实是表头,
Header:=xlYes才有效,如果没有表头要改成Header:=xlNo。
修复后的完整代码
把上面的修复点整合起来,得到更稳健的代码:
Sub RemoveDuplicatesFixed() Dim shUpl As Worksheet Dim LR As Long ' 用CodeName引用工作表,避免名称变化的问题 Set shUpl = Sheet1 ' 替换成你的Upload工作表的CodeName ' 取消自动筛选(如果存在) If shUpl.AutoFilterMode Then shUpl.AutoFilterMode = False ' 取消合并单元格(如果有) shUpl.Range("A1:O" & shUpl.Cells(shUpl.Rows.Count, 1).End(xlUp).Row).UnMerge ' 正确计算数据最后一行 LR = shUpl.Cells(shUpl.Rows.Count, 1).End(xlUp).Row ' 执行去重 shUpl.Range("A1:O" & LR).RemoveDuplicates Columns:=Array(1, 2, 3, 5, 6, 7, 8, 9, 10), Header:=xlYes End Sub
内容的提问来源于stack exchange,提问作者user16016201
相关产品推荐
相关产品推荐

