【问题标题】:Variable behavior in VBA. Same variable holding dual values. How?VBA 中的可变行为。相同的变量持有双重值。如何?
【发布时间】:2016-10-30 01:07:00
【问题描述】:

我正在处理一些遗留代码,并遇到了一些对我来说非常新且有趣的东西。

VBA 过程有一个声明和分配的变量。在For 循环中使用相同的变量作为迭代变量。循环工作正常并产生正确的结果。Soem如何变量同时保留两个值,a.)由代码分配的值,b.)在For循环中分配的值我想了解的是如何?它是VBA 的鲜为人知的/隐藏功能之一,还是我只是想多了,错过了一个非常基本的概念? 请查看示例代码和 cmets。

Sub test()

    Dim lTest       As Long

    '/ Assignment here.
    lTest = 10

    '/ How this loop runs. When I assign lTest=0 in the `For` loop then
    '/ shouldn't the loop exit at lTest -1 ? If I don't assign any value to lTest, then
    '/ the loop behaves as expected and exits without any iteration.
    For lTest = 0 To lTest - 1
        Debug.Print lTest
    Next


End Sub

【问题讨论】:

  • 使用与循环命令中指定的迭代器变量不同的命名迭代器变量。
  • @Parfait,好一个:)。我知道这不是最佳做法。你的建议是。我问这个问题只是想弄清楚这是一个小故障还是背后有一个合乎逻辑的解释。

标签: vba variables for-loop scope


【解决方案1】:

变量没有同时保存 2 个值。

一旦进入循环,就设置了结束条件。

因此,当您进入循环时,lTest 等于 10,这意味着循环将一直持续到 lTest 等于 9。那么,lTest 设置为 0 以开始循环。

使用 2 个变量更容易看到这一点。

Sub test()

Dim testVar As Integer
Dim loopCounter As Integer

testVar = 10
loopCounter = 0

For loopCounter = 0 To testVar - 1

testVar = 2 'or whatever you want
Debug.Print loopCounter
Debug.Print testVar

Next loopCounter

End Sub

这将一直持续到 loopCounter 为 9。testVar 可以设置为您想要的任何值,但是一旦进入循环,循环将一直持续到 testVar 等于结束循环参数。

另一件让您感到困惑的事情是,您认为当您没有将lTest 设置为等于任何值时,它最初被设置为 0 以开始循环。实际发生的是 lTest 设置为 0 因为它没有被赋予一个值。 0 是 Long 的默认值,所以第一次进入循环时,结束值设置为 -1,因为 lTest 默认为 0,而不是因为您以 0 开始循环。要看到这一点,请以-3 而不是 0,它将一直运行到 -1 的结束值

【讨论】:

  • 谢谢。原来我对 for 循环了解不多。 :)
【解决方案2】:

For 语句中发生了两件事。设置退出条件 (lTest = 9) 并为计数器变量分配一个初始值 (lTest = 0)。这在功能上等同于:

lTest = 0
Do
    Debug.Print lTest
Loop While lTest < 10

无论使用什么变量,循环退出条件只计算一次,并且只在第一次进入循环时设置。此代码演示:

Private Sub Example()
    Dim test As Long, jumped As Boolean

    test = 10
    For test = 0 To test
InLoop:
        Debug.Print test
        If test = 5 And Not jumped Then GoSub OutSideLoop
    Next

    Exit Sub

OutSideLoop:
    test = 0
    jumped = True
    GoTo InLoop
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2020-06-25
    • 2023-03-11
    • 2019-11-19
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    相关资源
    最近更新 更多