Dom*_*rew 1 arrays vba loops for-loop
我创建了一个数组,其中每个元素都是我要从工作表中删除的行数。
唯一的问题是,从工作表顶部删除行会转移其他行的位置。因此,请建议如何从底部到顶部(向后)循环遍历阵列。
(...)
For Each r In rowArray()
Cells(r, 5).Rows.EntireRow.Delete
Next r
(...)
Run Code Online (Sandbox Code Playgroud)
For Each...Next循环For...Next在迭代对象集合(source)方面的性能大大优于循环,并且在For...Next循环访问For Each...Next数组时的性能优于循环。因此,For如果要迭代数组,请使用循环;而For Each实际上要迭代a的个体细胞,请使用循环Range。
考虑使用Union而不是向后迭代行,将要删除的行连接到单个Range对象中,您可以在单个工作表操作中将其删除-这将大大优于向后循环。
Private Function Combine(ByVal source1 As Range, ByVal source2 As Range) As Range
If source1 Is Nothing Then
Set Combine = source2
Else
Set Combine = Union(source1, source2)
End If
End Function
Run Code Online (Sandbox Code Playgroud)
像这样(未经测试的空中代码):
Dim toDelete As Range, i As Long
For i = LBound(rowArray) To UBound(rowArray)
Set toDelete = Combine(toDelete, rowArray(i))
Next
If Not toDelete Is Nothing Then toDelete.EntireRow.Delete
Run Code Online (Sandbox Code Playgroud)
这样,切换Application.Calculation到手动,禁用Application.EnableEvents和设置Application.ScreenUpdating,以False将有小到任何对整体性能没有任何影响,因为你只用片材进行交互时,你必须,而单独删除每一行都会触发事件表,及时重新计算和屏幕重绘每次迭代。