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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:05:23