尝试创建一个宏,在该宏中,我将根据列创建工作表的副本,并删除不等于我正在遍历的当前值的宏。
我的数据可能会或可能不会在原始工作表的表格中。我需要复制原始工作表,然后删除以维护我在原始工作表中创建的列组。
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类的删除方法失败
答案 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
指向正确的工作表。