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

VBA删除表中IT列值为OO的行时触发1004错误求解决

解决VBA删除表格筛选行的Run-time Error '1004'问题

原代码错误原因

  1. 直接操作EntireRow.Delete会破坏表格(ListObject)的结构化属性,表头行被纳入删除范围时会触发错误
  2. 若筛选后无匹配数据行,SpecialCells(xlCellTypeVisible)会因找不到目标单元格报错
  3. 使用Range("CHECK_DETAIL")会包含表格表头,删除表头会导致表格结构异常

方案1:直接遍历表格行删除(推荐,更稳定)

无需筛选,直接操作表格的ListRows对象,从后往前遍历避免索引混乱:

Sub DeleteOO_Rows()
    Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("CHECK_DETAIL")
    
    Application.ScreenUpdating = False ' 关闭屏幕更新提速
    
    ' 从最后一行往前遍历,防止删除行后索引移位漏删
    Dim i As Long
    For i = tbl.ListRows.Count To 1 Step -1
        If tbl.ListRows(i).Range.Cells(1, 18).Value = "OO" Then
            tbl.ListRows(i).Delete
        End If
    Next i
    
    Application.ScreenUpdating = True
End Sub

方案2:修复筛选后的删除逻辑

若坚持用筛选,需排除表头、处理无匹配行的情况:

Sub DeleteFilteredOO_Rows()
    Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("CHECK_DETAIL")
    
    ' 清除原有筛选
    tbl.AutoFilter.ShowAllData
    
    ' 筛选第18列值为"OO"的行
    tbl.Range.AutoFilter Field:=18, Criteria1:="OO"
    
    ' 捕获无可见行的错误
    On Error Resume Next
    Dim visibleDataRows As Range
    Set visibleDataRows = tbl.DataBodyRange.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    ' 存在匹配行时删除
    If Not visibleDataRows Is Nothing Then
        visibleDataRows.Delete
    End If
    
    ' 清除筛选
    tbl.AutoFilter.ShowAllData
End Sub

内容的提问来源于stack exchange,提问作者William

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:34:56