For循环是否可以动态运行,因为限制会随着代码的运行而变化?

时间:2019-01-12 07:01:45

标签: excel vba

我正在使用完全由VBA编写的Excel为一组设备创建预测模型。

在预测设备利用率的同时,一些设备将达到其更换阈值,而新设备将从那里接管。这将需要在表中为新设备添加新行。

我本以为For循环会是动态的,因此使用变量作为上限将在每个循环中重新评估,但这似乎并非如此。

我设置了一个简单的场景,按照下面的代码进行测试,从表中的2个列表行开始。

Sub Test1()

    Set Table1 = Sheet1.ListObjects("Table1")
    x = Table1.ListRows.Count

    For i = 1 To x

        Set NewRow = Table1.ListRows.Add
        x = Table1.ListRows.Count
        NewRow.Range(1, 1) = x

    Next i

End Sub

我认为它可以无限运行,但只能按照提供的初始情况运行。

是否正在使用另一种类型的循环(“仅当做”或“直到做”)来实现真正动态的结果?

1 个答案:

答案 0 :(得分:1)

总结问题评论中的内容:

Viual Basic中可能禁止修改for循环的目标。原则上还有其他语言可以进行这种操作,但是,这不是一种好的编程风格。

原因是,for循环是在固定间隔内计数的循环(在循环执行期间不应更改)。

这里可以考虑使用while循环,而不是使用for循环:

i = 1
While i <= x 
     Set NewRow = Table1.ListRows.Add
     x = Table1.ListRows.Count
     NewRow.Range(1, 1) = x
     i = i+1
Wend

警告:
此循环将永远运行(或更确切地说:直到您达到最大资源量为止,在这种情况下它将崩溃)。原因是,您将迭代1的上限移得更远,同时又接近了1单位。

接近实际想要实现的最佳方法是使用缓冲区列表:

  • 确定要为其创建新行的项目
  • 将该行插入第二个列表
  • 遍历第二个列表,然后将项目附加到原始列表中

这样,您可以避免测试新插入的项目(目前很可能不会过时)。