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

Почему петли?

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

Цель цикла Excel VBA — заставить Excel повторять фрагмент кода определенное количество раз. Можно указать, сколько раз код должен быть повторен, как фиксированное число (например, сделать это 10 раз) или как переменная (например, сделать это столько раз, сколько строк данных).

Циклы Excel можно строить по-разному в зависимости от обстоятельств. Часто одни и те же результаты можно получить разными способами в соответствии с вашими личными предпочтениями.

В Excel VBA доступны три различных типа циклов:

  1. DO UNTIL Loop 2. DO WHILE Loop 3. FOR Loop 1. Цикл DO UNTIL Цикл DO UNTIL используется для бесконечного повторения блока кода, пока для указанного условия не будет установлено значение True. Условие можно проверить в начале или в конце цикла. Оператор DO UNTIL… LOOP проверяет условие в начале, тогда как оператор DO… LOOP UNTIL проверяет условие в конце цикла.

Синтаксис оператора DO UNTIL… LOOP

До тех пор, пока [Состояние]

[Блок кода, который будет повторяться]

Петля

Синтаксис оператора DO… LOOP UNTIL

Сделайте {пусто} [Блок кода, который будет повторяться]

Цикл до [Condition]

Мы объяснили цикл DO… UNTIL на примере. Макросы Loop1 и Loop2 используются для вычисления среднего числа чисел в столбце A и столбце B с помощью цикла DO… UNTIL.

Данные образца представлены в диапазоне A15: B27. Столбец A содержит оценки Раунда 1, а столбец B содержит результаты Раунда 2. Мы хотим вычислить средние оценки в Раунде 1 и Раунде 2 в столбце C.

Sample1

В макросе Loop1 мы использовали «FormulaR1C1» для вставки формулы среднего значения в активную ячейку. Оператор условия в цикле DO UNTIL проверяется в конце цикла.

В макросе Loop2 мы использовали «WorksheetFunction.Average» для вставки среднего значения в активную ячейку. Даже в этом макросе оператор условия проверяется в конце цикла.

Единственная разница между макросом Loop1 и Loop2 заключается в том, что Loop1 вставляет формулу среднего значения, тогда как Loop2 вычисляет среднее значение, а затем вставляет среднее значение в активную ячейку.

OutputSample1

{пусто} 2. Цикл DO WHILE Цикл DO WHILE используется для повторения блока кода неопределенное количество раз, в то время как указанное условие остается True и останавливается, когда условие возвращает False. Условие можно проверить в начале или в конце цикла. Оператор DO WHILE… LOOP проверяет условие в начале, тогда как оператор DO… LOOP WHILE проверяет условие в конце цикла. Оператор DO… LOOP WHILE используется, когда мы хотим, чтобы цикл выполнял блок кода хотя бы один раз перед проверкой условия.

Синтаксис оператора DO WHILE… LOOP

Сделать пока [Условие]

[Блок кода, который будет повторяться]

Петля

Синтаксис оператора DO… LOOP WHILE

Сделайте {пусто} [Блок кода, который будет повторяться]

Цикл пока [Условие]

В этом примере макросы Loop3 и Loop4 используются для вычисления средних значений для значений в ячейках столбца A и столбца B. Оба макроса работают с теми же образцами данных, которые используются макросами Loop1 и Loop2. Оба используют оператор DO WHILE для циклического перебора диапазона, содержащего данные.

Единственное различие между макросами Loop3 и Loop4 состоит в том, что они представляют собой разные способы представления условий цикла DO WHILE.

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

{пусто} 3. Цикл FOR Цикл For используется для повторения блока кода определенное количество раз.

Синтаксис цикла FOR

Для count_variable = start_value To end_value [блок кода]

Следующий макрос count_variable Loop5 показывает, как использовать цикл FOR для вычисления среднего значения. Он также использует те же образцы данных, что и другие макросы. Мы использовали 15 в качестве начального значения, поскольку данные примера начинаются с 15-й строки ^. Мы использовали Range («A» & Cells.Rows.Count) .End (xlUp) .Row, чтобы найти последнюю строку, содержащую данные. Цикл FOR будет повторяться (lastcell — 15) раз.

Вывод, возвращаемый после выполнения макроса Loop5, такой же, как и для макроса Loop1.

Макрос Loop6 создается для вычисления среднего, только если активная ячейка, которая будет иметь функцию среднего, пуста перед запуском макроса.

