Если вам нужно в вашей программе воспроизвести одну и ту же задачу (использовать одну и ту же часть кода), для этого вам понадобятся VBA циклы.
Цикл For
У этого цикла есть два вида:
- For…Next цикл
- For Each цикл
Цикл For…Next
Этот цикл анализирует значения из указанного диапазона на основании заданной переменной. Затем цикл применяет указанный код ко всем значениям. Как это выглядит, можно увидеть на примере:
For i = 1 to 10
Total = Total +iArray(i)
Next i
Этот пример устанавливает, что переменная i имеет значение от 1 до 10, и показывает, что циклу нужно применять код для каждого из этих значений.
В вышеуказанном примере мы не указывали размер шага цикла, потому будет использоваться размер шага по умолчанию, который равняется 1. Но если вам нужно использовать какой-то конкретный шаг для применения цикла, делается это так:
For d = 0 to 10 Step 0.1
dTotal=dTotal + d
Next d
В данном примере из-за того, что шаг указан как 0.1, для переменной d значение будет установлено от 0.1 до 10. Также в случае необходимости, можно пользоваться шагами с отрицательными значениями:
For I = 10 To Step -1
iArray (i) = i
Next i
Здесь шаг указан как -1, так что значение каждого шага будет снижаться, начиная с 10 и до 1.
Цикл For Each
Этот цикл похож на предыдущий, но вместо работы со всем диапазоном значений For Each просматривает каждое значение отдельно. Мы приведем пример кода, который укажет циклу на то, что необходимо перечислить все рабочие листы документа:
Dim wSheet As Worksheet
For Each wSheet in Worksheets
MsBox “Found Worksheet:”&wSheet.Name
Next wSheet
Команда Exit For
Эта команда нужна для завершения цикла For раньше времени. Команда заставляет VBA завершить цикл и перейти к следующей строке кода. Например, когда вы ищите какое-то значение, вы можете использовать цикл, чтобы проверить и найти его среди массива данных. Но когда вы нашли нужные данные, больше нет необходимости продолжать цикл поиска, так что вы прерываете цикл.
Ниже мы приведем пример применения этой команды в цикле, который просматривает массив в 100 значений и пытается найти указанное в dVal значение. Цикл завершится раньше, если будет найдено значение dVal:
For i = 1To 100
if dValues(i)=dVal Then
indexVal = i
Exit For
End If
Next i
Цикл Do While
Этот цикл будет повторять указанный код, пока будут соблюдаться все установленные условия. Мы покажем, как прописать этот цикл правильно. Для примера возьмем код процедуры Sub. А задача цикла будет заключаться в поиске и выводе значений Последовательности Фибоначчи. А условием будет то, что значения не должны быть выше 1000:
‘Процедура Sub выводит числа Фибоначчи для всех значений ниже 1000’
Sub Фибоначчи()
Dim I As Integer ‘номер элемента в серии’
Dim iFib As Integer ‘сохранить текущее значение в серии’
Dim iFib_Next As Integer ‘сохранить следующее значение в серии’
Dim iStep As Integer ‘сохранить размер следующего шага’
‘Инициализация переменных i и iFib_Next’
i = 1
iFib_Next = 0
‘Do While продолжает исполняться, пока значение действующего числа Фибоначчи не превысит 1000’
Do While iFib_Next<1000
If I = 1 Then
‘Специальный случай для первого значения в серии’
iStep = 1
iFib = 0
Else
‘Сохранить размер следующего шага перед изменением текущего значения’
iStep = iFib
iFib = iFib_Next
End if
‘Выдать текущее значение Фибоначчи в колонке А текущего рабочего листа’
Cells(i, 1). Value = iFib
‘Рассчитать следующее значение в серии и увеличить маркер позиции на 1’
iFib_Next=iFib+Step
i = i +1
Loop
End Sub
Здесь iFib_Next<1000 считается как начало цикла. Если это значение будет больше указанного, то и цикл не запустится вовсе.
Еще одним методом использования Do While может быть указание условий в конце цикла. При этом цикл сработает хотя бы раз, независимо от того, были соблюдены условия, или нет. В примере ниже будет показано расположение условий в конце цикла:
Do
.
.
.
Loop While iFib_Next<1000
Цикл Do Until
По своей функциональности он схож с предыдущим. Суть его работы заключается в том, что он постоянно исполняет часть кода, пока не встретит заданное значение. Мы покажем, как этот цикл выглядит в процедуре Sub. Задачей цикла станет извлечение нужных данных из ячеек колонки А. Условием завершения работы будет момент, когда цикл наткнется на пустую ячейку.
iRow=1
Do Until isEmpty(Cells(iRow,1))
‘Сохранить текущее значение dCellValues’
dCellValues(iRow)=Cells(iRow,1).Value
iRow=iRow+1
Loop
Здесь isEmpty(Cells(iRow,1)) является условием и стоит в начале цикла, так что цикл сработает только при условии, что первая проверенная ячейка будет заполнена. Но бывают случаи, когда необходимо, чтобы цикл сработал хотя бы один раз, независимо от начальных условий. Тогда условие надо указать в конце:
Do
.
.
.
Loop Until isEmpty(Cells(iRow,1))