Vba цикл do while: VBA Excel. Цикл Do While… Loop

VBA Excel. Цикл Do While… Loop

Цикл Do While… Loop в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла Do While… Loop.

Цикл Do While… Loop в VBA Excel предназначен для повторения блока операторов пока выполняется заданное условие (возвращается значение True). Синтаксис этого цикла аналогичен синтаксису цикла Do Until… Loop, который повторяется до тех пор, пока условие не выполняется (возвращается значение False).

Синтаксис цикла Do While… Loop

Синтаксис цикла Do While… Loop существует в двух вариантах, определяющих, когда проверяется условие.


Условие проверяется до выполнения операторов:

Do While condition

    [ statements ]

    [ Exit Do ]

    [ statements ]

Loop


Условие проверяется после выполнения операторов:

Do

    [ statements ]

    [ Exit Do ]

    [ statements ]

Loop While condition


В квадратных скобках указаны необязательные атрибуты цикла Do While… Loop.

Компоненты цикла Do While… Loop

КомпонентОписание
conditionОбязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean.
statementsНеобязательный* атрибут. Операторы вашего кода.
Exit DoНеобязательный атрибут. Оператор выхода** из цикла до его окончания.

*Если не использовать в цикле свой код, смысл применения цикла теряется.

**Очень полезный оператор для цикла Do While… Loop, так как при некоторых обстоятельствах он может стать бесконечным. Если такой риск существует, следует предусмотреть возможность выхода из бесконечного цикла VBA с помощью оператора Exit Do.

Примеры циклов Do While… Loop

Простейшие циклы

Цикл Do While… Loop с условием до исполняемых операторов:

1

2

3

4

5

6

7

Sub test1()

Dim a As Byte

  Do While a < 10

    a = a + 1

  Loop

MsgBox a

End Sub

Цикл Do While… Loop с условием после исполняемых операторов:

1

2

3

4

5

6

7

Sub test2()

Dim a As Byte

  Do

    a = a + 1

  Loop While a < 10

MsgBox a

End Sub

В обоих случаях окно MsgBox выведет число 10. Когда значение переменной a будет равно 10, проверяемое условие выдаст значение False, и цикл будет остановлен.

Проход по строкам листа

У двух белок дупла расположены напротив друг друга. В каждом дупле по 100 шишек. В свободное время они бросают шишки в дупло напротив, попадают не всегда. Ниже, в таблице, указано количество шишек, брошенных каждой белкой, и сколько их попало в цель.

ДниИгрокБрошеноПопало в цель
1 деньБелка 1156
1 деньБелка 2127
2 деньБелка 1148
2 деньБелка 2167
3 деньБелка 1209
3 деньБелка 2146
4 деньБелка 12610
4 деньБелка 2135
5 деньБелка 1174
5 деньБелка 2217

Исходя из этих данных необходимо узнать, сколько шишек осталось у Белки 1 в дупле. Для этого необходимо вычесть из 100 шишек количество выброшенных Белкой 1 и прибавить шишки, заброшенные в ее дупло Белкой 2. Вычисления начинаем со второй строки (в первой заголовки) и в условии для цикла Do While… Loop указываем «первая ячейка текущей строки не является пустой». Таблица должна начинаться с первой ячейки рабочего листа «A1», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Sub test3()

Dim i As Long, n As Long

i = 2

n = 100

  Do While Cells(i, 1) <> «»

    If Cells(i, 2) = «Белка 1» Then

      n = n — Cells(i, 3)

    Else

      n = n + Cells(i, 4)

    End If

    i = i + 1

  Loop

MsgBox n

End Sub

Результат, выведенный в информационном сообщении MsgBox, будет равен 40. Вы можете скопировать таблицу на рабочий лист книги Excel и поэкспериментировать с кодом VBA.

Бесконечный цикл и Exit Do

Пример бесконечного цикла:

1

2

3

4

5

6

7

8

9

Sub test4()

Dim a As Byte

  Do While a < 10

  a = a + 1

    If a = 9 Then

      a = 0

    End If

  Loop

End Sub

При запуске этой процедуры цикл Do While… Loop начинает выполняться бесконечно. Мне приходилось останавливать бесконечные циклы VBA в Excel 2000 и Excel 2016. В Excel 2000 помогло сочетание клавиш Ctrl+Break, а в Excel 2016 при закрытии редактора VBA крестиком появляется окно:

Информационное окно «Microsoft Excel не отвечает»

Ожидать отклика программы нет смысла, поэтому нажимаем «Перезапустить программу» или «Закрыть программу».

