我正在尝试删除第 5 列中值为"N"、"X"或"V"的所有行。数据存储在名为"Table1"的表中。数据集非常大,这就是为什么我试图过滤然后批量删除而不是遍历每一行。
下面的代码抛出错误运行时错误"1004":"范围类的删除方法失败",我一生都无法弄清楚原因。谁能指出我在这里缺少的方向?我觉得我以前已经成功地使用类似的代码来执行相同的功能。
'Remove N/X/V records
wsLF.ListObjects("Table1").Range.AutoFilter Field:=5, Criteria1:= _
Array("N", "V", "X"), Operator:=xlFilterValues
LastRow = wsLF.Range("D" & wsLF.Rows.Count).End(xlUp).Row
wsLF.Range("$A$1:$W$" & LastRow).Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete '~~~~~Error on this line
wsLF.ListObjects("Table1").Range.AutoFilter Field:=5
我有用(Max Russell也有相同的EntireRow
评论)
Dim rngVis As Range, tbl As ListObject
Set tbl = wsLF.ListObjects(1)
tbl.Range.AutoFilter Field:=5, Criteria1:=Array("N", "V", "X"), _
Operator:=xlFilterValues
On Error Resume Next
Set rngVis = tbl.DataBodyRange.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
Application.DisplayAlerts = False
If Not rngVis Is Nothing Then rngVis.Delete 'no EntireRow
Application.DisplayAlerts = True
tbl.Range.AutoFilter Field:=5
尝试引用列表对象中的范围。此外,删除EntireRow
元素。我突然想起以前给我带来麻烦的事情!
wsLF.ListObjects("Table1").DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
删除最后一个过滤行时,函数
SpecialCells(xlCellTypeVisible)
变得灭绝,并且工作 Delete 方法发现自己没有其他单元格,因此它会引发异常。
如果您尝试使用该函数,也会发生同样的情况
SpecialCells(xlCellTypeVisible)
在过滤器产生任何行之后。 此函数不能解析为任何范围,因此任何方法都会引发异常。
如上所述,使用
Set rngVis = tbl.DataBodyRange.SpecialCells(xlCellTypeVisible)
解决了这个问题,因为它使该范围持久存在,删除方法直到最后都能正常工作。
我在所有表中广泛使用EntireRow.Delete
,这些表通常是SQL连接,并且一直完美运行。
但现在这是第一次有人使用嵌入式PowerQuery查询。并且上述内容无法崩溃并显示错误消息Delete method of Range class failed
。
此外,由于错误Can't move cells in a filtered range or table.
[Shift]
选项.Delete
不起作用。
唯一的方法是禁用DisplayAlerts
并仅使用.Delete
因为删除整行是默认设置(否则您将看到一个对话框)。
我们都需要习惯这种情况,因为越来越多的用户希望使用 PowerQuery 而不是 SQL。