【发布时间】:2015-05-12 08:52:12
【问题描述】:
我有 2 张纸,每张都有一张桌子。一个包含原始数据(2000 多行),一个包含我想从原始数据中删除的数据(500 行左右)。我有以下代码来执行此操作,但是它相当慢,我相信它可以更快:
Dim r As Range
Dim wsOriginal As Worksheet, wsDelete As Worksheet
Dim str As String
Dim i as Long
Set wsOriginal = ThisWorkbook.Sheets("List")
Set wsDelete = ThisWorkbook.Sheets("PermaDelete")
For i = wsDelete.UsedRange.Rows.Count To 2 Step -1
str = wsDelete.Cells(i, 1).Value & wsDelete.Cells(i, 2).Value & wsDelete.Cells(i, 3).Value & wsDelete.Cells(i, 4).Value & wsDelete.Cells(i, 5).Value
Set r = wsOriginal.Columns(30).Find(str, , xlValues, xlWhole, xlByRows, xlNext) ' Column 30 on original has concatenation of the required 5 rows, to match form of str
If Not r Is Nothing Then
Do
wsOriginal.Rows(r.Row).EntireRow.Delete
Set r = wsOriginal.Columns(30).Find(str, , xlValues, xlWhole, xlByRows, xlNext)
Loop Until r Is Nothing
End If
Next i
所以我遍历wsDelete 中的每一行并使用.Find 在较大的wsOriginal 中查找一行。如果找到它,则将其删除并再次查找同一行(因为一些确实在超过 1 行中复制了此信息)。对我来说,这听起来像是更快的方法(而不是循环通过wsOriginal),但代码本身似乎需要相当长的时间(2-3 分钟)。我正在使用.ScreenUpdating 和.EnableEvents 的常用技巧也设置为false。
我还能如何优化它以减少等待时间?
【问题讨论】:
-
如果工作表 wsOriginal 有公式,那么它会在每次删除事件后重新计算它们。执行 Application.Calculation = xlManual 以停止重新计算。
-
啊,是的。没想到。可以节省相当多的时间。稍后会尝试并报告。
-
是的,切换到手动计算将其缩短到不到一分钟。将尝试以某种方式调整下面提到的
Union想法,看看我是否可以让它发挥作用以获得额外的提升。