VBA:在删除数组项后减少循环次数?

3
在Excel的VBA中:
For i = 0 To UBound(artMaster)
    For j = i To UBound(artMaster)
        If i <> j And artMaster(i).VDN = artMaster(j).VDN Then
            Call DeleteArrayItem(artMaster, j)
        End If
    Next j
Next i

如果我删除了数组中的一个项目,如何减少循环的迭代次数?

2个回答

9
你可以将迭代器减去1。但是这可能会带来问题,使代码更难理解。
也许更好的方法是从最后一项到第一项循环(步长为-1)。这样,当你删除项目时,迭代器仍然有效。

+1 我曾经总是使用迭代器减法技巧。我可以证明,当您的循环主体开始变得更加复杂(即嵌套循环或非常长的循环/内部函数调用)时,会出现困难。 - Gaffi

4

相比于FOR循环,使用WHILE循环更好。此外,您可以将UBound(artMaster)存储在变量中。

Dim I As Integer
Dim j As Integer
Dim n as Integer

i = 0
n = UBound(artMaster)

Do While i <= n
    j = i + 1

    Do While j <= n
        If artMaster(i).VDN = artMaster(j).VDN Then
            Call DeleteArrayItem(artMaster, j)
            n = n - 1
        End If

        j = j + 1
    Loop

    i = i + 1
Loop

有没有想过将上限存储在变量中是否会实际减少运行时间?我本以为 UBound 基本上只是访问基础数组对象的一个属性,无论如何只是取消引用一个变量?也许我正在向外传播自己对 VBA 内部工作机制的无知。 - mkingston
1
这不是做这件事的原因。想法是通过明确地执行它,使循环的上限更清晰地被改变。 - Philip Sheard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接