In this blog post we will be discussing nested loops and how they can be used.
A loop inside a loop is termed a nested loop. We’ll make a grid of numbers to illustrate.
Sub nestedLoop1() Dim y As Integer Dim x As Integer Dim xString As String For y = 0 To 9 'We start by looping through 0 - 9. This will provide 'us with 10 loops For x = 0 To 9 'Adding a second loop will mean that we end up 'looping a hundred times (10 x 10) xString = xString & x & " " 'On each loop we are concatenating the x 'variable with a space so we have a line that 'goes 0 1 2 3 4 5 etc. Next x Debug.Print xString 'Here we print out the full xString xString = "" 'We reset the xString to nothing Next y End Sub
The output of the above code will be:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 |
Nested Loops and Multidimensional Arrays
Nested loops work very well with multidimensional arrays.
Sub nestedLoop2() Dim y As Integer Dim x As Integer Dim xString As String Dim MyArray(10, 10) As String 'Here we have a multidimensional array of 10 x 10 'This array will be able to hold 100 items For y = 0 To 9 '10 loops here... For x = 0 To 9 '...and 10 more here give us 100 loops! MyArray(y, x) = y * x 'We fill the array element with the 'multiple of x and y Next x Next y For y = 0 To 9 For x = 0 To 9 'And now we loop again and print out the 'results of the code above xString = xString & MyArray(y, x) & " " Next x Debug.Print xString xString = "" Next y End Sub
0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0 2 4 6 8 10 12 14 16 18 0 3 6 9 12 15 18 21 24 27 0 4 8 12 16 20 24 28 32 36 0 5 10 15 20 25 30 35 40 45 0 6 12 18 24 30 36 42 48 54 0 7 14 21 28 35 42 49 56 63 0 8 16 24 32 40 48 56 64 72 0 9 18 27 36 45 54 63 72 81 |
A Useful Implementation of Nested Loops
A more practical example is to iterate over a Collection within a Recordset.
Sub nestedLoop3() Dim rs As DAO.Recordset, field As DAO.field Dim rowText As String Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblStudents") While (Not rs.EOF) 'Loop no1 For Each field In rs.Fields 'Loop no2 'we will be looping through all of the field names in tblStudents rowText = rowText & field.Name & "=" & rs.Fields(field.Name) & ", " 'we use the field name to get the value of that field and create 'a concatenated string to print out. 'e.g. StudentID=15, LastName=Kupova, etc. Next Debug.Print rowText rowText = "" rs.MoveNext Wend End Sub
nestedLoop3 StudentID=1, LastName=Bedecs, FirstName=Anna ‘ … more commented out StudentID=2, LastName=Gratacos Solsona, FirstName=Antonio ‘… StudentID=3, LastName=Axen, FirstName=Thomas, ‘… |
Here the Fields collection is being iterated over and rowText populated with the field’s name and value.
Nested loops can be complicated but are worth the time and effort spent learning them.
Related Posts
DoEvents LoopsLooping Through a Recordset Loops
Loops – Do Until / Do While / Do Loops
Loops – For Each Loops
Loops – For Next Loops
Loops – While Wend Loops
What are Recordsets Loops