Чтение онлайн

на главную

Жанры

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 Выполняет

блок программного кода один раз, а затем повторяет выполнение, пока заданное условие принимает значение 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, поэтому цикл завершится, и программа покажет число с обратным расположением цифр.

Другие операторы 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

Поделиться:
Популярные книги

Измена. Я отомщу тебе, предатель

Вин Аманда
1. Измены
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Измена. Я отомщу тебе, предатель

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Мимик нового Мира 6

Северный Лис
5. Мимик!
Фантастика:
юмористическая фантастика
попаданцы
рпг
5.00
рейтинг книги
Мимик нового Мира 6

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2

Начальник милиции

Дамиров Рафаэль
1. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Темный Патриарх Светлого Рода 4

Лисицин Евгений
4. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 4

Стрелок

Астахов Евгений Евгеньевич
5. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Стрелок

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

Архил…? Книга 3

Кожевников Павел
3. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
7.00
рейтинг книги
Архил…? Книга 3

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Лорд Системы 11

Токсик Саша
11. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 11

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Последний попаданец 2

Зубов Константин
2. Последний попаданец
Фантастика:
юмористическая фантастика
попаданцы
рпг
7.50
рейтинг книги
Последний попаданец 2