Циклы VBA в Excel (примеры)

Если вам нужно в вашей программе воспроизвести одну и ту же задачу (использовать одну и ту же часть кода), для этого вам понадобятся 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))

ОфисГуру
Adblock
detector