You are on page 1of 16

VBA While Loop – A Complete Guide

OCTO BER 14, 2016 BY PAU L KELLY ·0 COMMENTS

“Now… We are going in a loop” ― Ramakrishna, Springs of Indian Wisdom

This post provides a complete guide to the VBA Do While and VBA While Loops. (If you’re looking for information
about the VBA For and For Each loops go here)
The VBA While loop exists to make it compatible with older code. However, Microsoft recommends that you use the Do
Loop as it is more “structured and flexible”. Both of these loops are covered in this post.
For a quick guide to these loops check out the Quick Guide Table below.
If you are looking for something in particular, you can check out the Table of Contents below(if it’s not visible click on
the post header).

Contents [hide] [hide]


 1 A Quick Guide to VBA While Loops
 2 Introduction
 3 For Loops Versus Do While Loops
 4 Conditions
 5 The Do Loop Format
o 5.1 A Do Loop Example
o 5.2 While Versus Until
o 5.3 Examples of While and Until
o 5.4 Example: Checking Objects
 6 Exit Do Loop
 7 While Wend
o 7.1 Format of the VBA While Wend Loop
o 7.2 While Wend vs Do
 8 Infinite Loop
o 8.1 Dealing With an Infinite Loop
 9 Using Worksheet Functions Instead of Loops
 10 Summary
o 10.1 The Do While Loop
o 10.2 The While Wend Loop
 11 What’s Next?
 12 Get the Free eBook

A Quick Guide to VBA While Loops


Loop format Description Example

Do While ... Loop Runs 0 or more time while condition is true Do While result = "Correct"
Loop

Do ... Loop While Runs 1 or more times while condition is true Do


Loop While result = "Correct"

Do Until ... Loop Runs 0 or more times until condition is true Do Until result <> "Correct"
Loop

Do ... Until Loop Runs 1 or more times until condition is true Do


Loop Until result <> "Correct"

While ... Wend Runs 0 or more times while condition is true. While result = "Correct"
Wend
Note: this loop is considered obsolete.

Exit the Do Loop Exit Do Do While i < 10


i = GetTotal
If i < 0 Then
Exit Do
End If
Loop

Introduction
If you have never use loops before then you may want to read What are Loops and Why Do You Need Them from my
post on the For Loop.
I am going to be mainly concentrating on the Do Loop in this post. As I mentioned above, we have seen the While
Wend loop is considered obsolete. For completeness, I have included a section on While Wend later in the post.
So first of all why do we need Do While loops when we already have For loops?

For Loops Versus Do While Loops


When we use a For Loop, we know in advance how many times we want to run it. For example, we may want to run the
loop once for each item in a Collection, Array or Dictionary.

In the following code example, we know at the start of each loop, how many times it will run.

' runs 5 times

For i = 1 To 5

' runs once for each item in the collection

For i = 1 To coll.Count

' runs once for each item in the arr

For i = LBound(arr) To coll.lbound(arr)

' runs once for each value between 1 and the value in lastRow

For i = 1 To lastRow

' runs once for each item in the collection

For Each s In coll

The Do Loop is different. The Do Loop runs

1. While a conditon is true

Or

2. Until a condition is true

In other words, the number of times the loops runs is not relevant in most cases.
So what is a condition and how do we use them?

Conditions
A condition is a statement that evaluates to true or false. They are mostly used with Loops and If statements. When
you create a condition you use signs like >,<,<>,>=,=.
The following are examples of conditions

Condition This is true when

x<5 x is less than 5

x <= 5 x is less than or equal to 5

x>5 x is greater than 5

x >= 5 x is greater than or equal to 5

x=5 x is equal to 5

x <> 5 x does not equal 5

x > 5 And x < 10 x is greater than 5 AND x is less than 10

x = 2 Or x >10 x is equal to 2 OR x is greater than 10

Range("A1") = "John" Cell A1 contains text "John"

Range("A1") <> "John" Cell A1 does not contain text "John"

You may have noticed x=5 as a condition. This should not be confused with x=5 when used as an assignment.

For example

' means: the value 6 will be stored in x

x = 6

' means: is x equal to 6?

If x = 6

' means: is x equal to 6?


Do While x = 6

The following table demonstrates how equals is used in conditions and assignments

Using Equals Statement Type Meaning

Loop Until x = 5 Condition Is x equal to 5

Do While x = 5 Condition Is x equal to 5

If x = 5 Then Condition Is x equal to 5

For x = 1 To 5 Assignment Set the value of x to 1, then to 2 etc.

x=5 Assignment Set the value of x to 5

b=6=5 Assignment and Condition Assign b to the result of condition 6 = 5

x = MyFunc(5,6) Assignment Assign x to the value returned from the function

