VBA для чайников
Шрифт:
Типы операторов Do.. .Loop
В VBA несколько видов циклов Do... Loop, но все они работают очень похоже.
Do. . .Loop Повторяет выполнение блока программного кода, пока некоторый условный оператор внутри цикла не выполнит команду End Do
Do While. . .Loop Начинает и повторяет выполнение блока программного кода, только если заданное условие принимает значение True
Do. . .Loop While Выполняет блок программного кода один раз, а затем повторяет выполнение, пока заданное условие принимает значение True
Do Until. . . Loop Начинает и повторяет выполнение блока программного кода, только если заданное условие принимает значение False
Do. . .Loop Until Выполняет
Оператор 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.)
После
В самом цикле простая процедура в три строки разбирает цифры исходного числа, начиная справа налево, и использует их в обратном порядке для построения новой строки. Чтобы понять, как работает цикл, не обязательно разбираться в программном коде внутри цикла, но, я думаю, следующие пояснения вам не помешают.
* В первой строке используется операция Mod, чтобы присвоить переменной intOneDigit остаток от деления числа на 10. Поскольку число делится на 10, остатком будет однозначное число, представленное последней (справа) цифрой исходного числа.
* Во втором операторе цифра, полученная в первой строке, добавляется в конец создающейся новой строковой величины.
* В третьем операторе число снова делится на 10, но на этот раз результат сохраняется f в исходной переменной. При таком делении просто отбрасывается правый знак числа. v Заметим, однако, что перед тем, как результат присваивается переменной, он обрабатывается функцией Int. Использование функции intздесь необходимо, поскольку в противном случае результат был бы округлен и это изменило бы знаки числа по сравнению с введенными изначально.
* В процессе прохода цикла значение intOriginalNumber уменьшается и наконец становится равным 0 после того, как все цифры будут обработаны (любая цифра задает число, меньшее 10, а функция intотбрасывает дробную часть числа). В стране VBA нуль означает False, поэтому цикл завершится, и программа покажет число с обратным расположением цифр.
Другие операторы Do
Разобравшись в базовой форме оператора Do While. . .Loop, несложно понять и его вариации В этом разделе рассмотрены три варианта циклов Do, четвертый обсуждается ниже, в разделе "Когда использовать Do без While или Until".
Do... Loop While
Разница между операторами 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 Until...Loop
Операторы Do While. . .Loop и Do Until. . .Loop функционально эквивалентны, т.е. с помощью любого из них будут выполняться одни и те же операторы, если используемые в них условные выражения представляют противоположные условия. Подобным образом дополняют один другой и операторы Do