我正在尝试编写一个子过程,如果 IT 列值等于 OO,它将删除所有表行

问题描述 投票:0回答:1

我需要一个过程来过滤 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
excel vba runtime-error
1个回答
0
投票

脚本中的问题在于如何引用表及其行以进行删除。具体来说,您使用的是 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
可确保仅定位表中的可见行。

© www.soinside.com 2019 - 2024. All rights reserved.