两种条件去除行的最有效的方法

我想要做的是删除我的电子表格中两个单独的列中值为0的行,因为这表明该行中没有有用的数据。 尽pipe可以在If/Then条件下使用For loop ,但是我发现这是不可思议的慢,因为我的数据集有大约51,000行,并且如果不是几天,它会花费几个小时来运行。

经过一番search,我遇到了一种替代方法,我相信更快,目前正在使用:

 Public Sub deleteRows() ' source: http://www.ozgrid.com/forum/showthread.php?t=64364 Dim lastRow As Long Dim n As Long Dim RT As Date RT = Time With ActiveSheet lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row End With For n = lastRow To 2 Step -1 If (Trim(ActiveSheet.Cells(n, 3).Value) = 0) And (Trim(ActiveSheet.Cells(n, 6).Value) = 0) Then ActiveSheet.Cells(n, 1).EntireRow.Delete End If Next n MsgBox Format(Time - RT, "hh:mm:ss") End Sub 

但是,我运行了一个只有1000个单元的testing,运行时间为402秒,这表明以相同的速率运行所有数据需要5.584小时。

有什么办法可以加快这个过程吗? 我错过了什么明显的?

*编辑:此代码作为另一个代码的子部分运行,其中ScreenUpdating = False在代码的开头声明。

这是一个使用自动filter的方法:

 Public Sub deleteRows() Dim lastRow As Long Dim rng As Range Dim start start = Timer With ActiveSheet .AutoFilterMode = False lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row '~~> Set the range of interest, no need to include the entire data range Set rng = .Range("B2:F" & lastRow) rng.AutoFilter 2, 0 '~~> filter zeros on C column rng.AutoFilter 5, 0 '~~> filter zeros on F column '~~> Delete the entire row of the remaining visible cells rng.Offset(1, 0).Resize(rng.Rows.Count - 1) _ .SpecialCells(xlCellTypeVisible).EntireRow.Delete .AutoFilterMode = False End With Debug.Print (Timer - start) * 1000 '~~> in ms End Sub 

在样本数据上进行试验和testing(单元格B2:L52802)。
删除了11699.22毫秒或在我的机器大约11.7秒。
我认为这与你估计的5个小时相比是足够快的(比具体的快1700倍)。

不,实际上需要更长的时间。 如果你删除了一行,那么它下面的每一行都会被单独移动,如果你删除的行下面有更多的行,这显然需要更长的时间。

这里有几个简单的方法来做到这一点:

  1. 使用AutoFilter筛选不需要的行,然后删除可见的单元格。

  2. 使用AutoFilter筛选要保留的行并将其复制到新的工作簿。

  3. 首先对值进行sorting,以便所有不需要的行位于底部。 你已经从底层删除了,所以你只需要在循环之前插入一个sorting。