Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Цель: Научиться использовать операторы цикла для организации повторяющихся вычислений



Часто требуется многократно повторить одну или несколько инструкций. 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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.026 с.)
Главная | Случайная страница | Обратная связь