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

时间:2013-07-10 05:12:09

标签: excel vba excel-vba excel-2003

我有一个有趣的问题。我试过搜索这个网站和谷歌,但只有一些相关的问题,没有一个实际上解决了这个特定的需求。

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

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

我一直在研究与.Find函数一起使用的autofilter选项(例如,查找不符合条件且删除的H单元格的所有行)但2003年的AutoFilter仅适用于2个标准,而我有5个要检查。我不知道该怎么办。

感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

这删除了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

答案 1 :(得分:0)

您可以尝试“高级过滤”选项,您可以在其中指定两个以上的条件来过滤列表。过滤与您设置的条件匹配的列表后,可以将已过滤的列表复制到另一个位置(可用选项),然后删除剩余的列表。

答案 2 :(得分:0)

您可以添加具有您自己条件的列:

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

(对于第1行给出公式,您必须将其复制粘贴到整个范围)

然后使用过滤和排序来选择要删除的行。

答案 3 :(得分:0)

一些速度提示:

  1. 使用大数据时,将值赋给数组并使用数组而不是* .Value;
  2. 使用完整列时,请忽略底部的空列;
  3. 在工作表中进行密集更改时,请禁用屏幕更新和自动计算。
  4. 说明这一点,我会使用这段代码:

    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
    

答案 4 :(得分:0)

感谢所有建议解决方案的人。在这段时间之内,我最终找到了在<1秒内完成此操作的方法 - 显然我自己没有意识到AutoFilter可以支持比较标准(大于,小于等)。

使用我自行过滤的一系列自动过滤器,然后删除过滤为“&lt; 30”,“30120”的所有行。

不优雅,但它确实有效。