如何筛选运行时错误1004后删除可见的行

时间:2019-08-15 18:41:12

标签: excel vba

尝试创建一个宏,在该宏中,我将根据列创建工作表的副本,并删除不等于我正在遍历的当前值的宏。

我的数据可能会或可能不会在原始工作表的表格中。我需要复制原始工作表,然后删除以维护我在原始工作表中创建的列组。

Sub FilterCopy()
    Dim cl As Range
    Dim Ws As Worksheet

    Set Ws = ActiveSheet
    If Ws.FilterMode Then Ws.ShowAllData
    With CreateObject("scripting.dictionary")
       For Each cl In Ws.Range("A2", Ws.Range("A" & Rows.Count).End(xlUp))
       If Not .exists(cl.Value) Then
        .Add cl.Value, Nothing
        Ws.Copy
        Range("A1").AutoFilter 1, "<>" & cl.Value
        'The code below gives me the error
        ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlVisible).EntireRow.Delete
        Range("A1").AutoFilter
        Range("A1").AutoFilter
        ActiveWorkbook.SaveAs "U:\Test\" & cl.Value & ".xlsx", 51
        ActiveWorkbook.Close False
     End If
  Next cl
End With
End Sub

运行时错误“ 1004”:

  

Range类的删除方法失败

1 个答案:

答案 0 :(得分:0)

您的问题似乎是由您要删除的行是不连续的事实引起的。的确,当需要处理不会接触并形成不同区域的范围时,Excel-VBA会遇到困难。

要解决此问题,您可以像这样同时处理一个区域:

Dim MyRange As Range
Set MyRange = <Your Range Specification>

For i = MyRange.Areas.Count To 1 Step -1
    MyRange.Areas(i).EntireRow.Delete
Next i

通过使用for循环以降序从最后一个(底部)到第一个区域很重要。这样可以避免由于以前的行被删除而导致要删除的行在上移后更改了行号的问题。

关于范围,我会避免使用AutoFilter。即使可以返回范围,该功能似乎也没有得到很好的记录(See MSDN page)。因此,为简单起见,我建议您这样定义范围:

Set MyRange = ActiveSheet.Range(ActiveSheet.Range("A2"), ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell)).SpecialCells(xlVisible).EntireRow

请注意,在复制工作表副本之后,请务必立即添加此内容,以确保ActiveSheet指向正确的工作表。