VBA для чайников
Шрифт:
Как правило, один или несколько операторов в теле цикла могут изменить значение выражения, представляющего условие, поэтому условие может стать равным False. В этом случае VBA прерывает выполнение цикла и, пропустив все его операторы, переходит к выполнению операторов, следующих за оператором Loop. Но если условие все еще равно True, операторы цикла будут выполнены еще раз.
Весь процесс повторяется до тех пор, пока в некоторый момент условие не станет равным False. Другими словами, нет ограничений на число повторений выполнения блока программного кода в цикле. В предположении, что подача энергии не прекратится и компьютер не отключается, цикл будет продолжаться вечно, если условие никогда не примет значение False.
Следующий пример, основанный на использовании
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, поэтому цикл завершится, и программа
покажет число с обратным расположением цифр.Другие операторы 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
While. . .Loop и Do Until... Loop.
Представьте себе, что вы ведете передачу по кулинарии и рассказываете своим слушателям рецепт. Вы можете сказать: "Продолжайте вымешивать масло, пока в нем заметны неоднородности" или "Продолжайте вымешивать масло до тех пор, пока оно не станет совершенно однородным". И первое, и второе означают одно и то же.
Подобным образом взаимно дополняются операторы Do While и Do Until. Если в операторе Do While условием является А = В, то эквивалентным ему оператором будет
Do Until с условием А о В.
Do или не Do
Цикл 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 можно использовать также и для отладки, для временной отмены выполнения цикла, чтобы не размещать апостроф (') в начале строк целого блока программного кода.