Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Цель: Научиться использовать операторы цикла для организации повторяющихся вычислений
Часто требуется многократно повторить одну или несколько инструкций. VBA включает несколько управляющих структур для выполнения циклов, многие из которых знакомы тем, кто работал с другими языками программирования. Цикл Do…Loop Цикл Do…Loop является одним из самых простых и удобных. Он имеет 4 варианта синтаксиса:
Команды между инструкциями Do и Loop выполняются заданное число раз. Рассмотрим примеры использования цикла Do…Loop, начиная с синтаксиса 1: Counter = 100 Do While Counter > 0 Call MySub Counter = Counter - 1 Loop При вычислении условия в первый раз переменная Counter равна 100, поэтому выражение Counter > 0 (в данном случае 100 > 0) истинно, и выполняются инструкции внутри цикла. В цикле вызывается подпрограмма, а затем переменная Counter уменьшается на 1, поэтому в следующий раз условие равно 99 > 0, и команды выполняются повторно. После ста повторений переменная Counter уменьшается до 0 и условие становится ложным. Цикл заканчивается и управление передается инструкции, которая следует за командой Loop. Аналогичные действия можно произвести, используя синтаксис 2: Counter = 100 Do Until Counter = 0 Call MySub Counter = Counter - 1 Loop В данном случае цикл выполняется, пока условие ложно, в отличии от предыдущего случая, когда действия производились, если логическое выражение истинно. Синтаксис 3 и 4 очень похожи на первые два за исключением того, что условие не выполнится до тех пор, пока цикл не выполнится один раз. В первых двух случаях если условие ложно при входе в цикл, то управление сразу передается команде, которая следует после инструкции Do…Loop. С помощью двух последних вариантов можно обеспечить, по крайней мере, однократное выполнение цикла. Рассмотрим пример использования синтаксиса 3: Counter = 0 Do Call MySub Counter = Counter - 1 Loop While Counter > 0 В этом случае даже если счетчик цикла равен 0 перед входом в цикл, инструкции выполняются, по крайней мере, один раз, т. к. условие проверяется только в конце цикла. При работе с циклами имеется опасность входа в бесконечный цикл, если значение заданного условия не может измениться. В этом случае цикл выполняется бесконечно или до прерывания пользователем работы макроса. При возникновении бесконечного цикла, нажмите комбинацию клавиш < Ctrl> +< Break>. Безусловный выход из цикла
Цикл можно выполнить произвольное число раз, либо ни одного. Инструкция Exit Do позволяет безусловно передать управление команде, которая следует за последней командой цикла.
Counter = 99 Do Until Counter < = 0 If Counter > 50 Then MsgBox " Начальное значение больше допустимого" Exit Do End If Call MySubroutine Counter = Counter - 2 Loop В данном примере выполняется безусловный выход из цикла, если значение переменной Counter больше 50. Таким образом можно предотвратить возникновение ошибок в других частях программы. Цикл While…Wend
Инструкция While…Wend является разновидностью инструкции Do…Loop. В ранних версиях Basic, в которых не было инструкции Do…Loop, весьма эффективно использовалась команда While…Wend. Формат инструкции прост:
While [условие] инструкции Wend Первый пример для инструкции Do…Loop можно с легкостью изменить, чтобы использовать цикл While…Wend:
Counter = 100 While Counter > 0 Call MySub Counter = Counter - 1 Wend
Инструкция While…Wend в отличие от цикла Do…Loop не имеет второго варианта, в котором проверка условия выполняется в конце цикла. Кроме того, для данного цикла нет инструкции для безусловного выхода, подобной Exit Do. Цикл For…Next
Инструкцию For…Next можно встретить в большинстве языков программирования. Она позволяет циклически выполнить набор утверждений заданное число раз. Формат инструкции следующий: For счетчик = начало To конец [Step шаг] [инструкции] Next счетчик Параметр счетчик - это числовая переменная, которая автоматически увеличивается после каждого повтора. Начальное значение счетчика равно параметру начало, а конечное - параметру конец. Приведем пример программы перебора всех дней недели:
Sub Дни_недели() For i = 1 To 8 Select Case i Case 1 День = " Понедельник" Case 2 День = " Вторник" Case 3 День = " Среда" Case 4 День = " Четверг" Case 5 День = " Пятница" Case 6 День = " Суббота" Case 7 День = " Воскресенье" Case Else День = " Нет вариантов" End Select MsgBox (День) Next i End Sub
Обратите внимание, что переменная i автоматически увеличивается по достижении конца цикла. Ее не требуется изменять отдельной командой. Применяемый по умолчанию шаг равный 1, можно изменить, указав необязательное ключевое слово Step и величину шага. Значение шага может быть как положительным, так и отрицательным, что позволяет также создать циклы для счета в обратном направлении.
Практическое упражнение Напишем программу, которая бы имитировала выбрасывание игральной кости с помощью датчика случайных чисел. После запуска программы, мы должны будем ввести число выбрасываний. Окончательным результатом работы будет сообщение о количестве выпаданий каждой грани. Чтобы выполнить эту задачу, нам придется воспользоваться несколькими новыми функциями: Rnd() - генерация случайного числа в диапазоне [0; 1); Int(число) - целая часть числа; Chr(13) - перевод строки (аналогично нажатию клавиши Enter).
1. Перейдите в редактор VBA и откройте окно проекта, если до этого оно было закрыто. 2. Отобразите окно модуля. 3. В окне модуля введите следующую процедуру: Public Sub Выбрасывание_кости() Dim numbers(6) As Double Dim a As Double N = InputBox(" Введите число выбрасываний кости" ) For i = 1 To N a = Int(Rnd() * 6) + 1 numbers(a) = numbers(a) + 1 Next i info = " Число выбрасываний" & Chr(13) & Chr(13) & _ " 1 - " & numbers(1) & _ " 4 - " & numbers(4) & Chr(13) & _ " 2 - " & numbers(2) & _ " 5 - " & numbers(5) & Chr(13) & _ " 3 - " & numbers(3) & _ " 6 - " & numbers(6) MsgBox (info) End Sub Контрольные вопросы
1. Цикл Do…Loop. Варианты синтаксиса. 2. Прерывание пользователем работы макроса. 3. Безусловный выход из цикла. 4. Цикл While…Wend. 5. Цикл For…Next. Массивы. Задание собственных типов данных
|
Последнее изменение этой страницы: 2017-05-05; Просмотров: 350; Нарушение авторского права страницы