VBA删除表中IT列值为OO的行时触发1004错误求解决
解决VBA删除表格筛选行的Run-time Error '1004'问题
原代码错误原因
- 直接操作
EntireRow.Delete会破坏表格(ListObject)的结构化属性,表头行被纳入删除范围时会触发错误 - 若筛选后无匹配数据行,
SpecialCells(xlCellTypeVisible)会因找不到目标单元格报错 - 使用
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
相关产品推荐
相关产品推荐

