向后(从下到上)VBA遍历数组

时间:2019-07-15 21:15:22

标签: arrays vba loops for-loop

我创建了一个数组,其中每个元素都是我要从工作表中删除的行数。

唯一的问题是,从工作表顶部删除行会转移其他行的位置。 因此,请建议如何从底部到顶部(向后)循环遍历数组。

(...)
For Each r In rowArray()

    Cells(r, 5).Rows.EntireRow.Delete

Next r
(...)

2 个答案:

答案 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