Цикл For… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For… Next.
Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла – счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.
Синтаксис цикла For… Next
1 2 3 4 5 |
For counter = start To end [ Step step ] [ statements ] [ Exit For ] [ statements ] Next [ counter ] |
1 2 3 4 5 |
For счетчик = начало To конец [ Step шаг ] [ операторы ] [ Exit For ] [ операторы ] Next [ счетчик ] |
В квадратных скобках указаны необязательные атрибуты цикла For… Next.
Компоненты цикла For… Next
Компонент | Описание |
---|---|
counter | Обязательный атрибут. Числовая переменная, выполняющая роль счетчика, которую еще называют управляющей переменной цикла. |
start | Обязательный атрибут. Числовое выражение, задающее начальное значение счетчика. |
end | Обязательный атрибут. Числовое выражение, задающее конечное значение счетчика. |
Step* | Необязательный атрибут. Оператор, указывающий, что будет задан шаг цикла. |
step | Необязательный атрибут. Числовое выражение, задающее шаг цикла. Может быть как положительным, так и отрицательным. |
statements | Необязательный** атрибут. Операторы вашего кода. |
Exit For | Необязательный атрибут. Оператор выхода из цикла до его окончания. |
Next [ counter ] | Здесь counter – необязательный атрибут. Это то же самое имя управляющей переменной цикла, которое можно здесь не указывать. |
*Если атрибут Step отсутствует, цикл For… Next выполняется с шагом по умолчанию, равному 1.
**Если не использовать в цикле свой код, смысл применения цикла теряется.
Примеры циклов For… Next
Вы можете скопировать примеры циклов в свой модуль VBA, последовательно запускать их на выполнение и смотреть результаты.
Простейший цикл
Заполняем десять первых ячеек первого столбца активного листа Excel цифрами от 1 до 10:
1 2 3 4 5 6 |
Sub test1() Dim i As Long For i = 1 To 10 Cells(i, 1) = i Next End Sub |
Простейший цикл с шагом
В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:
1 2 3 4 5 6 |
Sub test2() Dim i As Long For i = 1 To 10 Step 3 Cells(i, 2) = i Next End Sub |
Цикл с отрицательными аргументами
Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:
1 2 3 4 5 6 |
Sub test3() Dim i As Long For i = 0 To -9 Step -1 Cells(i + 10, 3) = i + 10 Next End Sub |
Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:
1 2 3 4 5 6 |
Sub test4() Dim i As Long For i = 0 To -9 Step -3 Cells(i + 10, 4) = i + 10 Next End Sub |
Вложенный цикл
Внешний цикл последовательно задает индексы первых десяти строк активного листа, а вложенный цикл складывает числа в первых четырех ячейках строки с текущем индексом и записывает сумму в ячейку пятого столбца. Перед запуском вложенного цикла с накопительным сложением, пятую ячейку соответствующей строки обнуляем, чтобы в случае нахождения в ней какого-либо числа, оно не прибавилось к итоговой сумме.
1 2 3 4 5 6 7 8 9 10 |
Sub test5() Dim i1 As Long, i2 As Long For i1 = 1 To 10 'Пятой ячейке в строке i1 присваиваем 0 Cells(i1, 5) = 0 For i2 = 1 To 4 Cells(i1, 5) = Cells(i1, 5) + Cells(i1, i2) Next Next End Sub |
Выход из цикла
В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For… Next:
1 2 3 4 5 6 7 |
Sub test6() Dim i As Long For i = 1 To 10 Cells(i, 6) = Choose(i, "Медведь", "Слон", "Жираф", "Антилопа", _ "Крокодил", "Зебра", "Тигр", "Ящерица", "Лев", "Бегемот") Next End Sub |
Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».
1 2 3 4 5 6 7 8 9 10 11 |
Sub test7() Dim i As Long For i = 1 To 10 If Cells(i, 6) = "Крокодил" Then Cells(i, 7) = "Он съел галоши" Exit For Else Cells(i, 7) = "Здесь был цикл" End If Next End Sub |
Результат работы циклов For… Next из примеров:
Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For… Next.
Цикл с дробными аргументами
Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:
1 2 3 |
For i = 1 To 20 Step 2 For i = a To b Step c For i = a - 3 To 2b + 1 Step c/2 |
В результате вычисления значения переменной вне цикла или выражения внутри его может получиться дробный результат. VBA Excel округлит его до целого числа, используя бухгалтерское округление:
1 2 3 4 |
'Значения атрибутов до округления For i = 1.5 To 10.5 Step 2.51 'Округленные значения атрибутов For i = 2 To 10 Step 3 |
Старайтесь не допускать попадания в тело цикла For… Next неокругленных значений аргументов, чтобы не получить непредсказуемые результаты его выполнения. Если без дробных чисел не обойтись, а необходимо использовать обычное округление, применяйте в коде VBA функцию рабочего листа WorksheetFunction.Round для округления числа перед использованием его в цикле For… Next.
Добрый день. У меня есть столбик, с динамически заполненным количеством строк, между которыми два пробела.
Например:
1
1
22
22
22
32
33
34
И динамика строк разная может быть 1 значение, может быть 100.
Мне нужно в конце под каждый таким массивом в ячейке была их сумма.
Т.е. под первым сумма 2, дальше 66, дальше 32 дальше 67.
Я не могу задать сам цикл.
Спасибо!
Привет, Олег!
При условии, что между строками с числами всегда две пустые строки, и последняя ячейка столбца не заполнена, решение для первого столбца может быть таким:
Добрый день!!!
Как сделать цикл просчета по строкам так что бы если в одном столбце строки объединены а в другом нет то что бы он передал таблицу в Word с названием объединенной строки и в шаблоне появились бы данные с другого столбца но по объединенной первой строке например:
первый столбец второй столбец
1 2
3
4
первый объединен отдельные строки
Никак не соображу, подскажите пожалуйста Евгений
Хочу диапазон дат вывести
Привет, Den!
Ваш код надо немного подправить:
Евгений, спасибо Вам большое!
Обычный цикл, сравниваются столбцы листов и если не совпало, заливает красным ячейку на одном листе.
Так закрашивает через одну, если не совпадение, то есть шаг цикла 2.
Приходится менять For z1 = 1 на For z1 = 2 что бы проверить все строки.
Уберите из цикла
z1 = z1 + 1
а что уже не пишем?
Вот спасибо не знал или уже забыл. Скорее всего переклинило. Сижу мучаюсь.
А где я мог недавно счетчики наращивать?
Добрый день. А как сделать, чтобы Атрибуты start, end и step были представлены как время (00:00;00:01;00:02…..)?
Здравствуйте, Сергей!
Счетчик может принимать только числовые значения. Время можно преобразовать в число, например:
Minute("00:05")
илиSecond("00:00:15")
.Спасибо Евгений.
Добрый день. Помогите разобраться с кодом. Пытаюсь запустить цикл с проверкой условия после выполнения(разветвление). Не понимаю почему не дант работать. Выделяется красным строка с условием If( If Range(“AM” & i2) < n2 GoTo Next i MsgBox "n2" ). Что я там неверно прописываю. Если значение в вычисляемой ячейке больше 25, вывести его в контрольном окне, после просмотра продолжить цикл. Если нет-продолжить цикл.
Привет, Сергей!
Замените строку
на
А если нужно: «Если значение в вычисляемой ячейке больше 25, вывести его в контрольном окне», тогда
Добрый день. Необходимо поочередно открывать несколько книг, забирать одни и те же ячейки и вставлять в книгу со сдвигом столбцов на 3.
Скрипт написал, подскажите где не верно? вставляет значения с последнего файла.
Добрый день! У вас значения вставляются из всех файлов в одни и те же ячейки, поэтому в результате они и содержат значения из последнего файла. Для сдвига диапазона используйте в цикле
For s = 0 To 90 Step 3 ... Next s
переменнуюi
.Евгений,добрый день. Написал так, все работает, но выглядит естественно не айс. Как это записать в цикле никак не могу додумать, мало опыта((в этом деле. Если подскажите буду благодарен.
s = 3*i
Мдаа, довольно просто вышло, особенно когда кто-то подскажет). Спасибо вам!
Application.DisplayAlerts правильней будет так записать: