For. . .Next | Заданное число раз |
For Each. .. Next | Для каждого объекта из коллекции объектов |
При работе с вложенными циклами помните простое правило: внутренний цикл должен закончиться прежде, чем закончится внешний.
Циклы Do
Все возможные версии оператора Do ... Loop предназначены для повторения заданного блока программного кода неопределенно долго, пока не будет выполнено некоторое условие.
Для того чтобы выяснить, продолжать цикл или нет, оператор Do ... Loop оценивает заданное условное выражение типа условных выражений, используемых для оператора If... Then и описанных выше в разделе "Курс на использование условных выражений".
Случаев, когда структуры Do... Loop полезны, просто не счесть. Вот несколько примеров.
* Отображение сообщения об ошибке снова и снова, пока пользователь не введет подходящую информацию в диалоговое окно.
* Чтение данных из файла на диске, пока не будет обнаружен конец файла.
* Поиск и подсчет числа вхождений некоторой строки символов в более длинной строке.
* Организация холостой работы программы в течение некоторого времени.
* Выполнение некоторых действий по отношению ко всем элементам массива.
* Выполнение (с использованием операторов If... Then ) некоторых действий по отношению ко всем элементам массива или коллекции, удовлетворяющим определенным критериям (массивы и коллекции рассматриваются в главе 13).
Типы операторов 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 начинает выполнение цикла.