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

问题描述:

我在尝试编写一个宏来过滤包含“单元ID”和“样本日期”列的数据范围。要做到这一点,我有一个单独的范围有“单位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

非vba解决方案如何?在C2单元格中放置这个公式='= IF(B2

+0

在代码开始时关闭你的计算,并在结束时再次打开它,以加快速度。 –

+0

@ScottCraner这绝对是通常的嫌疑犯之一。我在代码开始时关闭了计算和屏幕更新。 – Arne

我最终什么用的附加列做旁边包含公式斯科特·霍尔茨曼建议(单元格引用为清楚起见删除)“样本日”:

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设置行使得操作速度更快。

+0

您可能还会考虑过滤,将整个可见工作表内容复制到新工作表,然后删除旧工作表。当数据集变得非常大时,删除行变得非常耗时。 –