如何根据比较有效地删除行

时间:2016-02-12 14:39:10

标签: excel vba excel-vba

我试图编写一个宏来过滤一系列包含" Unit ID"和"样品日期"柱。为此,我有一个单独的范围,其中包含" Unit ID"和"安装日期"列。

Example of units, sample dates, and install dates

现在我正在运行一个使用Application.VLookup检查每个行的单位安装日期的循环,然后删除该行sample_date < install_date

问题是我有~14,000行,这似乎需要永远这样做。我的问题是:有没有更有效的方法来减少执行操作所需的时间?

我的代码目前看起来像这样(为了清晰起见,稍微减少了一点):

j = 2

Do
    unit = Sheets("930E Samples").Cells(j, 49)
    install_date = Application.VLookup(unit, Lookup_Range, 5, False)

    If IsError(install_date) Then
        install_date = 1000000 'sets the date so that samples are deleted (because unit does not exist)
    End If


Do
    If Sheets("930E Samples").Cells(j, 3) < install_date Then
        Sheets("930E Samples").Cells(j, 3).EntireRow.Delete Shift:=xlUp
        j = j - 1
    End If
    j = j + 1
    next_unit = Sheets("930E Samples").Cells(j + 1, 49)
Loop While unit = next_unit

Loop While (j < Sheets("930E Samples").Cells(Rows.Count, "A").End(xlUp).Row)

我承认它现在肯定不是最好的方法,但确实有效(尽管需要大约5-10分钟)。

1 个答案:

答案 0 :(得分:0)

我最终做的是使用“样本日期”旁边的附加列,其中包含Scott Holtzman建议的公式(为清晰起见,删除了单元格引用):

IF(sample_date < VLOOKUP(blah), "DELETE", "")

然后,因为我能够将数据放在表格中,所以我使用以下代码来消除不需要的行:

Sub Filter_By_Date()
Application.ScreenUpdating = FALSE
Application.Calculations = xlCalculationsManual

With Sheets("930E Samples")
    .ListObjects(1).Range.AutoFilter Field:=50, Criteria1:="<>"
    .Range("Table29[Delete?]").EntireRow.Delete

    If .Range("Table29").ListObject.ShowAutoFilter Then
        .ListObjects(1).AutoFilter.ShowAllData
    End If
End With
Application.ScreenUpdating = TRUE
Application.Calculations = xlCalculationsAutomatic
End Sub

同样,这里可能需要一些高尔夫球来清理引用和语法,但是这种让电子表格提供内置过滤列然后使用VBA删除行的方法导致了更快的操作。