Совет: перед запуском процедуры с циклом Do While… Loop, который может стать бесконечным, обязательно сохраните книгу, иначе, при принудительном закрытии редактора VBA ваши изменения будут утеряны. Кроме того, при принудительном закрытии редактора VBA, Excel может отключить макросы. Включите их в окне «Центр управления безопасностью», открыть которое можно по ссылке «Безопасность макросов» на ленте в разделе «Разработчик». Подробнее о включении макросов в разных версиях Excel читайте в статье: Как разрешить выполнение макросов в Excel?.

Пример использования оператора Exit Do:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Sub test5()

Dim a As Byte, n As Long

  Do While a < 10

  a = a + 1

  n = n + 1

    If a = 9 Then

      a = 0

    End If

    If n = 1000 Then

      Exit Do

    End If

  Loop

MsgBox n

End Sub

Когда число итераций цикла дойдет до 1000, он будет завершен, и информационное сообщение MsgBox выведет на экран число повторений цикла Do While… Loop из этого примера.


Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

Оператор Do…Loop — Visual Basic






Twitter




LinkedIn




Facebook




Адрес электронной почты










  • Статья



Повторяет блок инструкций, пока Boolean условие не станет True или не станет True.

Синтаксис

Do [ { While | Until } condition ]
    [ statements ]
    [ Continue Do ]
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop
' -or-
Do
    [ statements ]
    [ Continue Do ]
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop [ { While | Until } condition ]

Компоненты

ТерминОпределение
DoОбязательный. Запускает определение Do цикла.
WhileНевозможно при Until использовании. Повторяйте цикл до тех пор, пока condition не будет False.
UntilНевозможно при While использовании. Повторяйте цикл до тех пор, пока condition не будет True.
conditionНеобязательный элемент. Выражение Boolean. Если condition это так Nothing, Visual Basic обрабатывает его как False.
statementsНеобязательный элемент. Один или несколько операторов, повторяющихся в то время или до тех пор, condition является True.
Continue DoНеобязательный элемент. Передает управление в следующую итерацию Do цикла.
Exit DoНеобязательный элемент. Передает элемент управления из Do цикла.
LoopОбязательный. Завершает определение Do цикла.

Используйте структуру Do...Loop , если требуется повторять набор инструкций неограниченное количество раз, пока условие не будет выполнено. Если вы хотите повторить инструкции в заданное количество раз, параметр For… Следующий оператор обычно является лучшим выбором.

Можно использовать While один или несколько Until вариантов condition, но не оба. Если вы не предоставите ни разу, цикл продолжается до тех пор, пока Exit не будет передан элемент управления из цикла.

Вы можете проверить condition только один раз в начале или в конце цикла. Если тестироваться condition в начале цикла (в инструкции Do ), цикл может не выполняться даже один раз. При тестировании в конце цикла (в инструкции Loop ) цикл всегда выполняется по крайней мере один раз.

Условие обычно приводит к сравнению двух значений, но это может быть любое выражение, результатом которого является логическое значение типа данных (True или False). Сюда входят значения других типов данных, таких как числовые типы, преобразованные в Boolean.

Вы можете вложить Do циклы, поместив один цикл в другой. Вы также можете вложить различные типы структур управления друг в друга. Дополнительные сведения см. в разделе «Вложенные структуры управления».

Примечание

Структура Do. ..Loop обеспечивает большую гибкость, чем while… Оператор End While , так как он позволяет решить, следует ли завершать цикл, когда condition он перестает быть True или когда он сначала становится True. Он также позволяет тестировать condition в начале или в конце цикла.

Выход из Do

Оператор Exit Do может предоставить альтернативный способ выхода Do…Loopиз . Exit Do передает управление непосредственно оператору, следующему за оператором Loop .

Exit Do часто используется после оценки некоторых условий If...Then...Else , например в структуре. Может потребоваться выйти из цикла, если обнаруживается условие, которое делает его ненужным или невозможным продолжать итерацию, например ошибочное значение или запрос на завершение. Одним из способов Exit Do является проверка на условие, которое может вызвать бесконечный цикл, который является циклом, который может выполняться большое или даже бесконечное количество раз. Можно использовать для Exit Do экранирования цикла.

Вы можете включить любое количество Exit Do операторов в любом месте.Do…Loop

При использовании в вложенных Do циклах Exit Do передает управление из самого внутреннего цикла и на следующий более высокий уровень вложения.

Пример 1

В следующем примере операторы в цикле продолжают выполняться до тех пор, пока index переменная не будет больше 10. Предложение Until находится в конце цикла.

