通过宏

时间:2017-07-28 00:33:50

标签: excel vba excel-vba

我遇到以下代码的问题,它试图过滤一组数据,然后删除可见的行。目前我得到一个"运行时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

非常感谢对这些错误的任何帮助!

3 个答案:

答案 0 :(得分:3)

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

此外,测试.SpecialCells(xlCellTypeVisible).Count > 1没用,因为过滤范围的标题行仍然可见。

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

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

答案 1 :(得分:1)

@ A.S.H的帖子是极简主义的一个很好的例证,但你的1 st 代码块仍然没问题。

只是做一个小小的修正,按照他的指示将.SpecialCells(xlCellTypeVisible).Count > 1更改为.SpecialCells(xlCellTypeVisible).Count > 2。另外,不要忘记在最后添加行Worksheets("Orders").ShowAllData

2 nd 代码块不必要地复杂化(因此可能容易出错)。相反,只需将1 st 代码块的过滤器更改为Criteria1:="<>New",如果您想要消除&#34; New&#34;项目

运行时错误问题似乎是由于其他原因造成的。确保纸张不受保护。

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

答案 2 :(得分:0)

您应该删除代码顶部的所有过滤器。

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