Structure
The structure of a For Next loop is as follows.
For counter = start to end [step] Set of Instructions Next counter
Counting From 1 to 10 Example
This simple For Next procedure enters values 1 to 10 in column A. Each time the loop repeats the value x increases by 1.
Sub CountOneToTen()
Dim x As Byte
For x = 1 To 10
Cells(x, 1) = x
Next x
End Sub
The code above relates to the data shown below.
Twelve Times Table (Using Step) Example
In this For Next example we use a Step value of 12. So rather than incrementing by 1, the counter will increment by 12.
Sub TwelveTimesTable()
Dim x As Byte
Dim y As Byte
For x = 12 To 144 Step 12
y = x / 12
Cells(y, 1) = x
Next x
End Sub
The code above relates to the data shown below.
Full TimesTable (Nested For Next) Example
In this For Next example we need to increment two variables: x and y so that we can produce a complete times table. On the first loop of x, y will equal 1, then 2, then 3, then 4 and so on up to 12. On the second loop of x the same thing will happen. This will keep going for 12 loops of x.
Sub FullTimesTable()
Dim x As Byte
Dim y As Byte
For x = 1 To 12
For y = 1 To 12
Cells(x, y) = x * y
Next y
Next x
Range(Cells(1, 1), Cells(x, y)).Columns.AutoFit
End Sub
The code above relates to the data shown below.
For Next Loop With User Input Example
This For Next example is similar to the last example, except x and y’s maximum value is set by the user. When the procedure runs, the following Input Box is displayed, allowing the user to specify a value. So if the user entered 15, the For Next loop would loop 15 times for both x and y.
Sub FullTimesTableWithUserInput()
Dim x As Long
Dim y As Long
Dim UserInput As Long
UserInput = _
InputBox("Up to what number would you like the times table to be created?")
For x = 1 To UserInput
For y = 1 To UserInput
Cells(x, y) = x * y
Next y
Next x
Range(Cells(1, 1), Cells(x, y)).Columns.AutoFit
End Sub
Shade Alternate Rows Example
This For Next example changes the background colour of alternate rows within a database. A step value of 2 is used to achieve this.
Sub ShadeAlternateRows()
Dim NumberOfRows As Long
Dim x As Long
NumberOfRows = Range("A1", Range("A1").End(xlDown)).Count
For x = 2 To NumberOfRows Step 2
Cells(x, 1).Resize(1, 5).Interior.Color = vbYellow
Next x
End Sub
The code above relates to the data shown below.
Exit For Loop Example
Sometimes you just want to loop through a range of cells but stop looping once a specified value is found. If this is the case you can use the Exit For statement. In the example below the For Next loop, loops through the sales people’s names until it finds the name specified by the user. Once it finds the name, the For Next loop is exited and the remainder of the code can commence.
Sub ExitForExample()
Dim x As Long
Dim SalesPersonSales As Range
Dim TotalSales As Currency
Dim NumberOfRows As Long
NumberOfRows = Range("A1", Range("A1").End(xlDown)).Count
Dim SalesPersonsName As String
'Ask for the name of the sales person
SalesPersonsName = InputBox("Please enter the name of the sales person")
'Loop through the list of sales people until name found
For x = 2 To NumberOfRows
If Cells(x, 1) = SalesPersonsName Then Exit For
Next x
'When name found...
'Clear exiting row formats
Range("A1", Range("A1").End(xlToRight).End(xlDown)).Interior.Color = xlNone
'Format the sales persons row with yellow background
Cells(x, 1).Resize(1, 7).Interior.Color = vbYellow
'Specify the range of cells to add up
Set SalesPersonSales = Cells(x, 1).Offset(0, 1).Resize(1, 6)
'Calculate the total sales
TotalSales = WorksheetFunction.Sum(SalesPersonSales)
'Tell the user what the total sales is
MsgBox SalesPersonsName & " made a total sales of " & Format(TotalSales, "Currency")
End Sub
The code above relates to the data shown below.
Format Cells Based on Conditional Criteria
With this For Next example we are formatting sales values that have met a sales target. The maximum value for x is the last row number within our database. In previous examples where we had contiguous values we could calculate x using this line of code:
NumberOfRows = Range("A1", Range("A1").End(xlDown)).Count
However in this example our data is not contiguous, so we have to approach it in a slightly different way: we use the End property to move up from the last cell in the worksheet.
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
Here is the code for this macro.
Sub FormatCellsInListWithGaps()
Dim LastRow As Long
Dim x As Long
'Work out which is the last cell used in column B
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
'Clear any existing formats in column C
Range("C3", Cells(LastRow, 3)).Interior.Color = xlNone
For x = 3 To LastRow
If Cells(x, 3) > 200000 Then Cells(x, 3).Interior.Color = vbGreen
Next x
End Sub
The code above relates to the data shown below.
Delete Blank Rows Example
This For Next example deletes blank rows within a database. The worksheet functions COUNTA is used to count the number of cells that contain a value. If the row total is 0, then the row gets deleted.
Sub DeleteBlankRows()
Dim NumberOfRows As Long, x As Long
Dim CurrentRow As Range
NumberOfRows = Cells(Rows.Count, 1).End(xlUp).Row
For x = 1 To NumberOfRows
Set CurrentRow = Cells(x, 1).EntireRow
If WorksheetFunction.CountA(CurrentRow) = 0 Then CurrentRow.Delete
Next x
End Sub
The code above relates to the data shown below.
Investment Example
This example creates a simple projection on investment. See comments for explanation.
Sub Investment()
Dim Investment As Double
Dim Term As Integer
Dim Rate As Single
Dim ws As Worksheet
Set ws = ActiveSheet
'Ask user series of questions about investment
Investment = InputBox("What amount are you going to invest?")
Term = InputBox("For how many years will you invest?")
Rate = InputBox("What's the interest you will get?")
'Delete previous projections
ws.UsedRange.Clear
'Add headings and apply formatting
Range("A1") = "Projection based on an initial investment of " & _ Format(Investment, "Currency") & _
" over " & Term & " years with a " & Format(Rate / 100, "Percent") & _
" interest rate."
Range("A1").Font.ColorIndex = 3
Range("A2") = "Year"
Range("B2") = "Balance"
Range("A2", "B2").Font.Bold = True
With Range("A2", "B" & Term + 2)
.NumberFormat = "£#,##0.00"
.Borders.LineStyle = xlContinuous
End With
'Loop through to calculate balance for each year of investment
For x = 3 To Term + 2
Investment = Investment * (1 + Rate / 100)
Cells(x, 1) = "Year " & x - 2
Cells(x, 2) = Investment
Next
'Create and format a total row label
With Cells(Term + 5, 1)
.Value = "Total Interest"
End With
With Range(Cells(Term + 5, 1), Cells(Term + 5, 2))
.Font.Bold = "True"
.Borders.LineStyle = xlContinuous
End With
'Calculate the total interest from investment
With Cells(Term + 5, 2)
.Value = Cells(Term + 2, 2) - Range("B3")
.NumberFormat = "£#,##0.00"
End With
End Sub
The code above relates to the data shown below.








