Кроме цикла ДО, который повторяется заданное количество раз, применяется также цикл ПОКА, который повторяется до тех пор, пока верно некоторое заданное условие (или, наоборот, пока некоторое условие не станет верным). В VBA имеется четыре основных способа реализации цикла ПОКА:
-оператор While с проверкой в начале цикла;
Do While условие
операторы, выполняемые в цикле
Loop
Цикл повторяется, пока условие верно (и прекращается, когда оно становится неверным). Условие проверяется перед началом цикла. Если оно сразу неверно, то цикл не выполняется ни разу;
-оператор While с проверкой в конце цикла:
Do
операторы, выполняемые в цикле
Loop While условие
Цикл повторяется, пока условие верно. Условие проверяется в конце цикла. Поэтому цикл выполняется, как минимум, один раз;
-оператор Until с проверкой в начале цикла:
Do Until условие
операторы, выполняемые в цикле
Loop
Цикл повторяется, пока условие неверно (и прекращается, когда оно становится верным). Условие проверяется перед началом цикла;
-оператор Until с проверкой в конце цикла:
Do
операторы, выполняемые в цикле
Loop Until условие
Цикл повторяется, пока условие неверно (и прекращается, когда оно становится верным). Условие проверяется в конце цикла, поэтому цикл выполняется, как минимум, один раз.
Пример 1.10. В программе вводится одномерный массив из восьми чисел, и выполняется суммирование его элементов (начиная с первого), пока сумма не превысит 20.
Sub primer1_10a()
Dim a(1 To 8) As Integer
MsgBox(“Вводите массив”)
For i = 1 To 8
a(i) = InputBox("a(" & i & ")")
Next i
sum = 0: i = 0
Do While sum <= 20
i = i + 1
sum = sum + a(i)
Loop
MsgBox ("Сумма достигнута на " & i & "-м элементе и равна" & sum)
End Sub
Здесь переменная sum сначала равна нулю, поэтому условие sum<=20 верно. Выполняются операторы цикла:
i = i + 1
sum = sum + a(i)
Таким образом, переменная sum становится равной первому элементу массива a. Если он превышает 20, то цикл завершается, так как условие sum<=20 оказывается неверным. Выполняется оператор, следующий за циклом, т.е. выводится сообщение о найденной сумме. Если же элемент a(1) не превышает 20, то условие sum<=20 остается верным, и цикл повторяется снова: переменная i принимает значение 2, и к переменной sum прибавляется величина a(2). Цикл повторяется, пока переменная sum не превысит 20.
Эту же задачу можно решить с помощью оператора Until. Для этого следует заменить строку Do While sum <= 20 на следующую: Do Until sum > 20.
Следует обратить внимание, что программа, приведенная в примере 1.8, не вполне правильная: в ней не предусмотрено, что сумма элементов массива может оказаться меньше 20. В этом случае программа завершится с выдачей сообщения об ошибке, когда переменная i превысит объявленное количество элементов массива (в данном примере оно равно 8). Чтобы исправить эту ошибку, можно изменить программу, как показано ниже.
Sub primer1_10b()
Dim a(1 To 8) As Integer
MsgBox ("Вводите массив")
For i = 1 To 8
a(i) = InputBox("a(" & i & ")")
Next i
sum = 0: i = 0
Do While (sum <= 20) And (i < 8)
i = i + 1
sum = sum + a(i)
Loop
If sum > 20 Then
MsgBox ("Сумма достигнута на " & i & "- м элементе и равна " & Sum)
Else
MsgBox ("Сумма не достигнута")
End If
End Sub
Здесь цикл While выполняется до тех пор, пока верны два условия: переменная sum не превышает 20, и переменная i меньше 8. Если хотя бы одно из этих условий нарушается, то цикл прекращается. Поэтому, если в ходе выполнения цикла переменная sum достигает значения, превышающего 20, то цикл прекращается, так как нарушается условие sum <= 20. Если же оказывается, что сумма всех элементов массива меньше 20, то цикл прекращается из-за нарушения условия i < 8 (так как переменная i увеличивается на единицу в каждом цикле и достигает значения 8, когда вычислена сумма всех элементов массива). После прекращения цикла в операторе If проверяется достигнутое значение переменной sum, и выводится соответствующее сообщение.
Пример 1.11. Вычислить сумму ряда с точностью до 0,0001.
Sub primer1_11a()
n=0: element = 1: sum = 0
Do While Abs (element) >= 0.0001
sum = sum + element
n=n+1
factorial = 1
For i=1 To n
factorial = factorial * i
Next i
element = ((-1)^n)/(factorial*(2*n+1))
Loop
MsgBox(“Сумма ” & sum & “достигнута при n = ” & n-1)
End Sub
Здесь Abs – встроенная (стандартная) функция языка VBA, вычисляющая модуль. Для вычисления факториала использован цикл For, рассмотренный ранее. Вычитание при выводе результата (n-1) требуется из-за того, что в цикле переменная n увеличивается, и только после этого проверяется условие окончания цикла (поэтому на момент окончания цикла переменная n будет иметь значение, на единицу превышающее количество элементов вычисленной суммы).
Эту же программу можно реализовать и другими способами, например, используя цикл ПОКА в форме Until:
Sub primer1_11b()
n=0: element = 1: sum = 0
Do
sum = sum + element
n=n+1
factorial = 1
For i=1 To n
factorial = factorial * i
Next i
element = ((-1)^n)/(factorial*(2*n+1))
Loop Until Abs (element) < 0.0001
MsgBox(“Сумма ” & sum & “достигнута при n = ” & n-1)
End Sub
Здесь цикл повторяется, пока условие Abs (element) < 0.0001 неверно (и завершается, когда это условие становится верным).