Dim index As Integer = 0
Do
    Debug.Write(index.ToString & " ")
    index += 1
Loop Until index > 10
Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

Пример 2

В следующем примере вместо предложения используется While предложение Until и condition тестируется в начале цикла, а не в конце.

Dim index As Integer = 0
Do While index <= 10
    Debug. Write(index.ToString & " ")
    index += 1
Loop
Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

Пример 3

В следующем примере цикл останавливается, condition если index переменная больше 100. Однако оператор If в цикле приводит Exit Do к остановке цикла, если переменная индекса больше 10.

Dim index As Integer = 0
Do While index <= 100
    If index > 10 Then
        Exit Do
    End If
    Debug.Write(index.ToString & " ")
    index += 1
Loop
Debug.WriteLine("")
' Output: 0 1 2 3 4 5 6 7 8 9 10 

Пример 4

В следующем примере считываются все строки в текстовом файле. Метод OpenText открывает файл и возвращает StreamReader объект, который считывает символы. В условии Do...Loop метод StreamReader определяет наличие Peek дополнительных символов.

Private Sub ShowText(ByVal textFilePath As String)
    If System. IO.File.Exists(textFilePath) = False Then
        Debug.WriteLine("File Not Found: " & textFilePath)
    Else
        Dim sr As System.IO.StreamReader = System.IO.File.OpenText(textFilePath)
        Do While sr.Peek() >= 0
            Debug.WriteLine(sr.ReadLine())
        Loop
        sr.Close()
    End If
End Sub

См. также раздел

  • Циклические структуры
  • Оператор For…Next
  • Логический тип данных
  • Вложенные структуры управления
  • Оператор Exit
  • Оператор While…End While






Excel VBA Цикл Do While и (Do Loop While)

Home > VBA > Excel VBA Цикл Do While и (Do Loop While) – руководство While

Синтаксис

Пример для понимания цикла DO While

Связанные учебные пособия

VBA Do while представляет собой цикл, в котором вам нужно указать условие, и это условие должно оставаться истинным для выполнения цикла. Проще говоря, сначала он проверяет, является ли указанное вами условие истинным или нет, и если это условие истинно, он запускает цикл, иначе ничего.

На каждой итерации он проверяет условие и только затем выполняет оператор. Представьте, вы хотите добавить рабочие листы в Excel, в то время как полная учетная запись рабочих листов составляет 12 или меньше. В этом случае вы можете использовать цикл do-while для написания этого кода.

Синтаксис

Ниже приведен синтаксис VBA для каждого следующего цикла.

 Делать пока Условие
    [заявления]
Цикл 
  1. Условие: Это условие, которое вы указываете, и это условие должно быть истинным для запуска цикла.
  2. Заявление : Строка(и) кода, которые вы хотите выполнить, пока цикл выполняется, условие истинно.
  3. Цикл : Это оператор завершения одной итерации цикла, который сообщает VBA вернуться назад, чтобы снова проверить условие.

Пример для понимания цикла DO While

Чтобы понять цикл Do While, давайте напишем код для добавления рабочих листов в рабочую книгу, когда общее количество рабочих листов меньше двенадцати. Вам не нужно указывать VBA, сколько листов нужно добавить, и у вас всегда будет 12 листов каждый раз, когда вы запускаете этот код.

Используйте следующие шаги:

  1. Во-первых, вам нужно набрать на клавиатуре «Do While».
  2. Далее вам нужно написать условие, которое может проверить, меньше ли общее количество рабочих листов в книге двенадцати.
  3. Для этого вам нужно использовать приведенный ниже код, который подсчитывает общее количество рабочих листов, а затем сравнивает его с числом двенадцать.
  4. Далее вам нужно написать код для добавления рабочего листа. Этот код будет выполняться, когда условие, которое вы указали, истинно.
  5. И, наконец, введите ключевое слово «Цикл», чтобы завершить код.

Вот полный код, который вы только что написали:

 Sub vba_do_while_loop()
    Делать, пока ActiveWorkbook.Worksheets.Count < 12
        Листы.Добавить
    Петля
End Sub 

Теперь позвольте мне рассказать вам, как работает этот код: Условие , которое вы указали, проверяет общее количество рабочих листов в рабочей книге, а затем у вас есть оператор более низкого уровня, который проверяет количество рабочих листов против двенадцати. .

Когда количество рабочих листов меньше двенадцати, цикл будет продолжать выполняться и продолжать добавлять новые рабочие листы, но как только количество рабочих листов достигнет двенадцати, цикл остановится.

