This Excel tutorial explains how to use the Excel FOR…NEXT statement to create a FOR loop in VBA with syntax and examples.
Description
The Microsoft Excel FOR…NEXT statement is used to create a FOR loop so that you can execute VBA code a fixed number of times.
The FOR…NEXT statement is a built-in function in Excel that is categorized as a Logical Function. It can be used as a VBA function (VBA) in Excel. As a VBA function, you can use this function in macro code that is entered through the Microsoft Visual Basic Editor.
Subscribe
If you want to follow along with this tutorial, download the example spreadsheet.
Download Example
Syntax
The syntax to create a FOR Loop using the FOR…NEXT statement in Microsoft Excel is:
For counter = start To end [Step increment] {...statements...}
Next [counter]
Parameters or Arguments
- counter
- The loop counter variable.
- start
- The starting value for counter.
- end
- The ending value for counter.
- increment
- Optional. The value that counter is incremented each pass through the loop. It can be a positive or negative number. If not specified, it will default to an increment of 1 so that each pass through the loop increases counter by 1.
- statements
- The statements of code to execute each pass through the loop.
Returns
The FOR…NEXT statement creates a FOR loop in VBA.
Example (as VBA Function)
The FOR…NEXT statement can only be used in VBA code in Microsoft Excel.
Let’s look at how to create a FOR loop in Microsoft Excel, starting with a single loop, double loop, and triple loop, and then exploring how to change the value used to increment the counter each pass through the loop.
Single Loop
The simplest implementation of the FOR loop is to use the FOR…NEXT statement to create a single loop. This will allow you to repeat VBA code a fixed number of times.
For example:
Sub Single_Loop_Example Dim LCounter As Integer For LCounter = 1 To 5 MsgBox (LCounter) Next LCounter End Sub
In this example, the FOR loop is controlled by the LCounter variable. It would loop 5 times, starting at 1 and ending at 5. Each time within the loop, it would display a message box with the value of the LCounter variable. This code would display 5 message boxes with the following values: 1, 2, 3, 4, and 5.
Single Loop — Changing Increment
By default, the FOR loop will increment its loop counter by 1, but this can be customized. You can use STEP increment
to change the value used to increment the counter. The FOR loop can be increment can be either positive or negative values.
Positive Increment
Let’s first look at an example of how to increment the counter of a FOR loop by a positive value.
For example:
Sub Increment_Positive_Example Dim LCounter As Integer For LCounter = 1 To 9 Step 2 MsgBox LCounter Next LCounter End Sub
In this example, we’ve used Step 2
in the FOR loop to change the increment to 2. What this means is that the FOR loop would start at 1, increment by 2, and end at 9. The code would display 5 message boxes with the following values: 1, 3, 5, 7, and 9.
Negative Increment
Now, let’s look at how to increment the counter of a FOR loop by a negative value.
For example:
Sub Increment_Negative_Example Dim LCounter As Integer For LCounter = 50 To 30 Step -5 MsgBox LCounter Next LCounter End Sub
When you increment by a negative value, you need the starting number to be the higher value and the ending number to be the lower value, since the FOR loop will be counting down. So in this example, the FOR loop will start at 50, increment by -5, and end at 30. The code would display 5 message boxes with the following values: 50, 45, 40, 35, and 30.
Double Loop
Next, let’s look at an example of how to create a double FOR loop in Microsoft Excel.
For example:
Sub Double_Loop_Example Dim LCounter1 As Integer Dim LCounter2 As Integer For LCounter1 = 1 To 4 For LCounter2 = 8 To 9 MsgBox LCounter1 & "-" & LCounter2 Next LCounter2 Next LCounter1 End Sub
Here we have 2 FOR loops. The outer FOR loop is controlled by the LCounter1 variable. The inner FOR loop is controlled by the LCounter2 variable.
In this example, the outer FOR loop would loop 4 times (starting at 1 and ending at 4) and the inner FOR loop would loop 2 times (starting at 8 and ending at 9). Within the inner loop, the code would display a message box each time with the value of the LCounter1—LCounter2. So in this example, 8 message boxes would be displayed with the following values: 1-8, 1-9, 2-8, 2-9, 3-8, 3-9, 4-8, and 4-9.
Triple Loop
Next, let’s look at an example of how to create a triple FOR loop in Microsoft Excel.
For example:
Sub Triple_Loop_Example Dim LCounter1 As Integer Dim LCounter2 As Integer Dim LCounter3 As Integer For LCounter1 = 1 To 2 For LCounter2 = 5 To 6 For LCounter3 = 7 To 8 MsgBox LCounter1 & "-" & LCounter2 & "-" & LCounter3 Next LCounter3 Next LCounter2 Next LCounter1 End Sub
Here we have 3 FOR loops. The outer-most FOR loop is controlled by the LCounter1 variable. The next FOR loop is controlled by the LCounter2 variable. The inner-most FOR loop is controlled by the LCounter3 variable.
In this example, the outer-most FOR loop would loop 2 times (starting at 1 and ending at 2) , the next FOR loop would loop 2 times (starting at 5 and ending at 6), and the inner-most FOR loop would loop 2 times (starting at 7 and ending at 8).
Within the inner-most loop, the code would display a message box each time with the value of the LCounter1—LCounter2—LCounter3. This code would display 8 message boxes with the following values: 1-5-7, 1-5-8, 1-6-7, 1-6-8, 2-5-7, 2-5-8, 2-6-7, and 2-6-8.
Example#1 from Video
In the first video example, we are going to use the For…Next statement to loop through the products in column A and update the appropriate application type in column B.
Sub totn_for_loop_example1() Dim LCounter As Integer For LCounter = 2 To 4 If Cells(LCounter, 1).Value = "Excel" Then Cells(LCounter, 2).Value = "Spreadsheet" ElseIf Cells(LCounter, 1).Value = "Access" Then Cells(LCounter, 2).Value = "Database" ElseIf Cells(LCounter, 1).Value = "Word" Then Cells(LCounter, 2).Value = "Word Processor" End If Next LCounter End Sub
Example#2 from Video
In the second video example, we have a list of participants in column A and we’ll use two FOR Loops to assign each of the participants to either Team A or Team B (alternating between the two).
Sub totn_for_loop_example2() Dim LCounter1 As Integer Dim LCounter2 As Integer For LCounter1 = 2 To 9 Step 2 Cells(LCounter1, 2).Value = "Team A" Next LCounter1 For LCounter2 = 3 To 9 Step 2 Cells(LCounter2, 2).Value = "Team B" Next LCounter2 End Sub
В этом учебном материале вы узнаете, как использовать Excel оператор FOR … NEXT для создания цикла FOR в VBA с синтаксисом и примерами.
Описание
Оператор Microsoft Excel FOR … NEXT используется для создания цикла FOR, чтобы вы могли выполнять код VBA определенное количество раз. Оператор FOR … NEXT является встроенной функцией Excel, которая относится к категории логических функций. Её можно использовать как функцию VBA в Excel.
В качестве функции VBA вы можете использовать эту функцию в коде макроса, который вводится через редактор Microsoft Visual Basic Editor.
Синтаксис
Синтаксис для создания цикла FOR с использованием оператора FOR … NEXT в Microsoft Excel:
For counter = start To end [Step increment] {…statements…}Next [counter]
Аргументы или параметры
- counter
- Переменная счетчика цикла.
- start
- Начальное значение для
counter
. - end
- Конечное значение для
counter
. - increment
- По желанию. Значение
counter
увеличивается при каждом проходе цикла. Это может быть положительное или отрицательное число.
Если не указано, по умолчанию будет приращение 1, так что каждый проход через цикл увеличиваетcounter
на 1. - statement
- Операторы кода для выполнения каждого прохода через цикл.
Возвращаемое значение
Оператор FOR … NEXT создает цикл FOR в VBA.
Примечание
- См. также инструкцию WHILE … WEND, чтобы создать цикл WHILE в VBA.
Применение
- Excel для Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 для Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000
Тип функции
- Функция VBA
Пример (как функция VBA)
Оператор FOR … NEXT может использоваться только в коде VBA в Microsoft Excel.
Давайте посмотрим, как создать цикл FOR в Microsoft Excel, начиная с одинарного цикла, двойной цикл и тройной цикл, а затем исследуем, как изменить значение, используемое для увеличения счетчика при каждом прохождении цикла.
Одинарный цикл
Простейшей реализацией цикла FOR является использование оператора FOR … NEXT для создания одного цикла. Это позволит вам повторять код VBA фиксированное количество раз, например:
Sub Single_Loop_Example Dim LCounter As Integer For LCounter = 1 To 5 MsgBox (LCounter) Next LCounter End Sub |
В этом примере цикл FOR управляется переменной LCounter. Он будет повторяться 5 раз, начиная с 1 и заканчивая 5. Каждый раз внутри цикла он будет отображать окно сообщения со значением переменной LCounter. Этот код отобразит 5 окон сообщений со следующими значениями: 1, 2, 3, 4 и 5.
Одинарный цикл — изменение приращения
По умолчанию цикл FOR увеличивает свой счетчик цикла на 1, но это можно настроить. Вы можете использовать Step increment
, чтобы изменить значение, используемое для увеличения счетчика. Приращение цикла FOR может иметь как положительные, так и отрицательные значения.
Положительное приращение
Давайте сначала рассмотрим пример того, как увеличить счетчик цикла FOR на положительное значение.
Например:
Sub Increment_Positive_Example Dim LCounter As Integer For LCounter = 1 To 9 Step 2 MsgBox LCounter Next LCounter End Sub |
В этом примере мы использовали шаг 2 в цикле FOR, чтобы изменить приращение на 2. Это означает, что цикл FOR будет начинаться с 1, увеличиваться на 2 и заканчиваться на 9. Код будет отображать 5 окон сообщений со следующими значениями: 1, 3, 5, 7 и 9.
Отрицательное приращение
Теперь давайте посмотрим, как увеличить счетчик цикла FOR на отрицательное значение.
Например:
Sub Increment_Negative_Example Dim LCounter As Integer For LCounter = 50 To 30 Step —5 MsgBox LCounter Next LCounter End Sub |
Когда вы увеличиваете на отрицательное значение, вам нужно, чтобы начальное число был с более высоким значением, а конечное число — с меньшим значением, поскольку цикл FOR будет вести обратный отсчет. Итак, в этом примере цикл FOR будет начинаться с 50, увеличиваться на -5 и заканчиваться на 30. Код отобразит 5 окон сообщений со следующими значениями: 50, 45, 40, 35 и 30.
Двойной цикл
Теперь давайте рассмотрим пример создания двойного цикла FOR в Microsoft Excel.
Например:
Sub Double_Loop_Example Dim LCounter1 As Integer Dim LCounter2 As Integer For LCounter1 = 1 To 4 For LCounter2 = 8 To 9 MsgBox LCounter1 & «-« & LCounter2 Next LCounter2 Next LCounter1 End Sub |
Здесь у нас есть 2 цикла FOR. Внешний цикл FOR управляется переменной LCounter1. Внутренний цикл FOR управляется переменной LCounter2. В этом примере внешний цикл FOR будет повторяться 4 раза (начиная с 1 и заканчивая 4), а внутренний цикл FOR будет повторяться 2 раза (начиная с 8 и заканчивая 9). Во внутреннем цикле код будет каждый раз отображать окно сообщения со значением LCounter1-LCounter2. Таким образом, в этом примере будут отображаться 8 окон сообщений со следующими значениями: 1-8, 1-9, 2-8, 2-9, 3-8, 3-9, 4-8 и 4-9.
Тройной цикл
Теперь давайте рассмотрим пример того, как создать тройной цикл FOR в Microsoft Excel.
Например:
Sub Triple_Loop_Example Dim LCounter1 As Integer Dim LCounter2 As Integer Dim LCounter3 As Integer For LCounter1 = 1 To 2 For LCounter2 = 5 To 6 For LCounter3 = 7 To 8 MsgBox LCounter1 & «-« & LCounter2 & «-« & LCounter3 Next LCounter3 Next LCounter2 Next LCounter1 End Sub |
В приведенном выше примере у нас есть 3 цикла FOR. Самый внешний цикл FOR управляется переменной LCounter1. Следующий цикл FOR управляется переменной LCounter2. Самый внутренний цикл FOR управляется переменной LCounter3. В этом примере самый внешний цикл FOR будет повторяться 2 раза (начиная с 1 и заканчивая 2), следующий цикл FOR будет повторяться 2 раза (начиная с 5 и заканчивается на 6), а самый внутренний цикл FOR будет повторяться 2 раза (начиная с 7 и заканчивая 8). Внутри самого внутреннего цикла код будет каждый раз отображать окно сообщения со значением LCounter1-LCounter2 -LCounter3. Этот код отображает 8 окон сообщений со следующими значениями: 1-5-7, 1-5-8, 1-6-7, 1-6-8, 2-5-7, 2-5-8, 2- 6-7 и 2-6-8.
This post provides a complete guide to the standard VBA For Loop and the VBA For Each Loop.
If you are looking for information about the VBA While and VBA Do Loop then go here.
If you want some quick info about the For loops then check out the Quick Guide table in the section below.
If you are looking for information on a particular topic then check out the Table of Contents below.
“History is about loops and continuums” – Mike Bidlo.
Related Links for the VBA For Loop
The Complete Guide to Ranges in Excel VBA.
The Complete Guide to Copying Data in Excel VBA.
VBA Do While Loop.
A Quick Guide to the VBA For Loop
Loop format | Description | Example |
---|---|---|
For … Next | Run 10 times | For i = 1 To 10 Next |
For … Next | Run 5 times. i=2,4, 6 etc. | For i = 2 To 10 Step 2 Next |
For … Next | Run in reverse order | For i = 10 To 1 Step -1 Debug.Print i Next |
For … Next | Go through Collection | For i = 1 To coll.Count Debug.Print coll(i) Next |
For … Next | Go through array | For i = LBound(arr) To UBound(arr) Debug.Print arr(i) Next i |
For … Next | Go through 2D array | For i = LBound(arr) To UBound(arr) For j = LBound(arr,2) To UBound(arr,2) Debug.Print arr(i, j) Next j Next i |
For Each … Next | Go through Collection | Dim item As Variant For Each item In coll Debug.Print item Next item |
For Each … Next | Go through array | Dim item As Variant For Each item In arr Debug.Print item Next item |
For Each … Next | Go through 2D array | Dim item As Variant For Each item In arr Debug.Print item Next item |
For Each … Next | Go through Dictionary | Dim key As Variant For Each key In dict.Keys Debug.Print key, dict(key) Next key |
Both types | Exit Loop | For i = 1 To 10 If Cells(i,1) = «found» Then Exit For End If Next i |
The VBA For Loop Webinar
If you are a member of the website, click on the image below to view the webinar for this post.
(Note: Website members have access to the full webinar archive.)
Introduction to the VBA For Loop
Loops are by far the most powerful component of VBA. They are the rocket fuel of your Macros. They can perform tasks in milliseconds that would take humans hours. They also dramatically reduce the lines of code your applications need.
For Loops have been part of all major programming languages since they were first used with Fortan in 1957.
If you have never used loops before then this post is a great place to start. It provides an in-depth guide to loops, written in plain English without the jargon.
Let’s start with a very important question – what are loops and why do we need them?
What are VBA For Loops?
A loop is simply a way of running the same lines of code a number of times. Obviously running the same code over and over would give the same result.
So what is important to understand is that the lines of code normally contain a variable that changes slightly each time the loop runs.
For example, a loop could write to cell A1, then cell A2, A3 and so on. The slight change each time is the row.
Let’s look at a simple example.
VBA For Loop Example 1
The following code prints the values 1 to 5 in the Immediate Window(Ctrl + G to view).
Debug.Print 1 Debug.Print 2 Debug.Print 3 Debug.Print 4 Debug.Print 5
The Immediate Window
If you have not used the Immediate Window before then this section will get you up to speed quickly.
The function Debug.Print writes values to the Immediate Window. To view this window select View->Immediate Window from the menu( the shortcut is Ctrl + G)
VBA For Loop Example 2
Now imagine we want to print out the numbers 1 to 20. We would need to add 15 more lines to the example above.
However, using a loop we only need to write Debug.Print once.
For i = 1 To 20 Debug.Print i Next i
The output is:
Output
If we needed print the numbers 1 to 1000 then we only need to change the 20 to 1000.
Normally when we write code we would use a variable instead of a number like 20 or 1000. This gives you greater flexibility. It allows you to decide the number of times you wish to run the loop when the code is running. The following example explains this.
VBA For Loop Example 3
A common task in Excel is read all the rows with with data.
The way you approach this task is as follows
- Find the last row with data
- Store the value in variable
- Use the variable to determine how many times the loop runs
Using a variable in the loop makes your code very flexible. Your will work no matter how many rows there are.
Let’s have a look at an example. Imagine you receive a sheet with a list of fruit types and their daily sales. You want to count the number of Oranges sold and this list will vary in size depending on sales.
The following screenshot shows an example of this list
Sample Data of Fruit Sales
We can use the code to count the oranges
' https://excelmacromastery.com/ Sub CountFruit() ' Get the last row with text Dim LastRow As Long LastRow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row Dim i As Long, Total As Long ' Use LastRow in loop For i = 2 To LastRow ' Check if cell has text "Orange" If Sheet1.Cells(i, 1).Value = "Oranges" Then ' Add value in column B to total Total = Total + Sheet1.Cells(i, 2).Value End If Next i ' Print total Debug.Print "Total oranges sold was:"; Total End Sub
You can try this code for yourself. Change the number of fruit items and you will see that the code still works fine.
If you were to increase the number fruit items to a large value like 10,000 then you will hardly notice the difference in the time it takes to run – almost instantly.
Loops are super fast. This is what makes them so powerful. Imagine performing a manual task on 10,000 cells. It would take a considerable amount of time.
Advantages of the VBA For Loop
4To conclude this section we will list the major advantages of using loops
- They reduce the lines code you need
- They are flexible
- They are fast
In the next sections we will look at the different types of loops and how to use them.
The Standard VBA For Loop
The VBA For loop is the most common loop you will use in Excel VBA. The For Loop is used when you can determine the number of times it will be run. For example, if you want to repeat something twenty times.
YouTube Video For Loop
Check out this YouTube Video of the For Loop:
Get the workbook and code for this video here
Format of the Standard VBA For Loop
The Standard VBA For Loop has the following format:
For <variable> = <start value> to <end value>
Next <variable>
The start and end values can be variables. Also the variable after Next is optional but it is useful and it makes it clear which for loop it belongs to.
How a For Loop Works
Let’s look at a simple for loop that prints the numbers 1 to 3
Dim i As Long For i = 1 To 3 Debug.Print i Next i
How this code works is as follows
i is set to 1
The value of i(now 1) is printed
i is set to 2
The value of i(now 2) is printed
i is set to 3
The value of i(now 3) is printed
If we did not use a loop then the equivalent code would be
Dim i As Long i = i + 1 Debug.Print i i = i + 1 Debug.Print i i = i + 1 Debug.Print i
The i = i + 1 line is used to add 1 to i and is a common way in programming to update a counter.
Using Step with the VBA For Loop
You can see that i is increased by one each time. This is the default. You can specify this interval using Step keyword.
The next example shows you how to do this:
' Prints the even numbers i.e. 2,4,6,8 ... 20 For i = 2 To 20 Step 2 Debug.Print i Next i
You can use a negative number with Step which will count in reverse
' Prints the even numbers in reverse i.e. 20,18,16,14 ... 2 For i = 20 To 2 Step -2 Debug.Print i Next i
Note: if Step is positive then your starting number must be lower than you ending number. The following loop will not run because the starting number 20 is greater than 10. VBA therefore, thinks it has already reached the target value 10.
' Will not run as starting number already greater than 10 For i = 20 To 10 Step 1 Debug.Print i Next i
If Step is negative then the start number must be greater than the end number.
Exit the For Loop
Sometimes you may want to leave the loop earlier if a certain condition occurs. For example if you read bad data.
You can use Exit For to automatically leave the loop as shown in the following code
For i = 1 To 1000 ' If cell is blank then exit for If Cells(i, 1) = "" Then MsgBox "Blank Cell found - Data error" Exit For End If Next i
Using the VBA For Loop with a Collection
The For loop can also be used to read items in a Collection.
In the following example, we display the name of all the open workbooks
Dim i As Long For i = 1 To Workbooks.Count Debug.Print Workbooks(i).FullName Next i
Using Nested For Loops
Sometimes you may want to use a loop within a loop. An example of this would be where you want to print the names of the worksheets of each open workbook.
The first loop would go through each workbook. Each time this loop runs it would use a second loop to go through all the worksheets of that workbook. It is actually much easier to do than it sounds.
The following code shows how:
' https://excelmacromastery.com/ Sub ListWorksheets() Dim i As Long, j As Long ' First Loop goes through all workbooks For i = 1 To Workbooks.Count ' Second loop goes through all the worksheets of workbook(i) For j = 1 To Workbooks(i).Worksheets.Count Debug.Print Workbooks(i).Name + ":" + Worksheets(j).Name Next j Next i End Sub
This works as follows:
The first loop sets i to 1
The second loop then uses the workbook at 1 to go through the worksheets.
The first loop sets i to 2
The second loop then uses the workbook at 2 to go through the worksheets.
and so on
It the next section we will use a For Each loop to perform the same task. You will find the For Each version much easier to read.
The VBA For Each Loop
The VBA For Each loop is used to read items from a collection or an array. We can use the For Each loop to access all the open workbooks. This is because Application.Workbooks is a collection of open workbooks.
This is a simple example of using the For Each Loop
Dim wk As Workbook For Each wk In Workbooks Debug.Print wk.FullName Next wk
Format of the VBA For Each Loop
You can see the format of the VBA for each loop here(See Microsoft For Each Next documentation):
For Each <variable> in <collection>
Next <variable>
To create a For Each loop we need a variable of the same type that the collection holds. In the example here we created a variable of type Workbook.
If the collection has different types of items we can declare the variable as a variant.
VBA contains a collection called Sheets. This is a collection of sheets of type Worksheet(normal) and Chart(when you move a chart to be a full sheet). To go through this collection you would declare the variable as a Variant.
The following code uses For Each to print out the name of all the sheets in the current workbook
Dim sh As Variant For Each sh In ThisWorkbook.Sheets Debug.Print sh.Name Next sh
Order of Items in the For Loop
For Each goes through items in one way only.
For example, if you go through all the worksheets in a workbook it will always go through from left to right. If you go through a range it will start at the lowest cell e.g. Range(“A1:A10”) will return A1,A2,A3 etc.
This means if you want any other order then you need to use the For loop.
Both loops in the following example will read the worksheets from left to right:
' Both loops read the worksheets from left to right Dim wk As Worksheet For Each wk In ThisWorkbook.Worksheets Debug.Print wk.Name Next Dim i As Long For i = 1 To ThisWorkbook.Worksheets.Count Debug.Print ThisWorkbook.Worksheets(i).Name Next
As you can see the For Each loop is neater to write. However if you want to read the sheets in any other order e.g. right to left then you have to use the for loop:
' Reading the worksheets from right to left Dim i As Long For i = ThisWorkbook.Worksheets.Count To 1 Step -1 Debug.Print ThisWorkbook.Worksheets(i).Name Next
Using the VBA For Each Loop With Arrays
One thing to keep in my is that the For Each loop is that it is read-only when you use it with arrays.
The following example demonstrates this:
' https://excelmacromastery.com/ Sub UseForEach() ' Create array and add three values Dim arr() As Variant arr = Array("A", "B", "C") Dim s As Variant For Each s In arr ' Changes what s is referring to - not value of array item s = "Z" Next ' Print items to show the array has remained unchanged For Each s In arr Debug.Print s Next End Sub
In the first loop we try to assign s to “Z”. When happens is that s is now referring the string “Z” and no longer to the item in the array.
In the second loop we print out the array and you can see that none of the values have changed.
When we use the For Loop we can change the array item. If we change the previous code to use the For Loop you it will change all the array values to “Z”
' https://excelmacromastery.com/ Sub UsingForWithArray() ' Create array and add three values Dim arr() As Variant arr = Array("A", "B", "C") Dim i As Long For i = LBound(arr) To UBound(arr) ' Changes value at position to Z arr(i) = "Z" Next ' Print items to show the array values have change For i = LBound(arr) To UBound(arr) Debug.Print arr(i) Next End Sub
If your Collection is storing Objects the you can change the items using a For Each loop.
Using Nested For Each Loops
We saw already that you can have a loop inside other loops. Here is the example from above:
' https://excelmacromastery.com/ Sub ListWorksheets() Dim i As Long, j As Long ' First Loop goes through all workbooks For i = 1 To Workbooks.Count ' Second loop goes through all the worksheets of workbook(i) For j = 1 To Workbooks(i).Worksheets.Count Debug.Print Workbooks(i).Name + ":" + Worksheets(j).Name Next j Next i End Sub
This time we will use the For Each loop to perform the same task:
' https://excelmacromastery.com/ Sub ReadAllWorksheets() Dim wk As Workbook, sh As Worksheet ' Read each workbook For Each wk In Workbooks ' Read each worksheet in the wk workbook For Each sh In wk.Worksheets ' Print workbook name and worksheet name Debug.Print wk.Name + ": " + sh.Name Next sh Next wk End Sub
As you can see this is a neater way of performing this task than using the For Loop:
This code run as follows:
- Get the first Workbook from the Workbooks collection
- Go through all the worksheets in this workbook
- Print the workbook/worksheet details
- Get the next workbooks in the collection
- Repeat steps 2 to 3
- Continue until no more workbooks are left in the collection
How to Loop Through a Range
In Excel VBA, the most common use of a For Loop is to read through a range.
Imagine we have the data set in the screenshot below. Our task is to write code that will read through the data and copy the amounts to the column J. We are only going to copy amounts that are greater than 200,000.
The following example shows how we do it:
' Read through an Excel Range using the VBA For Loop ' https://excelmacromastery.com/ Sub ForLoopThroughRange() ' Get the worksheet Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets("Sheet1") ' Get the Range Dim rg As Range Set rg = sh.Range("A1").CurrentRegion ' Delete existing output sh.Range("J1").CurrentRegion.ClearContents ' Set the first output row Dim row As Long row = 1 ' Read through all the rows using the For Loop Dim i As Long For i = 2 To rg.Rows.Count ' Check if amount is greater than 200000 If rg.Cells(i, 4).Value > 200000 Then ' Copy amount to column m sh.Cells(row, "J").Value = rg.Cells(i, 4).Value ' Move to next output row row = row + 1 End If Next i End Sub
This is a very basic example of copying data using Excel VBA. If you want a complete guide to copying data using Excel VBA then check out this post
Summary of the VBA For Loops
The Standard VBA For Loop
- The For loop is slower than the For Each loop.
- The For loop can go through a selection of items e.g. 5 to 10.
- The For loop can read items in reverse e.g. 10 to 1.
- The For loop is not as neat to write as the For Each Loop especially with nested loops.
- To exit a For loop use Exit For.
The VBA For Each Loop
- The For Each loop is faster than the For loop.
- The For Each loop goes through all items in the collectionarray.
- The For Each loop can go through items in one order only.
- The For Each loop is neater to write than a For Loop especially for nested loops.
- To exit a For Each loop use Exit For.
What’s Next?
Free VBA Tutorial If you are new to VBA or you want to sharpen your existing VBA skills then why not try out the The Ultimate VBA Tutorial.
Related Training: Get full access to the Excel VBA training webinars.
(NOTE: Planning to build or manage a VBA Application? Learn how to build 10 Excel VBA applications from scratch.)
A loop is an essential concept for any programming language, and VBA follows the same approach. You can use loops to repeat an action until a specified condition is reached, or move through objects in a group, e.g. all worksheets in a workbook. A loop is an essential concept for programming. In this guide, we’re going to show you how to create a VBA loop in Excel.
Download Workbook
VBA loops can be useful to automate tasks. For example, you may need to protect or unprotect every worksheet at once, iterate a calculation for a specific number of times, or loop cells and store their values into an array until you find an empty cell. The rest is up to your needs and imagination.
VBA has two main loop categories:
- For…Next Loops
- Do Loops
In generally, while For…Next loops are designed for specific amount of iterations, Do loops are good for iterating based on a condition. However, you can modify and configure both loop types by their individual keywords. Let’s see the loop types with examples.
For…Next VBA Loop
For…Next (also known as For) loops are where you start to create VBA loops in Excel. A For loop is a basic concept of a loop structure in all programming languages. A For…Next loop is good for if you want to iterate you code certain amount of times, and for when you need to use the counter. For example, if you want to check cells from A1 to A10, a counter clicks from 1 to 10 can work in that case. Let’s see its syntax and an example.
Syntax
For counter = start To end [ Step step ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
Part | Description |
counter | Required. Numeric variable used as a loop counter. The variable can’t be a Boolean or an 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 a specific number of times. |
Example 1 – Basic Form
In the first example of For…Next loop, we attempt to write serial numbers into the cells in A1:A10. In this code, For…Next loop sets values from 1 to 10 into the variable i. After the variable gets its value, you can use it in the code. We used the variable to specify the row numbers and cell values. Finally, the Next row increases the variable’s row by 1, and cycle goes on until the variable is equal to 11.
Sub FillSerialNumbers() Dim i As Integer For i = 1 To 10 ActiveSheet.Cells(i, 1) = i Next i End Sub
Example 2 – Step
By default, For…Next loop increases its counter variable by 1 for each loop. You can change this property by using the step argument. To specify a step argument, use the Step keyword after the end argument and enter a number. Step can be either a positive or negative.
The following code is a modified version of the first example. Step 2 argument is added to loop. In this loop, the variable i can only take «1, 3, 5, 7, 9» values.
Sub FillSerialNumbers_Step2() Dim i As Integer For i = 1 To 10 Step 2 ActiveSheet.Cells(i, 1) = i Next i End Sub
Remember to choose appropriate start and end arguments when you need to use a negative step value. For example, For I = 10 To 1 Step -1
Example 3 – Nested Loops
You can create loops within other loops. VBA executes all iterations in an inner loop, for each iteration of the outer loop. This type of structure can be helpful if you want add additional dimensions into your code. For example, while one loop is counting rows, other can count the columns. You need three loops to fill a three-dimensional data array.
The important point is using different counter variables for each loop. Otherwise, there will be leaps for the counter values. Let’s see an example for nested For…Next loops.
The following code contains 2 For…Next loops which is using variables named i and j. In the statement panel, i and j are used as row and column numbers respectively.
In the first run, i becomes 1 and j becomes 2. After code is executed in the j-loop, while i keeps its value (1), j becomes 3. This cycle goes on until j becomes 7. After this, i becomes 2 and j returns back to 2.
Sub FillSerialNumbers_Nested() Dim i As Integer, j As Integer For i = 1 To 10 For j = 2 To 6 ActiveSheet.Cells(i, j) = i * j Next j Next i End Sub
Since j gets numbers between 2 and 6, only columns from B to F are filled.
Example 4 – Exit For
You may want to exit a loop when a certain condition is met. Let’s say we do not want to fill cells if i * j is more than 18. To achieve this, we can use Exit For statement.
The following code uses Exit For in the inner loop. Please note that, Exit For works for only the loop it’s in. Thus, when i * j > 18 condition is met, VBA continues to run the outer loop (i-loop).
Sub FillSerialNumbers_ExitFor() Dim i As Integer, j As Integer For i = 1 To 10 For j = 2 To 6 If i * j > 18 Then Exit For ActiveSheet.Cells(i, j) = i * j Next j Next i End Sub
Example 5 — For Each
A For Each loop is a more specialized version of the For…Next loops. For Each loops can iterate for elements in a list. These elements can be values in an array, cells in a range, or worksheets in workbook. For Each loops doesn’t need a counter, each element is stored in a variable to be used in the code.
Let’s take another example. This time there isn’t a counter variable, but a range object c. For Each loop assigns each cell in the range «A1:C8» to element c, at each iteration. Also, since there is no counter value, we need to increase an integer by 1 in the code.
Sub FillSerialNumbers_ForEach() Dim c As Range, i As Integer i = 0 For Each c In ActiveSheet.Range("A1:C8") i = i + 1 c = i Next c End Sub
This is the last example for the For…Next loops of our how to create a VBA loop in Excel guide. Let’s now move on to the Do loops.
Do VBA Loop
A Do loop looks at whether a condition is met to continue cycling through, or stop a loop. Do loops are more flexible than For…Next loops. On the other hand, this flexibility comes with some complexities.
A Do loop starts with Do and finishes with Loop keywords. You can define a condition for one of these statements. If you specify a condition with Do, VBA looks at the condition first; otherwise, the code block in the loop is executed and the condition is evaluated at the end. This flexibility presents 2 syntaxes.
Also, Do loops can use While and Until keywords to specify the action when a condition is met. If you use the While keyword, the loop continues to work if condition is met. On the other hand, the Until keyword stops the loop.
Syntax
Do [{ While | Until } condition ]
[ statements ]
[ Exit Do ]
[ statements ]
Loop
Or, you can use this syntax:
Do
[ statements ]
[ Exit Do ]
[ statements ]
Loop [{ While | Until } condition ]
Part | Description |
condition | Optional. Numeric expression or string expression that is True or False. If condition is Null, condition is treated as False. |
statements | One or more statements that are repeated while, or until, condition is True. |
Example 1 – Do While
Do While loop iterates its statements as long as the specified conditions are valid. We can modify our first example to work with a Do loop.
In the following example, the Do loop works as many iterations as the variable i is equal or less than 10.
Sub FillSerialNumbers_DoWhile() Dim i As Integer i = 1 Do While i <= 10 ActiveSheet.Cells(i, 1) = i i = i + 1 Loop End Sub
Caution: If you use a loop like this, remember to add a code to change the value of the variable. Otherwise, the code will be stuck in an infinite loop because the variable i will always remain less than 10.
Example 2 — Do Until
This time the loop continues «until» the condition is met. Once it does, the loop ends.
Sub FillSerialNumbers_DoUntil() Dim i As Integer i = 1 Do Until i > 10 ActiveSheet.Cells(i, 1) = i i = i + 1 Loop End Sub
Example 3 – Loop While
You can use conditions after Loop as well. In this scenario, you ensure that the statements are executed at least once before condition validation.
Loop While iterates the loop if the supplied condition is met.
Sub FillSerialNumbers_DoLoopWhile() Dim i As Integer i = 1 Do ActiveSheet.Cells(i, 1) = i i = i + 1 Loop While i <= 10 End Sub
Example 4 – Loop Until
Use Loop Until statement when you need to check the condition after the statements, and want to continue the loop «until» the condition is met.
Sub FillSerialNumbers_DoLoopUntil() Dim i As Integer i = 1 Do ActiveSheet.Cells(i, 1) = i i = i + 1 Loop Until i > 10 End Sub
That’s all! You can now create your own VBA loop to automate your Excel tasks in no time.