Типы операторов Do.. .Loop
Типы операторов Do.. .Loop
В VBA несколько видов циклов Do... Loop, но все они работают очень похоже.
Do. . .Loop Повторяет выполнение блока программного кода, пока некоторый условный оператор внутри цикла не выполнит команду End Do
Do While. . .Loop Начинает и повторяет выполнение блока программного кода, только если заданное условие принимает значение True
Do. . .Loop While Выполняет блок программного кода один раз, а затем повторяет выполнение, пока заданное условие принимает значение True
Do Until. . . Loop Начинает и повторяет выполнение блока программного кода, только если заданное условие принимает значение False
Do. . .Loop Until Выполняет блок программного кода один раз, а затем повторяет выполнение, пока заданное условие принимает значение False
Оператор Do While. . . Loop можно считать прототипом структуры Do. Вот его синтаксис:
Do While условие
(операторы, выполняющиеся, когда условие - True)
Loop
Обнаружив оператор Do While, VBA начинает проверять условие. Если представляющее условие выражение оказывается равным False, VBA игнорирует остальную часть цикла и переходит сразу к операторам программы, следующим за оператором Loop. Если же условие принимает значение True, VBA выполняет операторы в блоке. Достигнув оператора Loop, VBA возвращается опять к оператору Do While, чтобы проверить условие снова.
Как правило, один или несколько операторов в теле цикла могут изменить значение выражения, представляющего условие, поэтому условие может стать равным False. В этом случае VBA прерывает выполнение цикла и, пропустив все его операторы, переходит к выполнению операторов, следующих за оператором Loop. Но если условие все еще равно True, операторы цикла будут выполнены еще раз.
Весь процесс повторяется до тех пор, пока в некоторый момент условие не станет равным False. Другими словами, нет ограничений на число повторений выполнения блока программного кода в цикле. В предположении, что подача энергии не прекратится и компьютер не отключается, цикл будет продолжаться вечно, если условие никогда не примет значение False.
Следующий пример, основанный на использовании двух операторов Do While . . . Loop, переставляет в обратном порядке цифры в числе, предложенном пользователем. Наверное, этот пример не имеет никакой практической ценности, но он эффектный, работает в любом VBA-приложении и достаточно компактный, чтобы иллюстрировать работу циклов Do;
Sub ReverseTheDigits()
Dim intOriginalNumber As Integer
Dim intOneDigit As Integer, strBackwardsNumber As String
Do While intOriginal Number < 10
intOriginal Number = _
InputBox("Напечатайте число, большее 9.")
Loop
Do While intOriginalNumber
intOneDigit = intOriginalNumber Mod 10
strBackwardsNumber = strBackwardsNumber & intOneDigit
intOriginalNumber = Int(intOriginalNumber / 10)
Loop
MsgBox strBackwardsNumber
End Sub
В первом цикле Do проверяется, что значение, введенное пользователем, неотрицательно и что во введенном числе не меньше двух знаков (а иначе, что же в нем переставлять?). Когда программа выполняет этот цикл впервые, значением переменной intOriginalNumber будет 0, поскольку до этого переменной не присваивалось никакого значения. Нуль меньше 10, поэтому условие принимает значение True, и VBA начинает выполнение цикла.
Цикл содержит один оператор, отображающий окно ввода, в котором пользователя просят ввести подходящее число. После того как число введено, оператор Loop отсылает процесс выполнения к началу цикла, где введенное число проверяется. Цикл завершит свою работу только тогда, когда проверка покажет, что было введено подходящее число. (Обратите внимание на то, что в данном примере опущены некоторые важные пункты проверки правильности вводимых данных, наподобие проверки того, является ли число целым и не является ли больше максимально допустимого для переменных типа Integer.)
После подтверждения правильности введенного значения VBA переходит к следующему циклу. Условием выполнения этого цикла является положительное значение, содержащееся в переменной. Поскольку ненулевые числа порождают True, можно вместо Do While intOricinalNumbe r > 0 писать просто Do While intOriginalNumber - оба варианта работают одинаково.
В самом цикле простая процедура в три строки разбирает цифры исходного числа, начиная справа налево, и использует их в обратном порядке для построения новой строки. Чтобы понять, как работает цикл, не обязательно разбираться в программном коде внутри цикла, но, я думаю, следующие пояснения вам не помешают.
* В первой строке используется операция Mod, чтобы присвоить переменной intOneDigit остаток от деления числа на 10. Поскольку число делится на 10, остатком будет однозначное число, представленное последней (справа) цифрой исходного числа.
* Во втором операторе цифра, полученная в первой строке, добавляется в конец создающейся новой строковой величины.
* В третьем операторе число снова делится на 10, но на этот раз результат сохраняется f в исходной переменной. При таком делении просто отбрасывается правый знак числа. v Заметим, однако, что перед тем, как результат присваивается переменной, он обрабатывается функцией Int. Использование функции intздесь необходимо, поскольку в противном случае результат был бы округлен и это изменило бы знаки числа по сравнению с введенными изначально.
* В процессе прохода цикла значение intOriginalNumber уменьшается и наконец становится равным 0 после того, как все цифры будут обработаны (любая цифра задает число, меньшее 10, а функция intотбрасывает дробную часть числа). В стране VBA нуль означает False, поэтому цикл завершится, и программа покажет число с обратным расположением цифр.