excel - 删除具有两个条件的行的最有效方法

标签 excel performance vba loops

我要做的是删除电子表格中两个单独列中值为 0 的行,因为这表明该行中没有有用的数据。虽然可以使用 For loopIf/Then在这种情况下,我发现这非常慢,因为我的数据集有大约 51,000 行,而且它实际上需要数小时甚至数天才能运行。

经过一番搜索,我遇到了另一种方法,我认为它更快并且目前正在使用:

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 个单元进行了测试,运行时间为 402 秒,这表明以相同的速率运行所有数据需要 5.584 小时。

有什么方法可以加快这个过程吗?我错过了一些明显的东西吗?

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

最佳答案

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

以下是几种简单的方法:

  • 使用 AutoFilter 过滤不需要的行,然后删除可见单元格。
  • 使用自动筛选来筛选要保留的行并将其复制到新工作簿。
  • 首先对值进行排序,以便所有不需要的行都位于底部。你已经从下往上删除了,所以你只需要在你的循环前面插入一个排序。
  • 关于excel - 删除具有两个条件的行的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25068737/

    相关文章:

    vba - 如何在不使用 Microsoft Forms 2.0 Lib、CLEAN 等的情况下从 Microsoft Excel 2010 复制的带有特殊字符的文本中删除双引号

    Excel VBA双重加法错误

    R:如何将结构化列表导出到Excel

    excel - 使用 Offset、Vlookup 和 Concatenate 返回列表

    C 如何正确测量时间?

    android - XML 布局与代码布局的性能?

    vba - 根据日期锁定整行

    java - 可执行 JAR 执行不同于 eclipse 执行

    arrays - VBA excel : Filtering By date and assigning Criteria2 value to a variable?

    java - 在 Java 中按值从 Map 中删除元素的最快方法是什么?