Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Цикл For… Next

    Цикл For… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For… Next.

    Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла — счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.

    Синтаксис цикла 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:

    Простейший цикл с шагом

    В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:

    Цикл с отрицательными аргументами

    Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:

    Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:

    Вложенный цикл

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

    Выход из цикла

    В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For… Next:

    Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».


    Результат работы циклов For… Next из примеров:

    Результат работы циклов For... Next из примеров
    Результат работы циклов For… Next

    Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For… Next.

    Цикл с дробными аргументами

    Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:

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

    Старайтесь не допускать попадания в тело цикла For… Next неокругленных значений аргументов, чтобы не получить непредсказуемые результаты его выполнения. Если без дробных чисел не обойтись, а необходимо использовать обычное округление, применяйте в коде VBA функцию рабочего листа WorksheetFunction.Round для округления числа перед использованием его в цикле For… Next.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    61 комментарий для “VBA Excel. Цикл For… Next”

    1. Добрый день. У меня есть столбик, с динамически заполненным количеством строк, между которыми два пробела.
      Например:
      1
      1

      22
      22
      22

      32

      33
      34
      И динамика строк разная может быть 1 значение, может быть 100.
      Мне нужно в конце под каждый таким массивом в ячейке была их сумма.
      Т.е. под первым сумма 2, дальше 66, дальше 32 дальше 67.
      Я не могу задать сам цикл.
      Спасибо!

      1. Евгений

        Привет, Олег!
        При условии, что между строками с числами всегда две пустые строки, и последняя ячейка столбца не заполнена, решение для первого столбца может быть таким:

    2. Александр

      Добрый день!!!
      Как сделать цикл просчета по строкам так что бы если в одном столбце строки объединены а в другом нет то что бы он передал таблицу в Word с названием объединенной строки и в шаблоне появились бы данные с другого столбца но по объединенной первой строке например:
      первый столбец второй столбец
      1 2
      3
      4
      первый объединен отдельные строки

    3. Никак не соображу, подскажите пожалуйста Евгений
      Хочу диапазон дат вывести

      1. Евгений

        Привет, Den!
        Ваш код надо немного подправить:

    4. Обычный цикл, сравниваются столбцы листов и если не совпало, заливает красным ячейку на одном листе.
      Так закрашивает через одну, если не совпадение, то есть шаг цикла 2.
      Приходится менять For z1 = 1 на For z1 = 2 что бы проверить все строки.

        1. а что уже не пишем?
          Вот спасибо не знал или уже забыл. Скорее всего переклинило. Сижу мучаюсь.
          А где я мог недавно счетчики наращивать?

    5. Добрый день. А как сделать, чтобы Атрибуты start, end и step были представлены как время (00:00;00:01;00:02…..)?

      1. Евгений

        Здравствуйте, Сергей!
        Счетчик может принимать только числовые значения. Время можно преобразовать в число, например: Minute("00:05") или Second("00:00:15").

    6. Добрый день. Помогите разобраться с кодом. Пытаюсь запустить цикл с проверкой условия после выполнения(разветвление). Не понимаю почему не дант работать. Выделяется красным строка с условием If( If Range(«AM» & i2) < n2 GoTo Next i MsgBox "n2" ). Что я там неверно прописываю. Если значение в вычисляемой ячейке больше 25, вывести его в контрольном окне, после просмотра продолжить цикл. Если нет-продолжить цикл.

      1. Евгений

        Привет, Сергей!
        Замените строку

        на

        А если нужно: «Если значение в вычисляемой ячейке больше 25, вывести его в контрольном окне», тогда

    7. Добрый день. Необходимо поочередно открывать несколько книг, забирать одни и те же ячейки и вставлять в книгу со сдвигом столбцов на 3.
      Скрипт написал, подскажите где не верно? вставляет значения с последнего файла.

      1. Евгений

        Добрый день! У вас значения вставляются из всех файлов в одни и те же ячейки, поэтому в результате они и содержат значения из последнего файла. Для сдвига диапазона используйте в цикле For s = 0 To 90 Step 3 ... Next s переменную i.

        1. Евгений,добрый день. Написал так, все работает, но выглядит естественно не айс. Как это записать в цикле никак не могу додумать, мало опыта((в этом деле. Если подскажите буду благодарен.

            1. Мдаа, довольно просто вышло, особенно когда кто-то подскажет). Спасибо вам!

      2. Евгений

        Application.DisplayAlerts правильней будет так записать:

    8. Евгений, большое спасибо за ваши уроки! Очень наглядно и доходчиво объясняете.
      У меня вопрос, можно ли этап цикла задействовать в нескольких формулах одновременно?
      Типа вот такого

      Если я подставляю число в вычисление переменной num_soch, то всё считается, а вот если пытаюсь подставить i — То нет. Подскажите пожалуйста, так нельзя? Или я просто что-то неправильно записываю?

      1. Евгений

        Здравствуйте, Люба!
        Попробуйте заменить участок кода

        на

    9. Владимир

      Добрый день!
      Я много работаю графиков веду в Excel, и хотел бы с нуля освоить макросы! Скажите пожалуйста как и с чего начать?

      1. Евгений

        Здравствуйте, Владимир!
        Скачайте любой самоучитель по VBA Excel (они есть в открытом доступе). У меня тоже есть несколько статей для начинающих в первом разделе содержания рубрики. Возможно, они вам помогут начать программировать. Сам я изучал VBA, как и вы планируете, в процессе работы: приходило понимание, что какое-то действие пора автоматизировать, – начинал искать решение в интернете.

    10. Ярослав

      Здравствуйте, мне нужно поочередно выводить значения. Т.е. при нажатии кнопки, чтоб значения записывались в столбик, в разных ячейках, подскажите каким образом это можно сделать?

      1. Евгений

        Здравствуйте, Ярослав!
        Следующий код, при нажатии кнопки, запишет пять слов в первые пять ячеек первого столбца:

        1. Ярослав

          Возможно вы меня не так поняли, я пишу калькулятор, и мне нужно сохранять каждое записанное значение в ячейки(столбик), т.е. я ввожу значения в Textbox, жму кнопку, Значение уходит в столбик, Textbox чистится, и так пока я не нажму "=", такое возможно сделать?

          1. Евгений

            Этот код будет записывать числа в первый столбец, переменная n объявляется в разделе Declarations модуля формы:

    11. Добрый вечер.
      Есть такой цикл:

      Значения sr, mx и m, asf и r — переменные и лежат на другом листе.
      Значения asf и r — фактически постоянные (меняются пользователем по необходимости).
      Цикл работает без проблем, но не могу понять как пройтись по диапазону в котором лежат значения sr, mx и m?
      Заранее спасибо.

      1. Евгений

        Добрый день, Антон!
        Вариант учета интервала еще одной переменной (sr):

    12. Доброго времени суток! Помогите! Не могу понять…. Вернее как бы могу но не совсем. Есть задача из списка пусть 50 наименований(один столбец) нужно их копировать в другой столбец, НО… в каждую шестую ячейку.
      Вот так делаю

      копирует каждое шестое наименование…

      1. Евгений

        Здравствуйте, Илья!
        Пример копирования ячеек столбца «A» в каждую шестую ячейку столбца «F»:

    13. Светлана

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

    14. Здравствуйте. Подскажите, пожалуйста, код. В ячейки 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

    15. Добрый день.
      Подскажите как выполнить задание:
      Используя цикл For в VBA повторите фигуру справа в красной рамке.
      v v
      v v
      v v
      v

      1. Евгений

        Добрый день, Илья!
        Это задание можно выполнить так:

        1. Спаибо БОЛЬШОЕ, но нужно повторить расположение (рисунок) символа «V» в соседнем квадрате.
          v_______v
          _v_____v
          __v___v
          ___v_v
          ____v
          Только вместо «_» пустые клетки.

    16. Добрый день.
      Сделал задание, но кажется можно упростить или нет?

      1. Евгений

    17. Александр

      Добрый день! На кнопке стоит код(заполнение графика»день, ночь, 4, 8), при каждом нажатии заполняет(согласно условий) 4 ячейки. Не получается сделать цикл, чтобы при одном нажатии заполнялась вся строка графика в пределах диапазона Range(«B23:AF27») и доходя до диапазона Range(«AG23:AG29») цикл заканчивался.

    18. Добрый день Евгений! Как проверить с помощью цикла, при каждом вводе данных в активную ячейку, есть ли значение(любое) в предыдущих(влево от активной ячейки) 6 ячейках строки, если есть во всех 6 подряд то запретить ввод(или msg) а если нет то можно дальше вводить данные.

      1. Евгений

        Привет, Саша!
        Здесь можно обойтись без цикла:

        Вы можете закомментировать строку с MsgBox, активную ячейку все-равно изменить будет нельзя, если вручную не снять защиту листа.

      2. Евгений

        Я подправил предыдущий код, а здесь добавил упрощенный:

    Обсуждение закрыто.