Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание пользовательских п ÒÉÌÏÖÅÎÉÊ ÓÒÅÄÓÔÁÍ...doc
Скачиваний:
6
Добавлен:
18.11.2019
Размер:
2.02 Mб
Скачать

Цикл Do…Loop

Этот цикл является логически прерываемым циклом. Цикл, организованный при помощи этой структуры, повторяет набор инструкций, пока выполнено некоторое условие. Такую форму цикла чаще всего используют в условиях неопределенности, когда нельзя заранее установить, сколько раз потребуется повторять действия. Например, если заранее неизвестно, скольким сотрудниками следует рассчитать зарплату, можно использовать оператор DoLoop при условии, что значение некоторой переменной будет свидетельствовать об окончании расчета.

Синтаксис оператора

Do [(While|Until) condition]

[statements] [Exit Do] [statements]

Loop [(While | Until) condition]

  • condition тестируемое выражение со значением True или False;

  • While|Until1ключевые слова, которые определяют, до каких пор будут выполняться команды, составляющие тело цикла:

  • While повтор операторов, пока условие (condition) истинно;

  • Until повтор операторов, пока условие ложно (пока условие не станет истинным).

Таким образом, циклы с ключевым словом While эквивалентны циклам Until, в которых перед условием стоит Not:

While condition = Until Not condition

  • Exit Doоператор немедленного выхода из цикла;

  • statements – последовательность операторов, выполняемых в цикле.

По сути, оператор имеет пять вариантов синтаксиса. В первых двух вариантах While|Until condition проверяется в начале цикла. В следующих двух вариантах While|Until condition проверяется в конце цикла. Пятый вариант – оператор цикла без задания условия.

Замечания

  • Если While|Until condition отсутствует, то в теле цикла должна осуществляться проверка условия выхода из цикла или продолжения цикла и должен стоять оператор немедленного выхода из цикла Exit Do.

  • Если условие выполнения цикла проверяется в начале, то команды внутри цикла не выполнятся ни разу, если при входе в цикл условие нарушено.

  • Команды тела цикла выполняются хотя бы один раз при проверке условия продолжения цикла в конце оператора цикла.

  • Возможно использование вложенных циклов, в том числе разных конструкций. Оператор Exit Do всегда завершает внутренний цикл.

Примеры

  1. Поиск первой непустой ячейки в первой строке рабочего листа.

Рассмотрим два способа записи оператора Do…Loop: с условием в начале оператора цикла (предусловие) и с условием в конце оператора цикла (постусловие).

Public Sub notempty_cell_While()

Dim i As Integer

i = 1

Do While IsEmpty(ActiveSheet.Cells(1, i))

i = i + 1

If i = 257 Then

MsgBox "Все ячейки первой строки пусты"

i=1

Exit Sub

End If

Loop

ActiveSheet.Cells(1, i).Select

End Sub

Public Sub notempty_cell_Until()

Dim i As Integer

Do

i = i + 1

If i = 257 Then

MsgBox "Все ячейки первой строки пусты"

I=1

Exit Sub

End If

Loop Until Not IsEmpty(ActiveSheet.Cells(1, i))

ActiveSheet.Cells(1, i).Select

End Sub

Аргумент ActiveSheet.Cells(1,i) функции IsEmpty определяет очередную ячейку первой строки активного листа. Оператор Exit Sub немедленно завершает процедуру, если просмотрены все 256 ячеек первой строки и непустая ячейка не найдена (i=257).

После нормального выхода из цикла значение переменной i указывает на номер столбца, в первой строке которого обнаружена непустая ячейка. Последний оператор процедуры выделяет найденную ячейку.

В первом случае цикл выполняется до тех пор, пока ячейка пуста. Тестирование выполняется до входа в цикл. Во втором случае цикл выполняется до тех пор, пока ячейка не станет непустой. Тестирование выполняется в конце цикла.

  1. Процедуру salary_cycle расчета заработной платы, записанную с использованием оператора ForNext, можно переписать, применив оператор DoLoop.

Sub salary_while_start()

Dim h As Long, r As Long, s As Double,

Dim Fund As Long, id As Integer

h = 1

r = 1

Do While h > 0 And r > 0

id=Val(InputBox("Код сотрудника"))

h = Val(InputBox("Количество отработанных часов"))

r = Val(InputBox("Почасовая оплата"))

If h = 0 Or r = 0 Then

Exit Do

End If

s = h * r

Fund = s * 0.13

s = sFund

MsgBox "Код сотрудника " & id & ", сумма на руки " & s

Loop

End Sub

В начале процедуры переменные h и r получают фиктивные начальные значения, равные единице, в предположении, что такие значения никогда не будут введены. Это позволяет войти в цикл хотя бы один раз и получить данные о первом сотруднике.

Оператор Do While h>0 And r>0 разрешает выполнение тела цикла, до тех пор, пока количество отработанных часов и почасовая ставка ненулевые.

Расчет зарплаты завершается, если введено нулевое значение хотя бы для одного показателя.

Чтобы избежать установки фиктивных начальных значений, в данном случае лучше задавать условие в конце цикла: Loop While h > 0 And r > 0, а с использованием ключевого слова Until оператор будет выглядеть так: Loop Until h = 0 Or r = 0.

Вообще говоря, в этом примере можно было бы не задавать условие, так как внутри цикла введенные значения сравниваются с нулем и осуществляется немедленный выход из цикла, если такие значения обнаружены.