我需要一个过程来过滤 IT 列上值等于 OO 的表,然后从那里删除具有该值的所有工作表行。但是,当我尝试编写此子过程时,我收到“运行时错误'1004':Range类的删除方法失败”。任何建议将不胜感激!
这是我写的,希望它能做到这一点,但是我不确定我正在做什么来触发这个错误。我是 VBA 新手,所以我现在正在努力排除故障。
这是我当前的脚本,其中 CHECK_DETAIL 是包含 IT 列(字段 18)的表对象:
ActiveSheet.ListObjects("CHECK_DETAIL").Range.AutoFilter Field:=18, _
Criteria1:="OO"
Range("CHECK_DETAIL").SpecialCells(xlCellTypeVisible).EntireRow.Delete
脚本中的问题在于如何引用表及其行以进行删除。具体来说,您使用的是 Range("CHECK_DETAIL") 语法,该语法在过滤后无法正确引用表对象。此外,删除筛选表中的行需要仔细处理以避免运行时错误。
Sub DeleteFilteredRows()
Dim ws As Worksheet
Dim tbl As ListObject
' Define the worksheet and table
Set ws = ActiveSheet
Set tbl = ws.ListObjects("CHECK_DETAIL")
' Apply the filter to the IT column (Field 18)
tbl.Range.AutoFilter Field:=18, Criteria1:="OO"
On Error Resume Next ' Handle cases where no rows are visible
' Delete visible rows in the filtered range
tbl.DataBodyRange.SpecialCells(xlCellTypeVisible).EntireRow.Delete
On Error GoTo 0 ' Turn error handling back off
' Remove the filter
tbl.AutoFilter.ShowAllData
End Sub
tbl.DataBodyRange
特别仅引用表中的数据行(不包括标题)。这可确保您定位感兴趣的行,而不会影响工作表的标题或其他部分。
如果应用过滤器后没有可见行,尝试删除它们将导致错误。使用
On Error Resume Next
可以防止脚本在这种情况下中断。
删除后,最好使用
tbl.AutoFilter.ShowAllData
清除过滤器。
原始代码中的Range("CHECK_DETAIL")
未正确引用过滤状态下的表对象。使用 tbl.DataBodyRange.SpecialCells
可确保仅定位表中的可见行。