通过自动filter删除时间太长

我有大约8000多行。 使用自动filter删除行需要几分钟的时间。 我认为autofilter是事实上的FAST删除方法(而不是逐行循环)。 我怎样才能加快速度? 有更快的方法吗? 公平地说,一半的行被删除XD

With ThisWorkbook.Worksheets("Upload") lastRow = .Cells(.Rows.Count, "S").End(xlUp).Row Set dataRng = .Range(.Cells(4, 1), .Cells(lastRow, 19)) dataRng.AutoFilter field:=19, Criteria1:="=0" Application.DisplayAlerts = False dataRng.Offset(1, 0).Resize(dataRng.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows.Delete Application.DisplayAlerts = True .ShowAllData End With 

我会挑战基本的假设,即AutoFilter是最快的方法 – 通常很难打败一个变种arrays

这个演示展示了一种方法来做到这一点,在我的系统处理8000+行删除半分钟的运行

 Sub DEMO() Dim datrng As Range Dim dat, newdat Dim i As Long, j As Long, k As Long With ThisWorkbook.Worksheets("Upload") Set datrng = .Range(.Cells(1, 1), .Cells(.Rows.Count, "S").End(xlUp)) End With dat = datrng.Value ReDim newdat(1 To UBound(dat, 1), 1 To UBound(dat, 2)) j = 1 For i = 1 To UBound(dat, 1) If dat(i, 19) <> 0 Then ' test for items you want to keep For k = 1 To UBound(dat, 2) newdat(j, k) = dat(i, k) Next j = j + 1 End If Next datrng = newdat End Sub 

我testing了macros的速度,发现sorting,自动过滤和删除速度快于构build数组。

使用这里的计时代码,我运行原始代码在100k行的随机数据(25列宽0-4之间的随机数)。

– 原代码花了78秒(这里只跑了5万行来加速)

– 由克里斯提出的数组代码花了1.91秒

– 下面的代码花了0.84秒(尝试运行它sorting上升和下降,如果零的范围sorting到顶部或底部,它没有什么区别。

我意识到内置的时钟在VBA中并不是很好,但是差别就足够了,我可以很好的说在这种情况下,sorting,过滤,删除至less和数组一样快。

下面的代码只是添加了dataRng.Sort key1:=Range("S4"), order1:=xlDescending, Header:=xlYes是原始代码

 Sub test() With Sheets("sheet1") lastRow = .Range("S" & .Rows.Count).End(xlUp).Row Set dataRng = .Range(.Cells(4, 1), .Cells(lastRow, 25)) dataRng.Sort key1:=Range("S4"), order1:=xlDescending, Header:=xlYes dataRng.AutoFilter field:=19, Criteria1:="=0" Application.DisplayAlerts = False dataRng.Offset(1, 0).Resize(dataRng.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows.Delete Application.DisplayAlerts = True .ShowAllData End With End Sub