The Do Loop Format


The Do loop can be used in four ways and this often causes confusion. However, there is only a slight difference in each of
these four ways.

Do is always at the start of the first line and Loop is always at the end of the last line

Do

Loop

We can add a condition after either line

Do [condition]

Loop
Do

Loop [condition]

The condition is preceded by While or Until which gives us these four possibilities

Do While [condition]

Loop

Do Until [condition]

Loop

Do

Loop While [condition]

Do

Loop Until [condition]

Let’s have a look at some examples to make this clearer.

A Do Loop Example
Imagine you want the user to enter a list of items. Each time the user enters an item you print it to the Immediate Window.
When the user enters a blank string, you want the application to end.
In this case the For loop would not be suitable as you do not know how many items the user will enter. The user could
enter the blank string first or on the hundredth attempt. For this type of scenario, you would use a Do loop.

The following code shows an example of this

Dim sCommand As String

Do

' Get user input

sCommand = InputBox("Please enter item")


' Print to Immediate Window(Ctrl G to view)

Debug.Print sCommand

Loop While sCommand <> ""

The code enters the loop and continues until it reaches the “Loop While” line. At this point, it checks whether the
condition evaluates to true or false.

 If the condition evaluates to false then the code exits the loop and continues on.
 If the condition evaluates to true then the code returns to the Do line and runs through the loop again.

The difference between having the condition on the Do line and on the Loop line is very simple
When the condition is on the Do line, the loop may not run at all. So it will run zero or more times.
When the condition is on the Loop line, the loop will always run at least once. So it will run one or more times.

In our the last example, the condition is on the Loop line because we always want to get at least one value from the user.
In the following example, we use both versions of the loop. The loop will run while the user does not the enter the letter
‘n’

Sub GetInput()

Dim sCommand As String

' Condition at start

Do While sCommand <> "n"

sCommand = InputBox("Please enter item for Loop 1")

Loop

' Condition at end

Do

sCommand = InputBox("Please enter item for Loop 2")

Loop While sCommand <> "n"

End Sub

In the above example, both loops will behave the same.


However, if we set sCommand to ‘n’ before the Do While loop starts, then the code will not enter the loop.

Sub GetInput2()

Dim sCommand As String

sCommand = "n"

' Loop will not run as command is "n"

Do Whilel sCommand <> "n"

sCommand = InputBox("Please enter item for Loop 1")

Loop

' Loop will still run at least once

Do

sCommand = InputBox("Please enter item for Loop 2")

Loop While sCommand <> "n"

End Sub

The second loop in the above example(i.e. Loop While) will always run at least once.

While Versus Until


When you use the Do Loop the condition mush be preceded by Until or While.
Until and While are essentially the opposite of each other. They are used in VBA in a similar way to how they are used in
the English language.

For example

 Leave the clothes on the line Until it rains


 Leave the clothes on the line While it does not rain

another example

 Stay in bed Until it is light


 Stay in bed While it is dark
yet another example

 repeat Until the count is greater than or equals ten


 repeat While the count is less than ten

As you can see – using Until and While is just the opposite way of writing the same condition.

Examples of While and Until


The following code shows the ‘While’ and ‘Until’ loops side by side. As you can see the only difference is the condition is
reversed. Note: The signs <> means ‘does not equal’.

Sub GetInput()

Dim sCommand As String

' Condition at start

Do Until sCommand = "n"

sCommand = InputBox("Please enter item for Loop 1")

Loop

Do While sCommand <> "n"

sCommand = InputBox("Please enter item for Loop 1")

Loop

' Condition at end

Do

sCommand = InputBox("Please enter item for Loop 2")

Loop Until sCommand = "n"

Do

sCommand = InputBox("Please enter item for Loop 2")

Loop While sCommand <> "n"


End Sub

First loop: will only start if sCommand does not equal ‘n’.
Second loop: will only start if sCommand does not equal ‘n’.
Third loop: will run at least once before checking sCommand.
Fourth loop: will run at least once before checking sCommand.

Example: Checking Objects


An example of where Until and While are useful is for checking objects. When an object has not been assigned it has the
value Nothing.

So when we declare a workbook variable in the following example it has a value of nothing until we assign it to a valid
Workbook

Dim wrk As Workbook

The opposite of Nothing is Not Nothing which can be confusing.


Imagine we have two functions called GetFirstWorkbook and GetNextWorkbook which return some workbook objects.
The code will print the name of the workbook until the functions no longer return a valid workbook.

You can see the sample code here

Dim wrk As Workbook

Set wrk = GetFirstWorkbook()

Do Until wrk Is Nothing

Debug.Print wrk.Name

Set wrk = GetNextWorkbook()

