(Excel 2003 VBA)根据列中的多个条件删除整个行

我有一个有趣的问题。 我试着search这个网站和谷歌,但只有轻微相关的问题,没有一个真正解决这个特定的需求。

我有一个10列的电子表格(让我们称之为AJ )。 我需要删除列H的单元格中没有"30", "60", "90", "120"或空白值的所有行。

虽然有很多方法可以做到这一点,但是所有这些都依赖于循环,这对我不起作用,因为这个数据集有超过25k行,运行时间超过10分钟 – 太长了。

我一直在寻找autofilter选项与.Findfunction(例如find所有行不符合条件和删除的H单元格),但2003年的AutoFilter只能用于2条件,而我有5检查。 我不知道如何继续。

任何帮助表示赞赏。

这在20秒内删除了25k行样本中的所有匹配行(〜10%)

 Sub tt() Dim rw As Range Dim all As Range Dim t Dim b As Boolean t = Timer For Each rw In Range("A1").CurrentRegion.Rows If rw.Cells(8).Value < 1 Then If b Then Set all = Application.Union(rw, all) Else Set all = rw b = True End If End If Next rw If not all is nothing then all.EntireRow.Delete Debug.Print "elapsed: " & Timer - t End Sub 

您可以尝试高级筛选选项,您可以给两个以上的条件来筛选列表。 过滤符合您所设定条件的列表后,可以将过滤列表复制到其他位置(可用选项),并将剩余的删除。

你可以添加一个你自己的条件列:

 =IF(OR(H1=30;H1=60;H1=90;H1=120;H1="");"DELETE";"") 

(公式给出的行1,你必须复制粘贴到整个范围)

然后使用筛选和sorting来select要删除的行。

一些速度提示:

  1. 当使用大数据时,给数组赋值并使用数组而不是* .Value;
  2. 处理全列时,请忽略底部的空列;
  3. 在工作表中进行大量更改时,禁用屏幕更新和自动计算。

说明这一点,我会用这个代码:

 Sub Macro1() Dim su As Boolean, cm As XlCalculation Dim r As Long, v(), r_offset As Long su = Application.ScreenUpdating Application.ScreenUpdating = False 'Disable screen updating cm = Application.Calculation Application.Calculation = xlCalculationManual 'Disable automatic calculation 'Only use used values With Intersect(Range("H:H"), Range("H:H").Worksheet.UsedRange) v = .Value 'Assign values to array r_offset = .Row - LBound(v) 'Mapping between array first index and worksheet row number End With 'Check all row from bottom (so don't need to deal with row number changes after deletion) For r = UBound(v) To LBound(v) Step -1 Select Case v(r, 1) Case "30", "60", "90", "120", Empty 'Do nothing Case Else Sheet1.Rows(r + r_offset).EntireRow.Delete End Select Next Application.ScreenUpdating = su 'Restore screen updating Application.Calculation = cm 'Restore calculation mode End Sub 

感谢所有提出解决scheme的人。 在这段时间之间,我终于find了一个在<1秒内完成这个任务的方法 – 显然,我自己并没有意识到AutoFilter可以支持比较标准(大于,小于等)。

使用一系列自动筛选器,我简单地过滤,然后删除所有筛选为“<30”,“30120”的行。

不优雅,但它做了伎俩。