Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VBA Positive For loop, negative step

Tags:

excel

vba

Sub Test1()
    Dim a As Integer
    For a = 1 To 3 Step 1 'STEP POSITIVE ONE
    Next
    Debug.Print a
End Sub

Yields 4, as expected.

Sub Test2()
    Dim a As Integer
    For a = 1 To 3 Step -1 'STEP NEGATIVE ONE
    Next
    Debug.Print a
End Sub

Why does stepping "outside" the loop result in 1?

Why does VBA step out-of-bounds for Test1, but stop stepping when it goes out-of-bonuds for Test2?

EDIT: In addition to the above, running For a = 1 To 1 Step 1 results in 2, and For a = 1 To 1 Step -1 results in 0.

For a = 1 To 2 Step 1 results in 3, but For a = 1 To 2 Step -1 results in 1.

like image 234
leetdavid Avatar asked Dec 18 '17 07:12

leetdavid


1 Answers

In Test1 (i.e. For a = 1 To 3 Step 1), after the 3rd time through the loop, a is incremented to 4. As that is greater than 3, it stops and displays 4.

In Test2 (i.e. For a = 1 To 3 Step -1), a is initially set to 1. As that is already less than 3, it immediately stops and displays 1.

In For a = 1 To 1 Step 1, a is set to 1, which is not greater than 1, so the loop proceeds and then a is incremented to 2. As 2 is greater than 1, it stops and displays 2.

In For a = 1 To 1 Step -1, a is set to 1, which is not less than 1, so the loop proceeds and then a is decremented to 0. As 0 is less than 1, it stops and displays 0.

In For a = 1 To 2 Step 1, a is set to 1, which is not greater than 2, so the loop proceeds and then a is incremented to 2, and then a is incremented to 3. As 3 is greater than 1, it stops and displays 3.

In For a = 1 To 2 Step -1, a is set to 1, which is less than 2, so the loop stops and displays 1.


The actual process in these loops is:

  • Initialise the loop counter to the "start value"

  • Loop over the following steps:

    • Determine whether the loop counter is greater than the "end value" (if "step" is positive or zero) or less than the "end value" (if "step" is negative) and, if so, exit the loop

    • Perform statements within the loop

    • Add "step" to the loop counter

This is all documented on the MSDN page re the "For...Next Statement".

like image 72
YowE3K Avatar answered Sep 28 '22 17:09

YowE3K