Loop

To write this code using Do While would be more confusing as the condition is Not Is Nothing

Dim wrk As Workbook

Set wrk = GetFirstWorkbook()


Do While Not wrk Is Nothing

Debug.Print wrk.Name

Set wrk = GetNextWorkbook()

Loop

This makes the code clearer and having clear conditions is always a good thing. To be honest this is a very small
difference and choosing between While and Until really comes down to a personal choice.

Exit Do Loop
We can exit any Do loop by using the Exit Do statement.
The following code shows an example of using Exit Do

Do While i < 1000

If Cells(i,1) = "Found" Then

Exit Do

End If

i = i + 1

Loop

In this case we exit the Do Loop if a cell contains the text “Found”.

While Wend
This loop is in VBA to make it compatible with older code. Microsoft recommends that you use the Do loops as they are
more structured.
From MSDN: “The Do…Loop statement provides a more structured and flexible way to perform looping.”

Format of the VBA While Wend Loop


The VBA While loop has the following format
While <Condition>
Wend

While Wend vs Do
The different between the VBA While and the VBA Do Loop is :

1. While can only have a condition at the start of the loop.


2. While does not have a Until version.
3. There is no statement to exit a While loop like Exit For or Exit Do.

The condition for the VBA While loop is the same as for the VBA Do While loop. The two loops in the code below
perform exactly the same way

Sub GetInput()

Dim sCommand As String

Do While sCommand <> "n"

sCommand = InputBox("Please enter item for Loop 1")

Loop

While sCommand <> "n"

sCommand = InputBox("Please enter item for Loop 2")

Wend

End Sub

Infinite Loop
Even if you have never written code in your life I’m sure you’ve heard the phrase Infinite Loop. This is a loop where
the condition will never be met. It normally happens when you forget to update the count.

The following code shows an infinite loop


Dim cnt As Long

cnt = 1

' Do not run - this is an infinite loop

Do While cnt <> 5

Loop

In this example cnt is set to 1 but it is never updated. Therefore the condition will never be met – cntwill always be less
than 5.

In the following code the cnt is being updated each time so the condition will be met.

Dim cnt As Long

cnt = 1

Do While cnt <> 5

cnt = cnt + 1

Loop

As you can see using a For Loop is safer for counting as it automatically updates the count in a loop. The following is the
same loop using For.

Dim i As Long

For i = 1 To 4

Next i

This is clearly a better way of doing it. The For Loop sets the initial value, condition and count in one line.
Of course it is possible to have an infinite loop using For – It just takes a bit more effort

Dim i As Long

' DO NOT RUN - Infinite Loop

For i = 1 To 4

' i will never reach 4

i = 1

Next i

Dealing With an Infinite Loop


When you have an infinite loop – VBA will not give an error. You code will keep running and the Visual Basic editor will
not respond.
In the old days you could break out of a loop by simply pressing Ctrl and Break. Nowadays different Laptops use
different key combinations. It is a good idea to know what this is for your laptop so that if an infinite loop occurs you can
stop the code easily.
You can also break out of a loop by killing the process. Press Ctrl+Shift+Esc. Under the Processes tab look for
Excel/Microsoft Excel. Right-click on this and select “End Process”. This will close Excel and you may lose some work –
so it’s much better to use Ctrl+Break or it’s equivalent.

Using Worksheet Functions Instead of Loops


Sometimes you can use a worksheet function instead of using a loop.
For example, imagine you wanted to add the values in a list of cells. You could do this using a loop but it would be more
efficient to use the worksheet function Sum. This is quicker and saves you a lot of code.

It is very easy to use the Worksheet functions. The following is an example of using Sum and Count

Sub WorksheetFunctions()

Debug.Print WorksheetFunction.Sum(Range("A1:A10"))

Debug.Print WorksheetFunction.Count(Range("A1:A10"))
End Sub

The following example use a loop to perform the same action. As you can see it is a much longer way of achieving the
same goal

Sub SumWithLoop()

Dim total As Long, count As Long

Dim rg As Range

For Each rg In Range("A1:A10")

' Total

total = total + rg

' Count

If rg <> "" Then

count = count + 1

End If

Next rg

Debug.Print total

Debug.Print count

End Sub

Summary

The Do While Loop


 The Do loop can be used in 4 ways.
 It can be used with While at the start or end, Do While .. Loop, Do … Loop While
 It can be used with Until at the start or end, Do Until .. Loop, Do … Loop Until
 While and Until use the opposite condition to each other.
 An Infinite loop occurs if your exit condition will never be met.
 Sometimes using a worksheet function is more efficient than using a loop.

The While Wend Loop


 The While Wend loop is obsolete and you can use the Do Loop instead.

You might also like