首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向后(从底部到顶部)遍历数组( VBA )

向后(从底部到顶部)遍历数组( VBA )
EN

Stack Overflow用户
提问于 2019-07-15 21:15:22
回答 2查看 1.2K关注 0票数 2

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

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

代码语言:javascript
运行
复制
(...)
For Each r In rowArray()

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

Next r
(...)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-15 21:19:52

使用计数器循环和step命令:

代码语言:javascript
运行
复制
Dim x as Integer

For x = 10 to 1 Step -1
   myWorksheet.Rows(x).Delete
Next x

如果数组中有数字,则如下所示:

代码语言:javascript
运行
复制
For x = ubound(myArray) to 0 step -1
   rows(myArray(x)).Delete
next x

Step用于指示要跳转多少次迭代,因此您可以对每隔一行使用Step 2,对于第5行向后使用Step -5

票数 1
EN

Stack Overflow用户

发布于 2019-07-15 21:38:34

For Each...Next循环在迭代对象集合(来源)方面远远优于For...Next循环,而For...Next循环在迭代数组方面优于For Each...Next循环。所以,如果您正在迭代一个数组,那么使用一个For循环,而使用一个For Each循环,它实际上是在迭代一个Range的独立单元。

考虑使用Union而不是向后迭代行,将要删除的行连接到单个Range对象中,在单个工作表操作中删除该对象--这将大大优于向后循环。

代码语言:javascript
运行
复制
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

像这样的东西(未经测试的空中代码):

代码语言:javascript
运行
复制
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对总体性能几乎没有任何影响,因为只有在需要时才与工作表交互,而单独删除每一行将触发工作表事件、提示重新计算和在每次迭代时重新绘制屏幕。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57047296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档