Примеры данных для этого макроса находятся в диапазоне от E15 до G27.

Sample2

Мы использовали DO… LOOP WHILE, чтобы пройти через определенный диапазон. Оператор IF используется для проверки того, содержит ли ячейка, в которую будет вставлена ​​функция, значение. Этот макрос вставит среднюю функцию в ячейку, только если она пуста.

OutputSample2

Макрос Loop7 также используется для вычисления среднего значения. Он проверяет значения в вспомогательном столбце, прежде чем оценивать, нужно ли повторять цикл. Он также проверяет, пуста ли ссылка на ячейку, которая будет использоваться в средней функции.

Пример данных, используемых для макроса Loop7, находится в диапазоне J15: M27.

Sample3

Столбец M используется как вспомогательный столбец. Этот макрос вставит среднюю функцию, только если ячейка в столбце M не пуста. Этот макрос проверяет, что ячейка должна быть пустой, прежде чем вставлять в нее среднюю функцию. Он не будет вставлять среднюю функцию, если ячейка, на которую ссылается средняя функция, пуста.

OutputSample3

Пожалуйста, введите код ниже

Option Explicit

Sub Loop1()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

Range("C15").Select

Do

'Assigning average function on value in cells of previous two consecutive columns

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

'Moving to cell in next row

ActiveCell.Offset(1, 0).Select

'Checking whether value in cell of previous column is empty

'Do Until loop will loop until condition statement returns True

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("A15").Select

End Sub

Sub Loop2()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

'This macro is similar to macro Loop1, only way of calculating average is different

Range("C15").Select

Do

'Worsheet.Average function is used for calculating the average

ActiveCell.Value = WorksheetFunction.Average(ActiveCell.Offset(0, -1).Value, _

ActiveCell.Offset(0, -2).Value)

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("A15").Select

End Sub

Sub Loop3()

'Calculating average

'Do While loop will run until cell in the previous column of active cell is empty

Range("C15").Select

'Checking whether value in cell of previous column is empty

'Do While loop will loop until condition statement is True

Do While IsEmpty(ActiveCell.Offset(0, -1)) = False

'Assigning average function on value in cells of previous two consecutive column

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

'Moving to cell in next row

ActiveCell.Offset(1, 0).Select

Loop

Range("A15").Select

End Sub

Sub Loop4()

'Calculating average

'Do While loop will run until cell in the previous column of active cell is empty

'This macro is similar to macro Loop3, only way of applying condition is different

Range("C15").Select

Do While Not IsEmpty(ActiveCell.Offset(0, -1))

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

ActiveCell.Offset(1, 0).Select

Loop

Range("A15").Select

End Sub

Sub Loop5()

'FOR loop repeats for a fixed number of times determined by the number of rows

Dim i, lastcell As Long

'Finding the last row containing data in column A

lastcell = Range("A" & Cells.Rows.Count).End(xlUp).Row

Range("C15").Select

'i variable is assigned value of 15 as our sample data begin from 15th row

'FOR Loop will loop x

For i = 15 To lastcell

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

ActiveCell.Offset(1, 0).Select

Next i

Range("A15").Select

End Sub

Sub Loop6()

'Calculating average

'Do Until loop will loop until cell in the previous column of active cell is empty

'It does not calculate an average if there is already something in the cell

Range("G15").Select

Do

If IsEmpty(ActiveCell) Then

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

End If

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, -1))

Range("E15").Select

End Sub

Sub Loop7()

'Do Until loop runs as long as there is something in cell in next column

'It does not calculate an average if there is already something in the active cell

'Nor if there is no data in cells which are used within average function (to avoid #DIV/0 errors).

'Calculating average

Range("L15").Select

Do

If IsEmpty(ActiveCell) Then

If IsEmpty(ActiveCell.Offset(0, -1)) And IsEmpty(ActiveCell.Offset(0, -2)) Then

ActiveCell.Value = ""

Else

ActiveCell.FormulaR1C1 = "=Average(RC[-1],RC[-2])"

End If

End If

ActiveCell.Offset(1, 0).Select

Loop Until IsEmpty(ActiveCell.Offset(0, 1))

Range("J15").Select

End Sub

Если вам понравился этот блог, поделитесь им с друзьями на Facebook и Facebook.

Мы будем рады услышать от вас, дайте нам знать, как мы можем улучшить нашу работу и сделать ее лучше для вас. Напишите нам на [email protected]