Применение VBA циклов в Excel

При выполнении VBA программы (VBA, Visual Basic for Applications) может потребоваться повторить какой-то фрагмент кода несколько раз. Для выполнения этой задачи существуют циклы.

Синтаксис языка Visual Basic предусматривает следующие их типы:

  1. For.
  2. Do While.
  3. Do Until.

Давайте проанализируем отличия между ними во всех подробностях.

Цикл типа For

Выделяют несколько отдельных типов цикла For. Существует тип For … Next и For Each.

For … Next

Цикл For … Next опирается на переменную, которая увеличивается по окончании каждой итерации в определенном диапазоне. И каждый раз происходит выполнение определенного кода. Проще всего изобразить принцип работы цикла этого типа на легком фрагменте кода.

For i = 1 To 10

    Total = Total + iArray(i)

Next i

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

Здесь не указан размер шага, поэтому циклом используется стандартный размер 1. Выполняется такое количество итераций, которое позволяет сделать так, чтобы значение прошло от 1 до 10. Но если потребуется использовать разные размеры шагов, необходимо использовать слово Step. Приведем пример для наглядности.

For d = 0 To 10 Step 0.1

    dTotal = dTotal + d

Next d

В описанном варианте цикла определенный размер шага – 0,1, поэтому значение переменной d изменяется по числовому ряду 0.0, 0.1, 0,2 и так далее, пока значение переменной не достигнет 10.

Вы также можете использовать отрицательные числа для задания величины шага, как демонстрируется в этом фрагменте кода.

For i = 10 To 1 Step -1

    iArray(i) = i

Next i

В данном примере кода указан размер шага -1. Следовательно, числовой ряд соответствующей переменной будет следующим: 10, 9, 8 — вплоть до единицы.

Цикл For Each

Цикл For Each аналогичен For Next, за исключением того, что последний проходит по числовому ряду значений, а For Each осуществляет требуемую последовательность действий для всех объектов, принадлежащих к заданной группе. Например, следующий код показывает, как пользователь мог бы применить цикл For Each.

Dim wSheet As Worksheet

For Each wSheet in Worksheets

    MsgBox «Found Worksheet: » & wSheet.Name

Next wSheet

Этот код будет выполняться для каждого листа, входящего в состав документа, над которым работает человек.

Конструкция Exit For

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

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

Рассмотрим еще один пример, который хорошо отображает работу оператора Exit For. Здесь цикл анализирует 100 объектов, интерпретатор сравнивает каждый из них со значением переменной dValue1s. Если оно равно dVal1, то цикл завершается.

For i = 1 To 100

If dValues1(i) = dVal1 Then

indexVal = i

Exit For

End If

Next i

Цикл Do While

Характерная особенность цикла Do While – выполнение содержащегося в нем кода осуществляется до того момента, пока истинно определенное условие. Это хорошо демонстрирует следующий пример функции Sub, где этот цикл используется, чтобы напечатать числа, входящие в последовательность Фибоначчи, пока число в переменной больше 1000.

‘ Sub procedure to list the Fibonacci series for all values below 1,000

Sub Fibonacci()

Dim i As Integer   ‘ counter for the position in the series

Dim iFib As Integer   ‘ stores the current value in the series

Dim iFib_Next As Integer   ‘ stores the next value in the series

Dim iStep As Integer   ‘ stores the next step size

‘ Initialise the variables i and iFib_Next

i = 1

iFib_Next = 0

‘ Do While loop to be executed as long as the value of the

‘ current Fibonacci number exceeds 1000

Do While iFib_Next < 1000

If i = 1 Then

‘ Special case for the first entry of the series

iStep = 1

iFib = 0

Else

‘ Store the next step size, before overwriting the

‘ current entry of the series

iStep = iFib

iFib = iFib_Next

End If

‘ Print the current Fibonacci value to column A of the

‘ current Worksheet

Cells(i, 1).Value = iFib

‘ Calculate the next value in the series and increment

‘ the position marker by 1

iFib_Next = iFib + iStep

i = i + 1

Loop

End Sub

В этом фрагменте видно, что на старте прописано условие iFib_Next < 1000. Если iFib_Next становится больше 1000, то цикл автоматически завершается.

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

Do

Loop While iFib_Next < 1000

Цикл Do Until

Этот тип напоминает Do While, но здесь код выполняется до тех пор, когда условие не становится правдивым. То есть, в прошлом варианте изначально условие истинное, пока в ходе выполнения действий оно не станет ложным. Здесь – наоборот. Это хорошо демонстрирует такой пример:

iRow = 1

Do Until IsEmpty(Cells(iRow, 1))

‘ Store the current cell value in the dCellValues array

dCellValues(iRow) = Cells(iRow, 1).Value

iRow = iRow + 1

Loop

Эта подпрограмма извлекает значения ячеек, входящих в одну колонку, пока не обнаружится пустая.

Точно так же, как в предыдущем примере, если условие IsEmpty(Cells(iRow, 1)) ставится в начале цикла, он будет запущен, лишь если есть заполненная ячейка.

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

Do

.

.

.

Loop Until IsEmpty(Cells(iRow, 1))

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

Если коротко подвести итоги, цикл For используется, если нужно повторить определенный фрагмент кода какое-то количество раз. Do While и Do Until используются для похожих задач. В первом случае, пока условие истинно, код будет повторяться. Во втором же — повтор будет производиться, пока оно не станет истинным.

ОфисГуру
Adblock
detector