我已经创建了一个数组,其中每个元素都是要从工作表中删除的行数。
唯一的问题是从工作表顶部删除行会改变其他行的位置。因此,请建议如何从底部到顶部(向后)遍历数组。
(...)
For Each r In rowArray()
Cells(r, 5).Rows.EntireRow.Delete
Next r
(...)发布于 2019-07-15 21:19:52
使用计数器循环和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 xStep用于指示要跳转多少次迭代,因此您可以对每隔一行使用Step 2,对于第5行向后使用Step -5。
发布于 2019-07-15 21:38:34
For Each...Next循环在迭代对象集合(来源)方面远远优于For...Next循环,而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对总体性能几乎没有任何影响,因为只有在需要时才与工作表交互,而单独删除每一行将触发工作表事件、提示重新计算和在每次迭代时重新绘制屏幕。
https://stackoverflow.com/questions/57047296
复制相似问题