我想用两个标准过滤我的Excel表,并删除过滤后的行。我写了以下代码:
With ThisWorkbook.Worksheets("Table1").ListObjects("coordinates").Range
.AutoFilter Field:=3, Criteria1:=longitude_arr, Operator:=xlFilterValues
.AutoFilter Field:=4, Criteria1:=latitude_arr, Operator:=xlFilterValues
.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End With
过滤工作正常,但删除部分给我带来了运行时错误1004:删除范围对象的方法失败。我看不出有什么问题,你能帮我吗?
我认为错误是因为您试图从表中删除行,但您还有一行不是表的一部分:Offset(1, 0)
将把表之后的第一行添加到要删除的行中。
请尝试以下代码-它将在删除之前删除此额外的行。此外,我添加了一个检查是否要删除任何内容,如果没有,请跳过delete命令(否则会出现运行时错误)
Dim sourceRange As Range
Set sourceRange = ThisWorkbook.Worksheets("Table1").ListObjects("coordinates").Range
With sourceRange
.AutoFilter Field:=3, Criteria1:=longitude_arr, Operator:=xlFilterValues
.AutoFilter Field:=4, Criteria1:=latitude_arr, Operator:=xlFilterValues Dim filterRange As Range
Set filterRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
Dim deleteRange as Range
Set deleteRange = Intersect(filterRange, sourceRange)
if not deleteRange is Nothing then deleteRange.Delete
End With
更新很明显,我在复制测试代码时犯了一个错误,因为我保留了Autofilter命令,用quesion中的命令替换了它。
四处玩耍揭示了一些细节:
oDelete
也会因为EntireRow
而失败
o我不知道ListObject有一个DataBodyRange
-对象,这让它变得容易多了
o我还忘记了.SpecialCells(xlCellTypeVisible)
抛出一个运行时错误,而不是返回Nothing
,所以您需要用On Error
将其括起来
o如果您想删除整行,则使用Application.DisplayAlerts = False
我现在用
With ThisWorkbook.Worksheets(1).ListObjects(1).DataBodyRange
.AutoFilter Field:=3, Criteria1:=longitude_arr, Operator:=xlFilterValues
.AutoFilter Field:=4, Criteria1:=latitude_arr, Operator:=xlFilterValues
Dim filterRange As Range
On Error Resume Next
Set filterRange = .SpecialCells(xlCellTypeVisible)
On Error GoTo 0
Application.DisplayAlerts = False
If Not filterRange Is Nothing Then filterRange.Delete
Application.DisplayAlerts = True
End With