VBA для Loop, Использование циклов в VBA в Microsoft Excel
В этой статье мы рассмотрели различные типы циклов, используемых в VBA, и способы их использования для решения одной и той же задачи разными способами.
Почему петли?
Цикл — это один из самых мощных методов программирования, используемых во многих языках программирования. Цикл используется для повторения блока кода необходимое количество раз или до тех пор, пока данное условие не станет истинным или не будет достигнуто определенное значение, после чего выполняется следующий блок кода.
Цель цикла Excel VBA — заставить Excel повторять фрагмент кода определенное количество раз. Можно указать, сколько раз код должен быть повторен, как фиксированное число (например, сделать это 10 раз) или как переменная (например, сделать это столько раз, сколько строк данных).
Циклы Excel можно строить по-разному в зависимости от обстоятельств. Часто одни и те же результаты можно получить разными способами в соответствии с вашими личными предпочтениями.
В Excel VBA доступны три различных типа циклов:
-
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.
В макросе Loop1 мы использовали «FormulaR1C1» для вставки формулы среднего значения в активную ячейку. Оператор условия в цикле DO UNTIL проверяется в конце цикла.
В макросе Loop2 мы использовали «WorksheetFunction.Average» для вставки среднего значения в активную ячейку. Даже в этом макросе оператор условия проверяется в конце цикла.
Единственная разница между макросом Loop1 и Loop2 заключается в том, что Loop1 вставляет формулу среднего значения, тогда как Loop2 вычисляет среднее значение, а затем вставляет среднее значение в активную ячейку.
{пусто} 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.
Мы использовали DO… LOOP WHILE, чтобы пройти через определенный диапазон. Оператор IF используется для проверки того, содержит ли ячейка, в которую будет вставлена функция, значение. Этот макрос вставит среднюю функцию в ячейку, только если она пуста.
Макрос Loop7 также используется для вычисления среднего значения. Он проверяет значения в вспомогательном столбце, прежде чем оценивать, нужно ли повторять цикл. Он также проверяет, пуста ли ссылка на ячейку, которая будет использоваться в средней функции.
Пример данных, используемых для макроса Loop7, находится в диапазоне J15: M27.
Столбец M используется как вспомогательный столбец. Этот макрос вставит среднюю функцию, только если ячейка в столбце M не пуста. Этот макрос проверяет, что ячейка должна быть пустой, прежде чем вставлять в нее среднюю функцию. Он не будет вставлять среднюю функцию, если ячейка, на которую ссылается средняя функция, пуста.
Пожалуйста, введите код ниже
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]