VBA代码修改求助:按F列批量去重并忽略指定工作表
修复后的VBA代码:批量删除指定工作表外的重复项
先来说下你原代码出现运行时错误1004的大概率原因:你固定了Range("$A$1:$Q$1000"),如果某个工作表里的实际数据范围没到这个区域(比如是空表、数据行数不足1000行),或者这个区域被保护/不存在,就会触发这个错误。另外原代码也没做忽略指定工作表的逻辑,现在我帮你把这两个问题都解决了:
Sub RemoveDuplicates() Dim Current As Worksheet Dim starting_ws As Worksheet Dim ignoredSheets As Variant Dim dataRange As Range ' 定义需要忽略的工作表名称,多个用逗号分隔,自己按需修改 ignoredSheets = Array("忽略表1", "汇总表", "模板表") Set starting_ws = ActiveSheet ' 记录初始激活的工作表 For Each Current In ThisWorkbook.Worksheets ' 检查当前工作表是否在忽略列表里,是的话跳过 If IsError(Application.Match(Current.Name, ignoredSheets, 0)) Then On Error Resume Next ' 临时捕获错误,避免空表导致的问题 Set dataRange = Current.UsedRange ' 获取工作表实际使用的区域 On Error GoTo 0 ' 恢复错误捕获 ' 确保数据区域存在且有数据(至少有表头) If Not dataRange Is Nothing And dataRange.Rows.Count > 1 Then ' 直接操作工作表,无需Activate,更稳定 dataRange.RemoveDuplicates Columns:=6, Header:=xlYes End If End If Next starting_ws.Activate ' 回到初始激活的工作表 End Sub
关键改进点说明:
- 忽略指定工作表:通过
ignoredSheets数组定义要跳过的表名,你只需要修改数组里的内容即可; - 避免固定区域错误:用
UsedRange获取每个工作表的实际使用范围,不会因为固定行数/列数导致不存在区域的错误; - 容错处理:加入了空表判断和临时错误捕获,防止空表或异常表导致代码中断;
- 更稳定的对象操作:去掉了
Activate和ActiveSheet的依赖,直接通过Current工作表对象操作,减少因切换工作表导致的意外错误。
如果需要调整忽略的工作表,直接修改ignoredSheets = Array(...)里的名称就行,注意表名要和实际工作表名称完全一致(区分大小写)。
内容的提问来源于stack exchange,提问作者din2345
相关产品推荐
相关产品推荐

