View Full Version : [SOLVED:] VBA Loop Control Variable Issue / Question
Paul92688
07-15-2021, 11:05 AM
The code below fails to compile and generates a "For control variable already in use" error on the second for loop. The entire test program is here. The loop works if for example the inner and outer loops have var names such as i and n, but while array(1) and array(2) are separate variable locations the compiler seems to be treating the array name as the single specific variable.
The reason I want to have a loop control variable as an element of an array is because I am writing code that can allow a dynamic number of for loops. I am certain I have used compilers that have allowed this in the past but I suspect no dice with VBA. If there is a switch or other trick that allows this I would be very grateful.
Error generated on second loop where comment is placed.
TIA, Paul
btw, this is not a work related issue, I am simply a hobbiest and have been coding for fun since the late '70's
Option Explicit
Sub TestForLoopVariableName()
Dim LCV(2) As Integer
For LCV(1) = 1 To 10
For LCV(2) = 1 To 10 'for control variable already in use
counter =counter+!
Next LCV(2)
Next LCV(1)
End Sub
Paul_Hossler
07-15-2021, 12:29 PM
1. I think you're out of luck
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/fornext-statement
SyntaxFor counter = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
The For…Next statement syntax has these parts:
Part
Description
counter
Required. Numeric variable (https://docs.microsoft.com/en-us/office/vba/language/glossary/vbe-glossary#variable) used as a loop counter. The variable can't be a Boolean (https://docs.microsoft.com/en-us/office/vba/language/glossary/vbe-glossary#boolean-data-type) or an array (https://docs.microsoft.com/en-us/office/vba/language/glossary/vbe-glossary#array) element.
start
Required. Initial value of counter.
end
Required. Final value of counter.
step
Optional. Amount counter is changed each time through the loop. If not specified, step defaults to one.
statements
Optional. One or more statements between For and Next that are executed the specified number of times.
2. Couple of tweaks
Option Explicit
Sub TestForLoopVariableName()
Dim LCV(1 To 2) As Long
Dim counter As Long ' Added Dim
For LCV(1) = 1 To 10
For LCV(2) = 1 To 10 ' for control variable already in use
counter = counter + 1 ' s/b a number 1, not exclamation mark
Next LCV(2)
Next LCV(1)
MsgBox counter
End Sub
Sub TestForLoopVariableName()
Dim LCV1 As Integer, LCV2 As Integer, Counter as Integer
For LCV1= 1 To 10
For LCV2 = 1 To 10 'for control variable already in use
counter =counter + 1
Next LCV2
Next LCV1
End Sub
Use of proper parentheses declares an array variable
Create a one dimension Array with 10 "Slots" numbered 0 to 9, where each "slot" can only hold an integer.
Dim LCV(0 to 9) as integer
Create a one dimension Array with 10 "Slots" numbered 0 to 9, where each "slot" can only hold a String.
Dim LCV(0 to 9) as String
General Practice is to create Arrays that can hold any Type:
Create a Variant Variable that can hold darn near anything, and can be turned into an array
Dim LCV
Turn a Variant into a 2D array 10 "Rows" deep and 10 "Columns" wide
Redim LCV(1 to 10, 2 to 11)
Create a filled Array from a Variant Variable
LCV = Array(1,"Abc",42,"DEf",2,3,4,5,6,"X")
Using a loop to fill a 1D array
Dim i as Long
Dim LCV(1 to 10) as Integer
For i = 1 to 10
LCV(i) = i 'VBA Converts Long i to an integer to fit the array "Slot". The Index i is a long.
Next i
Using loops to fill a 2D array
Dim i as Long, j As Long
Dim LCV
Redim LCV (1 To 10, 7 To 20)
For i = 1 To 10
For j = 7 To 20
LCV(i, j) = i x j
Next j
Next i
'Show the result on sheet1
Sheets("Sheet1").Range("A1").Resize(10, 14) = LCV.Value
Also see: http://www.snb-vba.eu/VBA_Arrays_en.html
Paul92688
07-15-2021, 02:01 PM
1. I think you're out of luck
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/fornext-statement
Syntax
For counter = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
The For…Next statement syntax has these parts:
Part
Description
counter
Required. Numeric variable (https://docs.microsoft.com/en-us/office/vba/language/glossary/vbe-glossary#variable) used as a loop counter. The variable can't be a Boolean (https://docs.microsoft.com/en-us/office/vba/language/glossary/vbe-glossary#boolean-data-type) or an array (https://docs.microsoft.com/en-us/office/vba/language/glossary/vbe-glossary#array) element.
start
Required. Initial value of counter.
end
Required. Final value of counter.
step
Optional. Amount counter is changed each time through the loop. If not specified, step defaults to one.
statements
Optional. One or more statements between For and Next that are executed the specified number of times.
[/CODE]
Thanks - I googled around before posting and I believe I saw that page. I remember wondering what could possibly cause me to use a Boolean variable as a loop control variable. Probably while chuckling to myself over that, I missed the rest of the line. If ONLY they had the foresight to highlight it in RED as you did, I wouldn't have posted. But then again, It would have not caused me to find this BBS and sign up. Happy accident as far as I am concerned.
Paul92688
07-15-2021, 02:04 PM
Thanks for the pointers. I am trying to create a program that will allow for a dynamic number of loops and using a one dimensional array was key in my effort. I will need to change to a different type of loop, one that hopefully allows for array variables. Once I get the logic down for dynamic looping, I am planning on re-doing the code recursively.
Paul
The loop Control can run from n to an array element
Dim i as long
For i = n to Array(y) 'where Element y in the array is a Numerical value
'
'
'
Next x
Here's two examples (http://www.vbaexpress.com/forum/showthread.php?68978) of dynamic loops, one from Paul and the other from myself.
Paul_Hossler
07-15-2021, 05:29 PM
SamT -- I believe (from the OP's first post) that he wants to use array elements as loop control indexes (indicies??)
For A(1) = 1 to 100
For A(2) = 1 to 100
Next A(1)
Next A(2)
You can if the loops are not nested, but I don't know how useful that'd be
Sub TestForLoopVariableName()
Dim counter As Long
Dim LCV(2) As Long
MsgBox VarPtr(LCV(1)) & " -- " & VarPtr(LCV(2))
For LCV(1) = 1 To 10
counter = counter + 1
Next LCV(1)
MsgBox counter
For LCV(2) = 1 To 100
counter = counter + 1
Next LCV(2)
MsgBox counter
End Sub
My assumption is that the 'complier' uses the Long at the 'For ' variable address as a loop control, so the Long at address (1) is used then the Long at address (2) is used
I believe (from the OP's first post) that he wants to use array elements as loop control indexes (indicies??)
Yeah, that was obvious. And that's the part that doesn't make logical programming sense to me.
For Array(Element #x) = n to n'
If that is even possible: Increment the array Element and run the inner loop code.
That is why I "shotgunned" my answer to cover many aspects of arrays and loops.
Sub M_snb()
M_loop "abcdefg"
M_loop "hijklmnop"
End Sub
Sub M_loop(c00)
for j=1 to len(c00)
x= x+2^j
next
msgbox x
End Sub
or
Sub M_snb()
sn = Split("4 10")
For j = 1 To sn(0)
For jj = 1 To sn(1)
y = y + 1
Next
Next
MsgBox y
End Sub
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.