Циклы в VBA

Бывают ситуации, когда программе VBA требуется выполнить один и тот же набор действий несколько раз подряд (то есть несколько раз повторить один и тот же блок кода). Это можно сделать с помощью циклов VBA.

Циклы VBA включают в себя:

Далее мы более подробно рассмотрим каждый из этих циклов.

Для оператора цикла в Visual Basic

Структура оператора цикла Ассоциация в Visual Basic может быть организован в одной из двух форм: в виде цикла Для… Далее или как петля Для каждого.

Цикл «За… Далее»

Цикл Для… Далее использует переменную, которая последовательно принимает значения из заданного диапазона. При каждом изменении значения переменной выполняются действия, заключенные в теле цикла. Это легко понять на простом примере:

Для i = от 1 до 10 Всего = Всего + iArray(i) Следующий i

В этом простом цикле Для… Далее используется переменная i, который последовательно принимает значения 1, 2, 3,… 10, и для каждого из этих значений выполняется код VBA внутри цикла. Таким образом, этот цикл суммирует элементы массива. iArray в переменной Всего.

В приведенном выше примере приращение цикла не указано, поэтому для увеличения переменной i от 1 до 10, по умолчанию — приращение 1… Однако в некоторых случаях для цикла необходимо использовать разные значения приращения. Это можно сделать с помощью ключевого слова Шагкак показано в следующем простом примере.

Для d = от 0 до 10 Шаг 0.1 dTotal = dTotal + d Следующий d

Поскольку в приведенном примере шаг приращения задан равным 0.1, то переменная dВсего при каждом повторении цикла принимает значения 0.0, 0.1, 0.2, 0.3,… 9.9, 10.0.

Чтобы определить шаг цикла в VBA, вы можете использовать отрицательное значение, например, так:

Для i = 10 To 1 Шаг -1 iArray(i) = i Следующий i

Здесь приращение -1, поэтому переменная i при каждом повторении цикла принимает значения 10, 9, 8,… 1.

Цикл «Для каждого»

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

Затемнить лист как рабочий лист для каждого листа на листах MsgBox «Найден лист: » и wSheet.Name Следующий лист

Оператор прерывания цикла «Выход для»

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

Приложение оператора Выход для продемонстрировано в следующем примере. Здесь цикл перебирает более 100 записей массива и сравнивает каждую со значением переменной. dVal… Если совпадение найдено, то цикл завершается:

Для i = от 1 до 100. Если dValues(i) = dVal. Тогда IndexVal = i. Выход для конца. Если следующий i.

Цикл Do While в Visual Basic

Цикл Делать пока выполняет блок кода, пока выполняется указанное условие. Ниже приведен пример процедуры ниже, в котором с помощью цикла Делать пока Числа Фибоначчи, не превышающие 1000, отображаются последовательно:

'Подпроцедура выводит числа Фибоначчи, не превышающие 1000. Sub Fibonacci() 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 'выведите текущее число Фибоначчи в столбце A активный рабочий лист 'в строке с индексом i Cells(i, 1).Value = iFib 'вычисляет следующее число Фибоначчи и увеличивает индекс позиции элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

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

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

Схематически такой цикл Делать пока с проверяемым условием в конце будет выглядеть так:

Делайте... Цикл Пока iFib_Next < 1000

Цикл «Делай пока» в Visual Basic

Цикл Делать до очень похоже на цикл Делать пока: блок кода в теле цикла выполняется снова и снова, пока не будет выполнено указанное условие (результат условного выражения равен Правда). В следующей процедуре ниже используя цикл Делать до получить значения из всех ячеек столбца A лист, пока столбец не встретит пустую ячейку:

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Значение текущей ячейки сохраняется в массиве dCellValues ​​dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop

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

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

Do... Цикл до IsEmpty(Cells(iRow, 1))

Оставьте комментарий