Цикл While… Wend в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла While… Wend и его отличия от цикла Do While… Loop.
Цикл While… Wend в VBA Excel предназначен для повторения блока операторов до тех пор, пока выполняется заданное условие (возвращается значение True). По своему функционалу его можно считать ограниченной версией цикла Do While… Loop, который позволяет проверять условие как до, так и после выполнения операторов, и принудительно завершать цикл с помощью оператора Exit Do. У цикла While… Wend таких возможностей нет: условие может быть задано только перед блоком операторов, а принудительный выход из цикла не предусмотрен.
While condition [ statements ] Wend |
Компоненты цикла While… Wend
Компонент | Описание |
---|---|
condition | Обязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean. |
statements | Необязательный* атрибут. Операторы вашего кода. |
*Если не использовать в цикле свой код VBA, смысл применения цикла теряется.
Примеры циклов While… Wend
Простейший цикл
Sub test1() Dim a As Byte While a < 100 a = a + 7 Wend MsgBox a End Sub |
Информационное сообщение MsgBox выведет число 105.
Проход по строкам листа
Допустим, на листе Excel есть таблица, расположенная в левом верхнем углу, начиная с ячейки A1, и под ней — пустая строка. Таблица содержит следующие данные:
Товар | Кол-во | Цена | Сумма |
---|---|---|---|
Батон | 1 | 33 | |
Лимон | 2 | 30 | |
Молоко | 3 | 55 | |
Хлеб | 1 | 30 | |
Чипсы | 5 | 18 |
Исходя из этих данных, необходимо, используя цикл While… Wend для прохода по строкам листа Excel, рассчитать сумму по каждому наименованию товара и записать ее в четвертую графу, а также в первую пустую строку записать слово «Итого:» (в третью графу) и итоговую сумму (в четвертую графу).
Sub test2() Dim i As Long, a As Double i = 2 While Cells(i, 1) <> «» Cells(i, 4) = Cells(i, 2) * Cells(i, 3) a = a + Cells(i, 4) i = i + 1 Wend Cells(i, 3) = «Итого:» Cells(i, 4) = a End Sub |
Вы можете скопировать таблицу на свой лист книги Excel, пример кода в стандартный модуль VBA и наглядно проверить работу цикла While… Wend.
На чтение 13 мин. Просмотров 26.4k.
Рамакришна, Источники индийской мудрости
Сейчас … мы идем по кругу
Эта статья содержит полное руководство по VBA Do While и VBA While Loops. (Если вы ищете информацию о циклах VBA For и For Each, перейдите сюда)
Цикл VBA While существует, чтобы сделать его совместимым со старым кодом. Однако Microsoft рекомендует использовать цикл Do Loop, поскольку он более «структурирован и гибок». Оба этих цикла рассматриваются в этом посте.
Для быстрого ознакомления с этими циклами перейдите к таблице быстрого руководства ниже.
Если вы ищете что-то конкретное, вы можете посмотреть содержание ниже.
Содержание
- Краткое руководство по VBA While Loops
- Введение
- Цикл For против цикла Do While
- Условия
- Формат цикла Do
- Цикл Exit Do
- While Wend
- Бесконечный цикл
- Использование функций Worksheet вместо циклов
- Резюме
Краткое руководство по VBA While Loops
Формат цикла | Описание | Пример |
Do While … Loop | Запускается 0 или более раз, пока условие выполняется | Do While result = «Верно» Loop |
Do … Loop While | Запускается 1 или более раз, пока условие выполняется | Do Loop While result = «Верно» |
Do Until … Loop | Запускается 0 или более раз, пока условие не будет выполнено | Do Until result <> «Верно» Loop |
Do … Until Loop | Запускается 1 или более раз, пока условие не будет выполнено | Do Loop Until result <> «Верно» |
While … Wend R |
Запускается 0 или более раз, пока условие истинно. Примечание: этот цикл считается устаревшим. |
While result = «Верно» Wend |
Exit the Do Loop | Завершает Do | Do While i < 10 i = GetTotal If i < 0 Then Exit Do End If Loop |
Введение
Если вы никогда ранее не использовали циклы, тогда вы можете прочитать «Что такое циклы и зачем они вам нужны» из моего поста в журнале For Loop.
Я собираюсь сосредоточиться в основном на Do Loop в этой статье. Как я упоминал выше, мы видели, что цикл While Wend считается устаревшим. Для полноты информации я все равно его включил в эту статью.
Итак, во-первых, зачем нам нужны циклы Do While, когда у нас уже есть циклы For?
Цикл For против цикла Do While
Когда мы используем цикл For Loop, мы заранее знаем, сколько раз мы хотим его запустить. Например, мы можем захотеть запустить цикл один раз для каждого элемента в коллекции, массиве или словаре.
В следующем примере кода мы видим в начале каждого цикла, сколько раз он будет выполняться.
' запускается 5 раз For i = 1 To 5 ' запускается один раз для каждого элемента коллекции For i = 1 To coll.Count ' запускается один раз для каждого элемента в arr For i = LBound(arr) To coll.lbound(arr) ' запускается один раз для каждого значения от 1 до значения в lastRow For i = 1 To lastRow ' запускается один раз для каждого элемента в коллекции For Each s In coll
Цикл Do другой. Он работает:
- В то время как условие верно
- Пока условие не будет выполнено
Другими словами, количество циклов в большинстве случаев не имеет значения.
Итак, что такое условие и как мы их используем?
Условия
Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия вы используете такие знаки, как >, <, <>,> =, =.
Ниже приведены примеры условий
Условие | Истина, когда… |
x < 5 | x меньше 5 |
x <= 5 | x меньше либо равен 5 |
x > 5 | x больше 5 |
x >= 5 | x больше либо равен 5 |
x = 5 | x равен 5 |
x <> 5 | x не равен 5 |
x > 5 And x < 10 | x больше 5 И меньше 10 |
x = 2 Or x >10 | x равен 2 ИЛИ больше 10 |
Range(«A1») = «Иван» | Ячейка A1 содержит текст «Иван» |
Range(«A1») <> «Иван» | Ячейка A1 не содержит текст «Иван» |
Вы могли заметить x = 5 как условие. Его следует путать с х = 5, при использовании в качестве назначения.
Например
' означает: значение 6 будет храниться в х x = 6 ' означает: х равен 6? If x = 6 ' означает: х равен 6? Do While x = 6
В следующей таблице показано, как «=» используется в условиях и назначениях.
Использование «=» | Тип | Имеется в виду |
Loop Until x = 5 | Условие | x равен 5? |
Do While x = 5 | Условие | x равен 5? |
If x = 5 Then | Условие | x равен 5? |
For x = 1 To 5 | Присваивание | Установите значение x = 1, затем = 2 и т.д. |
x = 5 | Присваивание | Установите значение x=5 |
b = 6 = 5 | Присваивание и условие |
Присвойте b результату условия 6 = 5 |
x = MyFunc(5,6) | Присваивание | Присвойте х значение, возвращаемое функцией |
Формат цикла Do
Цикл Do можно использовать четырьмя способами, и это часто вызывает путаницу. Однако в каждом из этих четырех способов есть только небольшая разница.
Do всегда в начале первой строки, а Loop всегда в конце последней строки.
Мы можем добавить условие после любой строки.
Do [условие] Loop Do Loop [условие]
Условию предшествует While или Until, которое дает нам эти четыре возможности
Do While [условие] Loop Do Until [условие] Loop Do Loop While [условие] Do Loop Until [условие]
Давайте посмотрим на некоторые примеры, чтобы прояснить это.
Примеры цикла Do
Представьте, что вы хотите, чтобы пользователь ввел список элементов. Каждый раз, когда пользователь вводит элемент, вы печатаете его в «Immediate Window». Когда пользователь вводит пустую строку, вы хотите, чтобы приложение закрывалось.
В этом случае цикл For не подойдет, поскольку вы не знаете, сколько элементов будет вводить пользователь. Пользователь может ввести пустую строку первым или с сотой попытки. Для этого типа сценария вы бы использовали цикл Do.
Следующий код показывает это
Dim sCommand As String Do ' Получить пользовательский ввод sCommand = InputBox("Пожалуйста, введите элемент") ' Печать в Immediate Window (Ctrl + G для просмотра) Debug.Print sCommand Loop While sCommand <> ""
Код входит в цикл и продолжается до тех пор, пока не достигнет строки «Loop While». На этом этапе он проверяет, оценивается ли условие как истинное или ложное.
Если условие оценивается как ложное, то код выходит из цикла и продолжается.
Если условие оценивается как истинное, то код возвращается к строке Do и снова проходит через цикл.
Разница между наличием условия на линии Do и на линии Loop очень проста.
Когда условие находится в строке Do, цикл может вообще не работать. Так что он будет работать ноль или более раз.
Когда условие находится на линии Loop, цикл всегда будет запущен хотя бы один раз. Так что он будет запущен один или несколько раз.
В нашем последнем примере условие находится в строке Loop, потому что мы всегда хотим получить хотя бы одно значение от пользователя. В следующем примере мы используем обе версии цикла. Цикл будет выполняться, пока пользователь не введет букву «н».
Sub GetInput() Dim sCommand As String ' Условие в начале Do While sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop ' Условие в конце Do sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Loop While sCommand <> "н" End Sub
В приведенном выше примере оба цикла будут вести себя одинаково.
Однако, если мы установим для sCommand значение «н» до запуска цикла «Do While», код не войдет в цикл.
Sub GetInput2() Dim sCommand As String sCommand = "н" ' Цикл не будет работать, поскольку команда "н" Do Whilel sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop ' Цикл все равно будет запущен хотя бы один раз Do sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Loop While sCommand <> "н" End Sub
Второй цикл в вышеприведенном примере (то есть Loop While) всегда будет запускаться хотя бы один раз.
While против Until
При использовании Do Loop условию должно предшествовать Until или While.
Until и While, по сути, противоположны друг другу. Они используются в VBA аналогично тому, как они используются в английском языке.
Например:
- Оставьте одежду, пока не пойдет дождь
- Оставь одежду, пока не идет дождь
Другой пример:
- Оставайся в постели, пока не станет светло
- Оставайся в постели, пока темно
Еще один пример:
- повторять, пока число не станет больше или равно десяти
- повторить пока счет меньше десяти
Как видите, использование Until и While — это просто противоположный способ написания одного и того же условия.
Примеры Until и While
Следующий код показывает циклы «While» и «Until» рядом. Как видите, единственная разница в том, что условие полностью изменено.
Примечание: знаки <> означают «не равно».
Sub GetInput() Dim sCommand As String ' Условие в начале Do Until sCommand = "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop Do While sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop ' Условие в конце Do sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Loop Until sCommand = "н" Do sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Loop While sCommand <> "н" End Sub
- Первый цикл: запускается только в том случае, если sCommand не равен ‘н’.
- Второй цикл: запускается только в том случае, если sCommand не равен ‘н’.
- Третий цикл: будет запущен хотя бы один раз перед проверкой sCommand.
- Четвертый цикл: будет запущен хотя бы один раз перед проверкой sCommand.
Пример: проверка объектов
Примером использования Until и While является проверка объектов. Когда объект не был назначен, он имеет значение Nothing.
Поэтому, когда мы объявляем переменную книги в следующем примере, она имеет значение Nothing, пока мы не назначим ее Workbook.
Противоположностью Nothing не является Nothing, что может сбить с толку.
Представьте, что у нас есть две функции: GetFirstWorkbook и GetNextWorkbook, которые возвращают некоторые объекты книги. Код будет печатать имя рабочей книги до тех пор, пока функции больше не вернут действительную рабочую книгу.
Вы можете увидеть пример кода здесь:
Dim wrk As Workbook Set wrk = GetFirstWorkbook() Do Until wrk Is Nothing Debug.Print wrk.Name Set wrk = GetNextWorkbook() Loop
Написание этого кода с использованием Do While было бы более запутанным, так как условие Not Is Nothing
Dim wrk As Workbook Set wrk = GetFirstWorkbook() Do While Not wrk Is Nothing Debug.Print wrk.Name Set wrk = GetNextWorkbook() Loop
Это делает код более понятным, и наличие четких условий — всегда хорошо. Честно говоря, разница маленькая, и выбор между «While» и «Until» действительно сводится к личному выбору.
Цикл Exit Do
Мы можем выйти из любого цикла Do с помощью оператора Exit Do.
Следующий код показывает пример использования Exit Do
Do While i < 1000 If Cells(i,1) = "Найдено" Then Exit Do End If i = i + 1 Loop
В этом случае мы выходим из цикла Do Loop, если ячейка содержит текст «Найдено».
While Wend
Этот цикл в VBA, чтобы сделать его совместимым со старым кодом. Microsoft рекомендует использовать циклы Do, поскольку они более структурированы.
Из MSDN: «Оператор Do… Loop обеспечивает более структурированный и гибкий способ выполнения циклов».
Формат цикла VBA While Wend
Цикл VBA While имеет следующий формат:
While <Условие>
Wend
While Wend против Do
Разница между циклами VBA While и VBA Do заключается в следующем:
- While может иметь условие только в начале цикла.
- While не имеет версии Until.
- Не существует оператора для выхода из цикла While, как Exit For или Exit Do.
Условие для цикла VBA While такое же, как и для цикла VBA Do While. Два цикла в приведенном ниже коде работают точно так же.
Sub GetInput() Dim sCommand As String Do While sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 1") Loop While sCommand <> "н" sCommand = InputBox("Пожалуйста, введите элемент для цикла 2") Wend End Sub
Бесконечный цикл
Даже если вы никогда не писали код в своей жизни, я уверен, что вы слышали фразу «Бесконечный цикл». Это цикл, в котором условие никогда не будет выполнено. Обычно это происходит, когда вы забыли обновить счетчик.
Следующий код показывает бесконечный цикл
Dim cnt As Long cnt = 1 'это бесконечный цикл Do While cnt <> 5 Loop
В этом примере cnt установлен в 1, но он никогда не обновляется. Поэтому условие никогда не будет выполнено — cnt всегда будет меньше 5.
В следующем коде cnt обновляется каждый раз, поэтому условие будет выполнено.
Dim cnt As Long cnt = 1 Do While cnt <> 5 cnt = cnt + 1 Loop
Как вы можете видеть, использование For Loop безопаснее для подсчета, поскольку оно автоматически обновляет счет в цикле. Ниже приведен тот же цикл с использованием For.
Dim i As Long For i = 1 To 4 Next i
Это явно лучший способ сделать это. Цикл For устанавливает начальное значение, условие и счет в одну строку.
Конечно, можно использовать бесконечный цикл, используя For — это потребует немного больше усилий 🙂
Dim i As Long ' Бесконечный цикл For i = 1 To 4 ' i никогда не достигнет 4 i = 1 Next i
Работа с бесконечным циклом
Когда у вас бесконечный цикл — VBA не выдаст ошибку. Ваш код будет продолжать работать, а редактор Visual Basic не будет отвечать.
Раньше вы могли выйти из цикла, просто нажав Ctrl и Break. В настоящее время разные ноутбуки используют разные комбинации клавиш. Полезно знать, как это настроено в вашем ноутбуке, чтобы в случае возникновения бесконечного цикла вы могли легко остановить код.
Вы также можете выйти из цикла, убив процесс. Нажмите Ctrl + Shift + Esc. На вкладке Процессы найдите Excel / Microsoft Excel. Щелкните правой кнопкой мыши по этому и выберите «Завершить процесс». Это закроет Excel, и вы можете потерять часть работы — так что гораздо лучше использовать Ctrl + Break или его эквивалент.
Использование функций Worksheet вместо циклов
Иногда вы можете использовать функцию листа вместо цикла.
Например, представьте, что вы хотите добавить значения в список ячеек. Вы можете сделать это с помощью цикла, но было бы более эффективно использовать функцию таблицы Sum. Это быстрее и экономит много кода.
Использовать функции рабочего листа очень просто. Ниже приведен пример использования Sum и Count.
Sub WorksheetFunctions() Debug.Print WorksheetFunction.Sum(Range("A1:A10")) Debug.Print WorksheetFunction.Count(Range("A1:A10")) End Sub
В следующем примере используется цикл для выполнения того же действия. Как видите, это гораздо более длинный способ достижения той же цели.
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
Резюме
Цикл Do While
- Цикл Do можно использовать 4 способами.
- Его можно использовать в начале или в конце, Do While .. Loop, Do … Loop While
- Может использоваться с Until в начале или в конце, Do Until .. Loop, Do … Loop Until
- While и Until используют противоположные условия друг к другу.
- Бесконечный цикл происходит, если ваше условие выхода никогда не будет выполнено.
- Иногда использование функции рабочего листа более эффективно, чем использование цикла.
Цикл While Wend
- Цикл Wend Wend устарел, и вы можете вместо этого использовать цикл Do.
“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).
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.
Note: this loop is considered obsolete. |
While result = «Correct» Wend |
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
- While a conditon is true
- Until a condition is true
Or
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’
' https://excelmacromastery.com/ 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.
' https://excelmacromastery.com/ 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’.
' https://excelmacromastery.com/ 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 :
- While can only have a condition at the start of the loop.
- While does not have a Until version.
- 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
' https://excelmacromastery.com/ 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 – cnt will 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
' https://excelmacromastery.com/ 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
' https://excelmacromastery.com/ 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.
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 and all the tutorials.
(NOTE: Planning to build or manage a VBA Application? Learn how to build 10 Excel VBA applications from scratch.)
В этом учебном материале вы узнаете, как использовать Excel оператор WHILE … WEND для создания цикла WHILE в VBA с синтаксисом и примерами.
Описание
Оператор Microsoft Excel WHILE … WEND используется для создания цикла WHILE в VBA. Вы используете цикл WHILE, когда не знаете, сколько раз вы хотите выполнить код VBA в теле цикла. В цикле WHILE тело цикла может не выполняться ни разу. Оператор WHILE … WEND — это встроенная в Excel функция, которая относится к категории логических функций. Её можно использовать как функцию VBA в Excel.
В качестве функции VBA вы можете использовать эту функцию в коде макроса, который вводится через редактор Microsoft Visual Basic Editor.
Синтаксис
Синтаксис для создания цикла WHILE с использованием оператора WHILE … WEND в Microsoft Excel:
While condition {…statements…}
Wend
Аргументы или параметры
- condition
- Условие проверяется при каждом проходе цикла.
Еслиcondition
оценивается как ИСТИНА, тело цикла выполняется.
Еслиcondition
оценивается как ЛОЖЬ, цикл завершается. - statement
- Операторы кода выполняемые при каждом проходе через цикл.
Возвращаемое значение
Оператор WHILE … WEND создает цикл WHILE в VBA.
Примечание
- См. также оператор FOR … NEXT, чтобы создать цикл FOR в 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)
Оператор WHILE … WEND может использоваться только в коде VBA в Microsoft Excel.
Давайте посмотрим, как создать цикл WHILE в Microsoft Excel.
Цикл WHILE
Например:
Sub While_Loop_Example Dim LTotal As Integer LTotal = 1 While LTotal<5 MsgBox (LTotal) LTotal = LTotal + 1 Wend End Sub |
В этом примере цикл WHILE управляется условием While LTotal<5. Это условие проверяется при каждом проходе цикла.
Если условие — ИСТИНА, то код VBA отобразит окно сообщения со значением переменной LTotal.
Если условие — ЛОЖЬ, цикл прекращается. Этот код отобразит 4 окна сообщений со следующими значениями: 1, 2, 3 и 4. Когда LTotal достигнет 5, цикл завершится.
Двойной цикл WHILE
Вы можете вкладывать циклы WHILE в VBA. Это позволяет получить двойной цикл с двумя разными условиями, которые будут оцениваться, например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub Double_While_Loop_Example Dim LCounter1 As Integer Dim LCounter2 As Integer LCounter1 = 1 LCounter2 = 8 While LCounter1<5 While LCounter2<10 MsgBox (LCounter1 & «-« & LCounter2) LCounter2 = LCounter2 + 1 Wend LCounter2 = 8 LCounter1 = LCounter1 + 1 Wend End Sub |
Здесь у нас есть 2 цикла WHILE. Внешний цикл WHILE управляется переменной LCounter1. Внутренний цикл WHILE управляется переменной LCounter2. В этом примере внешний цикл WHILE будет повторяться 4 раза (начиная с 1 и заканчивая 4), а внутренний цикл WHILE будет повторяться 2 раза (начиная с 8 и заканчивая 9). Во внутреннем цикле код будет каждый раз отображать окно сообщения со значением LCounter1-LCounter2. Таким образом, в этом примере будет отображаться 8 окон сообщений со следующими значениями: 1-8, 1-9, 2-8, 2-9, 3-8, 3-9, 4-8 и 4-9. Заметим, что при выходе из внутреннего цикла WHILE мы сбрасываем счетчик внутреннего цикла WHILE обратно на 8 с помощью оператора LCounter2 = 8. Это необходимо для того, чтобы внутренний цикл WHILE выполнялся снова, так как LCounter2 будет равен 10 после выхода внутренний цикл WHILE в первый раз.
Если мы оставим LCounter2 равным 10, условие для кода внутреннего цикла WHILE будет оцениваться как ЛОЖЬ и каждый раз завершать цикл.
In this Article
- VBA Loop Quick Examples
- For Each Loops
- For Next Loops
- Do While Loops
- Do Until Loops
- VBA Loop Builder
- VBA For Next Loop
- For Loop Syntax
- For Loop Step
- For Loop Step – Inverse
- Nested For Loop
- Exit For
- Continue For
- VBA For Each Loop
- For Each Cell in Range
- For Each Worksheet in Workbook
- For Each Open Workbook
- For Each Shape in Worksheet
- For Each Shape in Each Worksheet in Workbook
- For Each – IF Loop
- VBA Do While Loop
- Do While
- Loop While
- VBA Do Until Loop
- Do Until
- Loop Until
- Exit Do Loop
- End or Break Loop
- More Loop Examples
- Loop Through Rows
- Loop Through Columns
- Loop Through Files in a Folder
- Loop Through Array
- Loops in Access VBA
To work effectively in VBA, you must understand Loops.
Loops allow you to repeat a code block a set number of times or repeat a code block on a each object in a set of objects.
First we will show you a few examples to show you what loops are capable of. Then we will teach you everything about loops.
VBA Loop Quick Examples
For Each Loops
For Each Loops loop through every object in a collection, such as every worksheet in workbook or every cell in a range.
Loop Through all Worksheets in Workbook
This code will loop through all worksheets in the workbook, unhiding each sheet:
Sub LoopThroughSheets()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Visible = True
Next
End Sub
Loop Through All Cells in Range
This code will loop through a range of cells, testing if the cell value is negative, positive, or zero:
Sub If_Loop()
Dim Cell as Range
For Each Cell In Range("A2:A6")
If Cell.Value > 0 Then
Cell.Offset(0, 1).Value = "Positive"
ElseIf Cell.Value < 0 Then
Cell.Offset(0, 1).Value = "Negative"
Else
Cell.Offset(0, 1).Value = "Zero"
End If
Next Cell
End Sub
For Next Loops
Another type of “For” Loop is the For Next Loop. The For Next Loop allows you to loop through integers.
This code will loop through integers 1 through 10, displaying each with a message box:
Sub ForLoop()
Dim i As Integer
For i = 1 To 10
MsgBox i
Next i
End Sub
Do While Loops
Do While Loops will loop while a condition is met. This code will also loop through integers 1 through 10, displaying each with a message box.
Sub DoWhileLoop()
Dim n As Integer
n = 1
Do While n < 11
MsgBox n
n = n + 1
Loop
End Sub
Do Until Loops
Conversely, Do Until Loops will loop until a condition is met. This code does the same thing as the previous two examples.
Sub DoUntilLoop()
Dim n As Integer
n = 1
Do Until n >= 10
MsgBox n
n = n + 1
Loop
End Sub
We will discuss this below, but you need to be extremely careful when creating Do While or Do Until loops so that you don’t create a never ending loop.
VBA Loop Builder
This is a screenshot of the “Loop Builder” from our Premium VBA Add-in: AutoMacro. The Loop Builder allows you to quickly and easily build loops to loop through different objects, or numbers. You can perform actions on each object and/or select only objects that meet certain criteria.
The add-in also contains many other code builders, an extensive VBA code library, and an assortment of coding tools. It’s a must have for any VBA developer.
Now we will cover the different types of loops in depth.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
VBA For Next Loop
For Loop Syntax
The For Next Loop allows you to repeat a block of code a specified number of times. The syntax is:
[Dim Counter as Integer]
For Counter = Start to End [Step Value]
[Do Something]
Next [Counter]
Where the items in brackets are optional.
- [Dim Counter as Long] – Declares the counter variable. Required if Option Explicit is declared at the top of your module.
- Counter – An integer variable used to count
- Start – The start value (Ex. 1)
- End – The end value (Ex. 10)
- [Step Value] – Allows you to count every n integers instead of every 1 integer. You can also go in reverse with a negative value (ex. Step -1)
- [Do Something] – The code that will repeat
- Next [Counter] – Closing statement to the For Next Loop. You can include the Counter or not. However, I strongly recommend including the counter as it makes your code easier to read.
If that’s confusing, don’t worry. We will review some examples:
Count to 10
This code will count to 10 using a For-Next Loop:
Sub ForEach_CountTo10()
Dim n As Integer
For n = 1 To 10
MsgBox n
Next n
End Sub
For Loop Step
Count to 10 – Only Even Numbers
This code will count to 10 only counting even numbers:
Sub ForEach_CountTo10_Even()
Dim n As Integer
For n = 2 To 10 Step 2
MsgBox n
Next n
End Sub
Notice we added “Step 2”. This tells the For Loop to “step” through the counter by 2. We can also use a negative step value to step in reverse:
VBA Programming | Code Generator does work for you!
For Loop Step – Inverse
Countdown from 10
This code will countdown from 10:
Sub ForEach_Countdown_Inverse()
Dim n As Integer
For n = 10 To 1 Step -1
MsgBox n
Next n
MsgBox "Lift Off"
End Sub
Delete Rows if Cell is Blank
I’ve most frequently used a negative step For-Loop to loop through ranges of cells, deleting rows that meet certain criteria. If you loop from the top rows to the bottom rows, as you delete rows you will mess up your counter.
This example will delete rows with blank cells (starting from the bottom row):
Sub ForEach_DeleteRows_BlankCells()
Dim n As Integer
For n = 10 To 1 Step -1
If Range("a" & n).Value = "" Then
Range("a" & n).EntireRow.Delete
End If
Next n
End Sub
Nested For Loop
You can “nest” one For Loop inside another For Loop. We will use Nested For Loops to create a multiplication table:
Sub Nested_ForEach_MultiplicationTable()
Dim row As Integer, col As Integer
For row = 1 To 9
For col = 1 To 9
Cells(row + 1, col + 1).Value = row * col
Next col
Next row
End Sub
Exit For
The Exit For statement allows you to exit a For Next loop immediately.
You would usually use Exit For along with an If Statement, exiting the For Next Loop if a certain condition is met.
For example, you might use a For Loop to find a cell. Once that cell is found, you can exit the loop to speed up your code.
This code will loop through rows 1 to 1000, looking for “error” in column A. If it’s found, the code will select the cell, alert you to the found error, and exit the loop:
Sub ExitFor_Loop()
Dim i As Integer
For i = 1 To 1000
If Range("A" & i).Value = "error" Then
Range("A" & i).Select
MsgBox "Error Found"
Exit For
End If
Next i
End Sub
Important: In the case of Nested For Loops, Exit For only exits the current For Loop, not all active Loops.
Continue For
VBA does not have the “Continue” command that’s found in Visual Basic. Instead, you will need to use “Exit”.
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
VBA For Each Loop
The VBA For Each Loop will loop through all objects in a collection:
- All cells in a range
- All worksheets in a workbook
- All shapes in a worksheet
- All open workbooks
You can also use Nested For Each Loops to:
- All cells in a range on all worksheets
- All shapes on all worksheets
- All sheets in all open workbooks
- and so on…
The syntax is:
For Each Object in Collection
[Do Something]
Next [Object]
Where:
- Object – Variable representing a Range, Worksheet, Workbook, Shape, etc. (ex. rng)
- Collection – Collection of objects (ex. Range(“a1:a10”)
- [Do Something] – Code block to run on each object
- Next [Object] – Closing statement. [Object] is optional, however strongly recommended.
For Each Cell in Range
This code will loop through each cell in a range:
Sub ForEachCell_inRange()
Dim cell As Range
For Each cell In Range("a1:a10")
cell.Value = cell.Offset(0,1).Value
Next cell
End Sub
For Each Worksheet in Workbook
This code will loop through all worksheets in a workbook, unprotecting each sheet:
Sub ForEachSheet_inWorkbook()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Unprotect "password"
Next ws
End Sub
For Each Open Workbook
This code will save and close all open workbooks:
Sub ForEachWB_inWorkbooks()
Dim wb As Workbook
For Each wb In Workbooks
wb.Close SaveChanges:=True
Next wb
End Sub
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
For Each Shape in Worksheet
This code will delete all shapes in the active sheet.
Sub ForEachShape()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
shp.Delete
Next shp
End Sub
For Each Shape in Each Worksheet in Workbook
You can also nest For Each Loops. Here we will loop through all shapes in all worksheets in the active workbook:
Sub ForEachShape_inAllWorksheets()
Dim shp As Shape, ws As Worksheet
For Each ws In Worksheets
For Each shp In ws.Shapes
shp.Delete
Next shp
Next ws
End Sub
For Each – IF Loop
As we’ve mentioned before, you can use an If statement within a loop, performing actions only if certain criteria is met.
This code will hide all blank rows in a range:
Sub ForEachCell_inRange()
Dim cell As Range
For Each cell In Range("a1:a10")
If cell.Value = "" Then _
cell.EntireRow.Hidden = True
Next cell
End Sub
VBA Do While Loop
The VBA Do While and Do Until (see next section) are very similar. They will repeat a loop while (or until) a condition is met.
The Do While Loop will repeat a loop while a condition is met.
Here is the Do While Syntax:
Do While Condition
[Do Something]
Loop
Where:
- Condition – The condition to test
- [Do Something] – The code block to repeat
You can also set up a Do While loop with the Condition at the end of the loop:
Do
[Do Something]
Loop While Condition
We will demo each one and show how they differ:
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Do While
Here is the Do While loop example we demonstrated previously:
Sub DoWhileLoop()
Dim n As Integer
n = 1
Do While n < 11
MsgBox n
n = n + 1
Loop
End Sub
Loop While
Now let’s run the same procedure, except we will move the condition to the end of the loop:
Sub DoLoopWhile()
Dim n As Integer
n = 1
Do
MsgBox n
n = n + 1
Loop While n < 11
End Sub
VBA Do Until Loop
Do Until Loops will repeat a loop until a certain condition is met. The syntax is essentially the same as the Do While loops:
Do Until Condition
[Do Something]
Loop
and similarly the condition can go at the start or the end of the loop:
Do
[Do Something]
Loop Until Condition
Do Until
This do Until loop will count to 10, like our previous examples
Sub DoUntilLoop()
Dim n As Integer
n = 1
Do Until n > 10
MsgBox n
n = n + 1
Loop
End Sub
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Loop Until
This Loop Until loop will count to 10:
Sub DoLoopUntil()
Dim n As Integer
n = 1
Do
MsgBox n
n = n + 1
Loop Until n > 10
End Sub
Exit Do Loop
Similar to using Exit For to exit a For Loop, you use the Exit Do command to exit a Do Loop immediately
Exit Do
Here is an example of Exit Do:
Sub ExitDo_Loop()
Dim i As Integer
i = 1
Do Until i > 1000
If Range("A" & i).Value = "error" Then
Range("A" & i).Select
MsgBox "Error Found"
Exit Do
End If
i = i + 1
Loop
End Sub
End or Break Loop
As we mentioned above, you can use the Exit For or Exit Do to exit loops:
Exit For
Exit Do
However, these commands must be added to your code before you run your loop.
If you are trying to “break” a loop that’s currently running, you can try pressing ESC or CTRL + Pause Break on the keyboard. However, this may not work. If it doesn’t work, you’ll need to wait for your loop to end or, in the case of an endless loop, use CTRL + ALT + Delete to force close Excel.
This is why I try to avoid Do loops, it’s easier to accidentally create an endless loop forcing you to restart Excel, potentially losing your work.
More Loop Examples
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Loop Through Rows
This will loop through all the rows in a column:
Public Sub LoopThroughRows()
Dim cell As Range
For Each cell In Range("A:A")
If cell.value <> "" Then MsgBox cell.address & ": " & cell.Value
Next cell
End Sub
Loop Through Columns
This will loop through all columns in a row:
Public Sub LoopThroughColumns()
Dim cell As Range
For Each cell In Range("1:1")
If cell.Value <> "" Then MsgBox cell.Address & ": " & cell.Value
Next cell
End Sub
Loop Through Files in a Folder
This code will loop through all files in a folder, creating a list:
Sub LoopThroughFiles ()
Dim oFSO As Object
Dim oFolder As Object
Dim oFile As Object
Dim i As Integer
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder("C:Demo)
i = 2
For Each oFile In oFolder.Files
Range("A" & i).value = oFile.Name
i = i + 1
Next oFile
End Sub
Loop Through Array
This code will loop through the array ‘arrList’:
For i = LBound(arrList) To UBound(arrList)
MsgBox arrList(i)
Next i
The LBound function gets the “lower bound” of the array and UBound gets the “upper bound”.
Loops in Access VBA
Most of the examples above will also work in Access VBA. However, in Access, we loop through the Recordset Object rather than the Range Object.
Sub LoopThroughRecords()
On Error Resume Next
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tblClients", dbOpenDynaset)
With rst
.MoveLast
.MoveFirst
Do Until .EOF = True
MsgBox (rst.Fields("ClientName"))
.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
Set dbs = Nothing
End Sub