Разница между операторами Do While. , .Loop и Do. . .Loop While очень простая: Do While. . . Loop имеет условие в самом начале цикла, а в Do... Loop While условие идет в самом конце.
В структуре Do While . . . Loop вход в цикл происходит вообще, только если условие принимает значение True, когда программа впервые обращается к циклу. Если сначала условие принимает значение False, цикл не выполнится ни разу.
В структуре Do. . .Loop While, напротив, цикл всегда выполняется по крайней мере один раз, поскольку сначала программа проходит весь блок программного кода, а лишь затем выполняется проверка условия, чтобы повторить выполнение операторов цикла, если условие окажется равным True. Используйте структуру Do ... Loop While тогда, когда значение условия для проверки устанавливается в блоке программного кода цикла.
Другим случаем, когда подходящим решением оказывается структура Do... Loop While, является обработка объекта (типа строки или массива), в котором больше одного элемента. Если вы точно знаете, что элементов не меньше одного, можно допустить выполнение операторов цикла один раз, а затем повторять выполнение столько раз, сколько нужно для оставшихся компонентов.
Операторы Do While. . .Loop и Do Until. . .Loop функционально эквивалентны, т.е. с помощью любого из них будут выполняться одни и те же операторы, если используемые в них условные выражения представляют противоположные условия. Подобным образом дополняют один другой и операторы Do
While. . .Loop и Do Until... Loop.
Представьте себе, что вы ведете передачу по кулинарии и рассказываете своим слушателям рецепт. Вы можете сказать: "Продолжайте вымешивать масло, пока в нем заметны неоднородности" или "Продолжайте вымешивать масло до тех пор, пока оно не станет совершенно однородным". И первое, и второе означают одно и то же.
Подобным образом взаимно дополняются операторы Do While и Do Until. Если в операторе Do While условием является А = В, то эквивалентным ему оператором будет
Do Until с условием А о В.
Цикл Do в своем условном выражении обеспечивает всю необходимую информацию, на основании которой VBA может принимать решение о продолжении или завершении выполнения цикла. К сожалению, в реальности дело не всегда обстоит так идеально, и иногда изменение другого условия внутри цикла требует немедленного выхода из цикла, для чего в VBA предусмотрен оператор Exit Do.
Действующий только внутри цикла Do, оператор Exit Do немедленно прекращает выполнение цикла и передает управление оператору, следующему сразу после цикла. В следующем примере выполняется конкатенация строковой переменной с некоторой имеющейся строкой, но если переменная содержит больше одного символа, цикл прекращается:
Do While strA <= "2"
If Len(strA) > 1 Then
Exit Do
End If
strB = strB & strA
strA = GetNextCharacter
Loop
Обычно необходимость в операторе Exit Do может возникнуть только во вложенных в цикл операторах If. . .Then и Select Case. В этих случаях цикл выполняется нормально до тех пор, пока не происходит что-то особое или не появляется непредусмотренное значение. Оператор Exit Do можно использовать также и для отладки, для временной отмены выполнения цикла, чтобы не размещать апостроф (') в начале строк целого блока программного кода.
В стандартных операторах Do While/Until. . . Loop условие можно проверять либо в начале, либо в конце цикла. Но что делать, если вы хотите проверить некоторое условие внутри цикла?
В этом случае используйте оператор Do... Loop без While и Until. Но при этом вам понадобится вложить в цикл либо оператор If, либо Select Case. Вложенный условный оператор может содержать оператор Exit Do, что позволит программе прекратить выполнение цикла, когда заданное условие окажется выполненным.
Вот схематическое представление оператора Do ... Loop:
Do
(операторы, выполняющиеся при каждом проходе цикла)
If условие Then
Exit Do
End If
(операторы, выполняющиеся, только если цикл продолжает выполняться)
Loop
Как видите, эта техника годится в том случае, когда нужно выполнить некоторые операторы в цикле, независимо от выполнения или невыполнения условия, а также если выполнение цикла необходимо прервать в зависимости от некоторого другого условия.
Например, часто приходится проверять правильность введенных пользователем данных относительно целого ряда критериев. В следующем примере с помощью структуры Do... Loop цикл ввода повторяется до тех пор, пока пользователь не введет правильную букву ответа:
Читать дальше