通过macros从已过滤的范围中删除行

我遇到了下面的代码问题,它试图过滤一组数据,然后删除可见的行。 目前我的代码的最后一行出现“运行时间1004错误:删除方法或范围类失败”。 我在网站上发现了一个类似的问题,答案似乎正是我在我的最后一行代码。

Dim LastRow As Long LastRow = Worksheets("Orders").Range("A" & Rows.Count).End(xlUp).Row Worksheets("Orders").Range("A1:CU" & LastRow).AutoFilter Field:=10, Criteria1:="New" If Worksheets("Orders").Range("A1:CU" & LastRow).SpecialCells(xlCellTypeVisible).Count > 1 Then Worksheets("Orders").Range("A1:CU" & LastRow).Offset(1, 0).SpecialCells _ (xlCellTypeVisible).EntireRow.Delete 

后来在我的代码中,我再次过滤同一组数据,这次删除了不可见(过滤出)的行。 我也得到了这个代码的最后一行相同的错误:

  Worksheets("Orders").Range("$A1:CC" & LastRow).AutoFilter Field:=26, Criteria1:= _ "=*Jazz*", Operator:=xlAnd Dim oRow As Range, rng As Range Dim myRows As Range With Sheets("Orders") Set myRows = Intersect(.Range("A:A").EntireRow, .UsedRange) If myRows Is Nothing Then Exit Sub End With For Each oRow In myRows.Columns(1).Cells If oRow.EntireRow.Hidden Then If rng Is Nothing Then Set rng = oRow Else Set rng = Union(rng, oRow) End If End If Next If Not rng Is Nothing Then rng.EntireRow.Delete 

任何帮助这些错误将不胜感激!

您不需要在删除之前调用SpecialCells ,因为方法Delete仅对可见行进行操作。 这个问题可能是由于这个。

此外,testing.SpecialCells(xlCellTypeVisible).Count > 1是无用的,因为过滤范围的标题行保持可见。

这是一个更安全,更简单的编写代码的方法:

 With Worksheets("Orders").UsedRange .AutoFilter 10, "New" .Offset(1).EntireRow.Delete ' <--- no need for .SpecialCells End With 

由@ASH发表是极简主义的一个很好的例子,但你的第一个代码块仍然很好。

只要.SpecialCells(xlCellTypeVisible).Count > 1修改,就可以将.SpecialCells(xlCellTypeVisible).Count > 1更改为.SpecialCells(xlCellTypeVisible).Count > 2正如他指出的那样。 此外,不要忘记添加行Worksheets("Orders").ShowAllData

第二代码块是不必要的复杂(因此可能容易出错)。 相反,如果您想消除“新”项以外的其他项,只需将第一个代码块的filter更改为Criteria1:="<>New"

运行时错误问题似乎是由于别的。 确保工作表不受保护。

要查看是否是导致问题的代码或文件格式,您也可以在新的工作簿上testing相同的代码,只复制现有数据的数据(粘贴值),然后运行代码。

您应该删除代码顶部的任何filter。

 On Error Resume Next If Worksheets("Orders").AutoFilter.FilterMode = True Then Worksheets("Orders").ShowAllData End If