将Not-Covered-Time表数据按T列0值复制时遇1004错误求助
问题分析与解决方案
原代码核心问题
- 依赖
ActiveSheet和Activate方法,对象引用不稳定,易触发1004错误 - 用
CountA结合End(xlDown/xlToRight)计算行列数,若数据区域存在空单元格,会导致范围计算偏差 - 未处理T列无值为"0"的行的场景,此时
SpecialCells(xlCellTypeVisible)会直接抛出1004错误 ShowAllData在无筛选状态下执行会报错
修正后的代码
Sub CopyZeroRows() Dim sourceWs As Worksheet Dim targetWs As Worksheet Dim dataRange As Range Dim filteredRange As Range ' 直接指定源工作表,避免依赖ActiveSheet On Error Resume Next Set sourceWs = ThisWorkbook.Worksheets("Not-Covered-Time") On Error GoTo 0 If sourceWs Is Nothing Then MsgBox "未找到名为Not-Covered-Time的工作表" Exit Sub End If ' 创建目标工作表 Set targetWs = ThisWorkbook.Worksheets.Add targetWs.Name = "Not-Covered-Time_ZeroRows" ' 可自定义目标表名称 ' 自动识别源表完整数据区域(含表头) Set dataRange = sourceWs.Range("A1").CurrentRegion On Error Resume Next ' 对T列(第20列)应用筛选 dataRange.AutoFilter Field:=20, Criteria1:="0" ' 获取筛选后的可见数据行(排除表头) Set filteredRange = dataRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow On Error GoTo 0 If Not filteredRange Is Nothing Then ' 复制筛选行的值到目标表 filteredRange.Copy targetWs.Range("A1").PasteSpecial xlPasteValues Else MsgBox "T列中没有值为0的行" End If ' 清除源表筛选(先判断是否处于筛选状态) If sourceWs.AutoFilterMode Then sourceWs.AutoFilterMode = False End If Application.CutCopyMode = False targetWs.Activate targetWs.Range("A1").Select End Sub
关键优化点
- 直接通过工作表名称绑定源表,避免激活操作引发的对象错误
- 用
CurrentRegion自动识别完整数据范围,无需手动计算行列数 - 增加错误捕获,处理无匹配行的场景,避免1004错误
- 清除筛选前先判断状态,防止无效操作报错
- 保留原工作表(若需删除原表,可在最后添加
sourceWs.Delete,但需确保工作簿至少保留一个工作表)
内容的提问来源于stack exchange,提问作者Winter
相关产品推荐
相关产品推荐

