如何根据比较高效地删除行
问题描述:
我在尝试编写一个宏来过滤包含“单元ID”和“样本日期”列的数据范围。要做到这一点,我有一个单独的范围有“单位ID”和“安装日期”列。如何根据比较高效地删除行
现在我正在运行使用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分钟)。
答
我最终什么用的附加列做旁边包含公式斯科特·霍尔茨曼建议(单元格引用为清楚起见删除)“样本日”:
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
您可能还会考虑过滤,将整个可见工作表内容复制到新工作表,然后删除旧工作表。当数据集变得非常大时,删除行变得非常耗时。 –
非vba解决方案如何?在C2单元格中放置这个公式='= IF(B2
在代码开始时关闭你的计算,并在结束时再次打开它,以加快速度。 –
@ScottCraner这绝对是通常的嫌疑犯之一。我在代码开始时关闭了计算和屏幕更新。 – Arne