Проще говоря, цикл будет продолжать работать, пока количество рабочих листов меньше двенадцати.

Вот в чем дело, с кодом, который вы только что написали, вам не нужно указывать количество рабочих листов, которые вы хотите добавить, но если вы переходите к следующему циклу, вам нужно указать количество рабочих листов которые вы хотите добавить.

Выполнить цикл, пока

Выполнить цикл, пока — это расширенная версия цикла «Выполнить, пока», поскольку он работает таким же образом, но есть небольшая разница при проверке условия.

In Do Loop While выполняет одну итерацию цикла перед проверкой заданного вами условия, и если условие истинно, цикл продолжается.

Допустим, вы хотите написать код для проверки пароля, чтобы запустить код и продолжить цикл, пока пароль неверен (мы видим это в примере).

Синтаксис

Ниже приведен синтаксис для VBA Do Loop While.

  1. Do: Это начальное ключевое слово для Do Loop While.
  2. Заявление: это строки кода, которые вы хотите запустить в цикле.
  3. Loop While: это ключевое слово для продолжения цикла и проверки заданного вами условия.
  4. Условие: это условие, которое вы хотите проверить, прежде чем цикл начнет свою вторую итерацию и продолжит цикл.

Как вы можете видеть в синтаксисе Do Loop While, он сначала запустит оператор один раз, а затем перейдет к условию и проверит его, и если это условие истинно, он запустит цикл и продолжит его. пока условие истинно.

Пример для понимания цикла DO While

Чтобы понять цикл do while, давайте напишем код, отображающий поле ввода и предлагающий пользователю ввести пароль.

В этом поле ввода будет хорошо отображаться пароль, введенный пользователем, до пяти попыток, после чего поле ввода исчезнет без запуска процедуры.

  1. Сначала объявите две переменные, необходимые для хранения пароля и счетчика попыток.
  2. После этого введите ключевое слово «Do». Здесь вам не нужно сначала определять условие, как вы видели в синтаксисе.
  3. Далее вам нужно написать строку кода, чтобы отобразить поле ввода, которое просит пользователя ввести пароль.
  4. Отсюда вам нужно определить счетчик, который может считать до пяти (суммируется при каждом переходе цикла).
  5. Теперь введите ключевое слово «Loop While» и определите два условия, которые могут проверять значение, введенное пользователем и в поле ввода, и могут проверять значение счетчика, если оно меньше 5.
  6. В конец, напишите код, который вы хотите запустить. Здесь я использую оператор IF, который покажет окно сообщения, если пароль, введенный пользователем, верен.
 Sub vba_do_loop_while()
Dim varPassword как вариант, i как двойной
Делать
    varPassword = поле ввода _
    ("Введите пароль для запуска процедуры:", _
    "Проверить пароль 1. 0")
    я = я + 1
Цикл, в то время как varPassword <> "CorrectPassword" And i < 5
Если varPassword = "ПравильныйПароль" Тогда
    MsgBox "Ваш пароль правильный"
Конец, если
Конец суб 

Позвольте мне объяснить этот код.

  • В первой части этого кода у вас есть цикл do , который покажет пользователю поле ввода и запросит пароль .
  • И , если пароль неверный, цикл будет продолжаться до тех пор, пока пользователь не введет правильный пароль.
  • Но поскольку вы используете счетчик для подсчета итераций цикла и , как только этот счетчик достигает 5, цикл остановится.

Что такое VBA

Учебные пособия по теме

Цикл VBA Do While | Как использовать цикл выполнения в Excel VBA?

Цикл Do While означает выполнение чего-либо, пока условие истинно. Это похоже на логическую функцию, которая работает на основе ИСТИНА или ЛОЖЬ. Таким образом, если условие TRUE, он продолжит выполнение оператора внутри цикла, но если условие сразу FALSE, он выйдет из оператора Do While. Работа цикла VBA Do While показана на рисунке ниже.

Синтаксис цикла Do While в VBA Excel

Цикл Do While имеет два вида синтаксиса в Excel VBA.

Оба выглядят очень похоже, и в них есть одно простое различие.

В первом синтаксисе цикл «Do While» сначала проверяет условие и дает результат условия ИСТИНА или ЛОЖЬ. Если условие TRUE, он выполнит код и выполнит указанную задачу, а если условие FALSE, то выйдет из цикла.

Во втором синтаксисе цикл «Do» сначала выполняет код, а затем проверяет, является ли условие ИСТИННЫМ или ЛОЖНЫМ. Если условие TRUE, он снова вернется и выполнит ту же задачу. Если условие FALSE, то оно сразу выйдет из цикла.

