我创建了一个数组,其中每个元素都是我要从工作表中删除的行数。
唯一的问题是,从工作表顶部删除行会转移其他行的位置。 因此,请建议如何从底部到顶部(向后)循环遍历数组。
(...)
For Each r In rowArray()
Cells(r, 5).Rows.EntireRow.Delete
Next r
(...)
答案 0 :(得分:4)
For Each...Next
循环的性能大大优于For...Next
循环的对象集合(source)的迭代,而For...Next
循环优于For Each...Next
的迭代数组的迭代。因此,如果要迭代数组,请使用For
循环,而实际上要迭代For Each
的个体细胞,请使用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
类似这样的东西(未经测试的空中代码):
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
以这种方式将Application.Calculation
切换为手动,禁用Application.EnableEvents
并将Application.ScreenUpdating
设置为False
不会对整体性能产生任何影响,因为您只是在进行交互必须时与工作表一起使用,而单独删除每一行将触发工作表事件,并在每次迭代时提示重新计算并重新绘制屏幕。
答案 1 :(得分:1)
使用计数器循环和step命令:
Dim x as Integer
For x = 10 to 1 Step -1
myWorksheet.Rows(x).Delete
Next x
如果数组中有数字,则类似于:
For x = ubound(myArray) to 0 step -1
rows(myArray(x)).Delete
next x
Step用于指示要跳跃的迭代次数,因此您可以对每隔一行使用Step 2
,向后每第5行使用Step -5
。