VBA中的变量行为。保持双重值的相同变量。怎么样?

时间:2016-06-27 21:47:15

标签: vba variables for-loop scope

我正在研究一些遗留代码,并且遇到了一些对我来说很新鲜有趣的东西。

VBA proc有一个声明和赋值的变量。相同的变量用作For循环中的迭代变量。循环工作正常并产生正确的结果。因此变量同时保留两个值,a。)由代码分配的值,b。)For循环中赋值的值我想知道的是怎样的?它是VBA鲜为人知/隐藏的特征之一,还是我只是在思考和错过一个非常基本的概念? 请参阅示例代码和注释。

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

2 个答案:

答案 0 :(得分:2)

变量不能同时保存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的结束值

答案 1 :(得分: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