我试图编写一个宏来过滤一系列包含" Unit ID"和"样品日期"柱。为此,我有一个单独的范围,其中包含" Unit 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分钟)。
答案 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删除行的方法导致了更快的操作。