Пример цикла Excel VBA Do While

Если вы ничего не поняли в теоретической части, не о чем беспокоиться. Я объясню вам простой набор примеров, чтобы иметь представление об этом цикле.

Вы можете скачать этот шаблон Excel для цикла VBA Do While здесь — Шаблон Excel для цикла VBA

Теперь мы выполним задачу по вставке первых 10 серийных номеров из ячеек с A1 по A10. Выполните следующие шаги, чтобы применить цикл «Do While».

Шаг 1:

Сначала создайте имя макроса.

Код:

 Sub Do_While_Loop_Example1()

End Sub 

Шаг 2:

Определите переменную как «Длинный». Я определил «k» как длинный тип данных.

Код:

 Sub Do_While_Loop_Example1()

Dim k As Long

End Sub 

Шаг 3:

Теперь введите слово «Do While». И после запуска имени цикла введите условие как «k <= 10».

Код:

 Sub Do_While_Loop_Example1()

Dim k As Long

Делать, пока k <= 10

Конец суб 

Шаг 4:

Теперь, используя свойство CELLS, давайте вставим серийные номера.

Код:

 Sub Do_While_Loop_Example1()

Dim k As Long

Делать, пока k <= 10
     Ячейки (к, 1). Значение = к
End Sub 

Примечание. Здесь переменная «k» начинается с 1, поэтому сначала значение k равно 1. Везде, где «k», равно 1.

Шаг 5:

Теперь закрыть цикл, введя слово «LOOP».

Код:

 Sub Do_While_Loop_Example1()

Dim k As Long

Делать, пока k <= 10
     Ячейки (к, 1). Значение = к
Петля

End Sub 

Хорошо, мы закончили. Для лучшего понимания давайте проверим этот код один за другим, один раз нажав клавишу F8.

При первом нажатии клавиши F8 имя макроса будет выделено желтым цветом.

Теперь еще раз нажмите клавишу F8; он перейдет к циклу Do While. Поместите курсор на «k» и посмотрите, что это за значение.

Итак, К=0. Причина, по которой «k» теперь равна нулю, потому что цикл здесь не запускается. Нажмите F8 еще раз и посмотрите, какое значение.

Тем не менее, значение «k» равно нулю. Хорошо, давайте сейчас сделаем одну вещь, остановим выполнение макроса и присвоим значение «k» как 1 перед запуском цикла.

Теперь внутри цикла переназначьте значение k как k = k +1.

Теперь запустите процесс выполнения кода построчно, нажав клавишу F8. Начните нажимать F8 и посмотрите, какое значение будет при выполнении цикла «Do While».

Код:

 Sub Do_While_Loop_Example1() 

        Dim k As Long

k=1

        Do k <= 10 9 0050 Ячейки (k, 1). Значение = k
k = k + 1

Loop

End Sub

Итак, значение «k» равно 1. Где бы ни было «k», там значение равно 1. Итак, строка кода Cells (k, 1). Значение = k равно:

Ячейки (1, 1). Значение = 1 , т. е. значение строки 1 и столбца 1 (ячейка A1) равно 1.

Нажмите клавишу F8 и выполните действие внутри цикла.

Теперь посмотрите на значение в ячейке A1.

Итак, мы получили значение 1 в ячейке A1.

Теперь выполните следующую строку, нажав клавишу F8, и посмотрите, какое значение имеет «k».

Итак, теперь значение k равно 2. Таким образом, где бы ни было k, оно равно 2.

Нажмите клавишу F8; теперь код вернется, чтобы проверить значение k.

Теперь нажмите еще два раза клавишу F8 и посмотрите, какое значение находится в ячейке A2.

Таким образом, Do While Loop продолжает выполнять задачу вставки серийных номеров, пока значение k не достигнет 11. Теперь я уже выполнял построчно, пока значение k не станет равным 10.

Теперь, если я нажму еще раз нажмите клавишу F8, он вернется, чтобы проверить условие, но не выполнит строку кода, потому что значение k теперь больше 10.

Если я нажму клавишу F8, он сразу выйдет из цикла и перейдет к End Sub.

Окончательный вывод выглядит следующим образом.

Таким образом, VBA Do While Loop может использоваться для выполнения одного и того же набора задач до тех пор, пока данное условие не станет ИСТИННЫМ.

Что следует помнить

  • Цикл VBA Do While выполняет задачу до тех пор, пока условие не станет ИСТИННЫМ.