Цикл 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 правильней будет так записать:
Евгений, большое спасибо за ваши уроки! Очень наглядно и доходчиво объясняете.
У меня вопрос, можно ли этап цикла задействовать в нескольких формулах одновременно?
Типа вот такого
Если я подставляю число в вычисление переменной num_soch, то всё считается, а вот если пытаюсь подставить i — То нет. Подскажите пожалуйста, так нельзя? Или я просто что-то неправильно записываю?
Здравствуйте, Люба!
Попробуйте заменить участок кода
на
Помогло. Спасибо большое!
Добрый день!
Я много работаю графиков веду в Excel, и хотел бы с нуля освоить макросы! Скажите пожалуйста как и с чего начать?
Здравствуйте, Владимир!
Скачайте любой самоучитель по VBA Excel (они есть в открытом доступе). У меня тоже есть несколько статей для начинающих в первом разделе содержания рубрики. Возможно, они вам помогут начать программировать. Сам я изучал VBA, как и вы планируете, в процессе работы: приходило понимание, что какое-то действие пора автоматизировать, – начинал искать решение в интернете.
Здравствуйте, мне нужно поочередно выводить значения. Т.е. при нажатии кнопки, чтоб значения записывались в столбик, в разных ячейках, подскажите каким образом это можно сделать?
Здравствуйте, Ярослав!
Следующий код, при нажатии кнопки, запишет пять слов в первые пять ячеек первого столбца:
Возможно вы меня не так поняли, я пишу калькулятор, и мне нужно сохранять каждое записанное значение в ячейки(столбик), т.е. я ввожу значения в Textbox, жму кнопку, Значение уходит в столбик, Textbox чистится, и так пока я не нажму "=", такое возможно сделать?
Этот код будет записывать числа в первый столбец, переменная
n
объявляется в разделе Declarations модуля формы:Добрый вечер.
Есть такой цикл:
Значения sr, mx и m, asf и r — переменные и лежат на другом листе.
Значения asf и r — фактически постоянные (меняются пользователем по необходимости).
Цикл работает без проблем, но не могу понять как пройтись по диапазону в котором лежат значения sr, mx и m?
Заранее спасибо.
Добрый день, Антон!
Вариант учета интервала еще одной переменной (sr):
Спасибо!
Доброго времени суток! Помогите! Не могу понять…. Вернее как бы могу но не совсем. Есть задача из списка пусть 50 наименований(один столбец) нужно их копировать в другой столбец, НО… в каждую шестую ячейку.
Вот так делаю
копирует каждое шестое наименование…
Здравствуйте, Илья!
Пример копирования ячеек столбца «A» в каждую шестую ячейку столбца «F»:
Огромное спасибо!!!
Добрый вечер. Подскажите, как мне дописать макрос, который в зависимости от страны будет проставлять категорию.
Здравствуйте. Подскажите, пожалуйста, код. В ячейки A1 и В1 вводится произвольный диапазон дат, а макрос должен ниже в этих столбцах выводить даты с интервалом в месяц.
Например, вводим А1 = 14.08.2021, В1= 03.12.2021. Получаем:
14.08.2021 14.09.2021
14.09.2021 14.10.2021
14.10.2021 14.11.2021
14.11.2021 03.12.2021
Добрый день.
Подскажите как выполнить задание:
Используя цикл For в VBA повторите фигуру справа в красной рамке.
v v
v v
v v
v
Добрый день, Илья!
Это задание можно выполнить так:
Спаибо БОЛЬШОЕ, но нужно повторить расположение (рисунок) символа «V» в соседнем квадрате.
v_______v
_v_____v
__v___v
___v_v
____v
Только вместо «_» пустые клетки.
Добрый день.
Сделал задание, но кажется можно упростить или нет?
Добрый вечер.
Спасибо за помощь!!!
Добрый день! На кнопке стоит код(заполнение графика»день, ночь, 4, 8), при каждом нажатии заполняет(согласно условий) 4 ячейки. Не получается сделать цикл, чтобы при одном нажатии заполнялась вся строка графика в пределах диапазона Range(«B23:AF27») и доходя до диапазона Range(«AG23:AG29») цикл заканчивался.
Добрый день Евгений! Как проверить с помощью цикла, при каждом вводе данных в активную ячейку, есть ли значение(любое) в предыдущих(влево от активной ячейки) 6 ячейках строки, если есть во всех 6 подряд то запретить ввод(или msg) а если нет то можно дальше вводить данные.
Привет, Саша!
Здесь можно обойтись без цикла:
Вы можете закомментировать строку с MsgBox, активную ячейку все-равно изменить будет нельзя, если вручную не снять защиту листа.
Я подправил предыдущий код, а здесь добавил упрощенный:
Обсуждение закрыто.