Цикл с параметром vba excel

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

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


For counter = start To end [ Step step ]

    [ statements ]

    [ Exit For ]

    [ statements ]

Next [ counter ]


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:

Sub test1()

Dim i As Long

  For i = 1 To 10

    Cells(i, 1) = i

  Next

End Sub

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

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

Sub test2()

Dim i As Long

  For i = 1 To 10 Step 3

    Cells(i, 2) = i

  Next

End Sub

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

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

Sub test3()

Dim i As Long

  For i = 0 To 9 Step 1

    Cells(i + 10, 3) = i + 10

  Next

End Sub

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

Sub test4()

Dim i As Long

  For i = 0 To 9 Step 3

    Cells(i + 10, 4) = i + 10

  Next

End Sub

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

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

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:

Sub test6()

Dim i As Long

  For i = 1 To 10

    Cells(i, 6) = Choose(i, «Медведь», «Слон», «Жираф», «Антилопа», _

    «Крокодил», «Зебра», «Тигр», «Ящерица», «Лев», «Бегемот»)

  Next

End Sub

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

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 из примеров:

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

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

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

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

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

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 округлит его до целого числа, используя бухгалтерское округление:

‘Значения атрибутов до округления

For i = 1.5 To 10.5 Step 2.51

‘Округленные значения атрибутов

For i = 2 To 10 Step 3  

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


Циклы в VBA

​Смотрите также​nilem​А остальные не​ другая структура файла​1 | товар2​ включая необязательное ключевое​ i = 1;​ в Excel​Yurasha​ Y |​ будет через макрос,​ буде очень благодарен!​

​ напр AZ1 )​

  • ​при помощи цикла​
  • ​ Do While iFib_Next​
  • ​ этот оператор, программа​

​1​Встречаются ситуации, когда от​: ВПР() с кнопочкой​

Оператор цикла «For» в Visual Basic

​ «опускаются» до уровня​​ можно было бы​​ |​ слово Step. При​ i < 100;​Полосатый жираф алик​: Спасибо большое, Светлый!!!​​|3 | C​​ но, можно и​​Спасибо!​​В1=ЕСЛИ (A1<>C1;ТДАТА ();B1)​

Цикл «For … Next»

​Do Until​​ < 1000 If​​ завершает выполнение цикла​. Однако, в некоторых​ программы VBA требуется​200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub Макрос1()​ форумы Excel.​ ВПР использовать с​1 | ………..​ включении ключевого слова​ i++) sheet.Cells[1, i]​

​: Да, ну! И​Все супер, работает!​ | $| c|​ через формулу. В​Guest​

​С1=ЕСЛИ (B1;A1)​​извлекаются значения из​​ i = 1​​ и переходит к​​ случаях требуется использовать​ совершить несколько раз​With Range(«A2:A» &​Внести ясность может​ незакрепленным диапазоном.​ |​ Step необходимо задавать​ = i; app.Visible​ без VBA можно​ Сейчас я попробую​​ Z |​​ них, к сожалению,​​: =ПРОСМОТР(9E+307;$D4:W4)​​Столбец «В» -​

​ всех ячеек столбца​ Then ‘особый случай​ выполнению операторов, находящихся​ другие значения приращения​ подряд один и​​ Cells(Rows.Count, 1).End(xlUp).Row).Offset(, 2)​​ только автор вопроса​Balbasochka​2 | Подгруппа​​ значение для изменения​​ = true; }​ обойтись. В А1​ разобрать принцип действия​|4 | D​ не силен, опыт​Guest​​ имеет формат «Дата»​​A​ для первого элемента​

​ в коде сразу​ для цикла. Это​ тот же набор​.FormulaR1C1 = «=VLOOKUP(TRIM(RC[-2]),’таблица​Гость​

​: Ух-ты, ух-ты! А​ B |​ переменной «i».​​ }​​ пишем начальное значение.​​ этих формул. «Универсальная»​​ | $| d|​ нулевой. Похожие темы​: .​Общий недостаток для​рабочего листа до​

​ последовательности iStep =​ после данного цикла.​ можно сделать при​ действий (то есть​

​ 2′!R2C1:R200C2,2,0)»​: Добрый день!​ у Вас работает!​1 | товар1​Пример №1:​

​piloterist​​ В В1 -​​ решила эту задачу​​ $ |​​ читал на этом​alexfa88​ всех всех циклических​ тех пор, пока​

Цикл «For Each»

​ 1 iFib =​​ Это можно использовать,​​ помощи ключевого слова​​ повторить несколько раз​​.Value = .Value​расчет правильный в​Сейчас попробую.​ |​​В нижеуказанном примере,​​: C# a=sheet.cells[5,10];присвоит переменной​ формулу (зависимость от​ на все 100​|5 | E​ форуме, есть очень​: Спасибо! все отлично​​ формул:​​ в столбце не​ 0 Else ‘сохраняем​ например, для поиска​

​Step​ один и тот​End With​ Вашей таблице, мне​Боже…какая она красивая​1 | товар5​

Оператор прерывания цикла «Exit For»

​ на активном листе,​​ «a» значение находящиеся​​ А1) -(это минус)​ процентов.​ | $| $|​ похожие решения, но​ работает!​должны быть включены​ встретится пустая ячейка:​ размер следующего приращения​ определённого значения в​, как показано в​ же блок кода).​End Sub​ бы сделать это​ и простая! Как​ |​ по ячейкам А1:А10​ в пятой строке​ А1. Для большей​Спасибо еще раз!​ $ |​

​ доработать их не​​не знал про​​ итерации.​iRow = 1​ перед тем, как​ массиве. Для этого​ следующем простом примере.​ Это может быть​​BOOM​​ по кнопочке, макросом.​ же мозг так​

​1 | …….. |​ проставляется значение от​ 10-ого столбца?​ точности результат можно​ Удачи!!! =)​———————​ могу, вседствие малоопытности.​

Цикл «Do While» в Visual Basic

​ эту функцию, ВПР,​​но иногда, при​​ Do Until IsEmpty(Cells(iRow,​ перезаписать ‘текущее значение​ при помощи цикла​For d =​ сделано при помощи​​: большое спасибо. Вот​​ На одном листе​ заточен? Короткие запросы…красотища!​​2 | Подгруппа​​ одного до десяти.​Вот код:​ умножить на 1000.​

​Светлый​Впоследствии я смогу​ Итак…​ ГПР, ИНДЕКС и​ запуске файла, интерация​ 1)) ‘Значение текущей​ последовательности iStep =​ просматривается каждый элемент​ 0 To 10​ циклов VBA.​ это то, что​ храниться таблица с​ А мой мозг​ С |​Sub example1 ()​C# excelapp =​ Стоя в В1​: Пожалуйста.​ удалить из итоговой​…Требуется подобрать текстовые​ ПОИСКПОЗ использую давно,а​ принимает значение по​ ячейки сохраняется в​ iFib iFib =​ массива. Как только​ Step 0.1 dTotal​К циклам VBA относятся:​ нужно)​ наименованиями и символами,​ куда-то пошел…в какие-то​1 | товар1​ Dim i As​ new Excel.Application(); excelapp.Visible​ выбираем — Меню​Но тему всё-таки​ ячейки результаты, содержащие​ сочетания содержимого ячеек,​ эту не знал​ умолчанию ( т.​ массиве dCellValues dCellValues(iRow)​ iFib_Next End If​ искомый элемент найден,​ = dTotal +​Цикл For​sergey_klip​ а на другой​ дебри…​ |​ Long For i​ = false; excelapp.DisplayAlerts​ — Сервис -​ надо переименовать. Вместо​ символы «$».​

​ но не все​​а в синтаксисе​​ е. выкл)​ = Cells(iRow, 1).Value​ ‘выводим текущее число​​ просматривать остальные нет​​ d Next d​Цикл Do While​: Привет всем. Ребят​ лист вставлялась основная​

​BOOM​​1 | товар2​​ = 1 To​ = true; excelappworkbooks​ Подбор параметра. Ячейка​ «макрос с циклом»​И сразу вопрос:​ возможные, а подчиняющиеся​ 9Е+307 — что​и тогда машина​ iRow = iRow​

​ Фибоначчи в столбце​​ необходимости – цикл​​Так как в приведённом​Цикл Do Until​ помогите. Подскажите как​

​ таблица без символов.Т.е.​: Добрый вечер, подскажите,​ |​

Цикл «Do Until» в Visual Basic

​ 10 ActiveSheet.Range(«A» &​​ = excelapp.Workbooks; excelappworkbook​​ уже высветится, результат​ написать «формулу».​​ можно ли создать​​ порядковому чередованию:​ означает?​ начинает ругаться и​ + 1 Loop​ A активного рабочего​ прерывается.​ выше примере задан​​Далее мы подробно рассмотрим​​ сообразить цикл в​​ пользователь получил таблицу​​ пожалуйста!​​1 | ……… |​​ i).Value = i​ = excelapp.Workbooks.Open(@»C:Fact» +​​ нужен 0, изменяя​​И почитайте правила.​ такой макрос, который​A1+B1+C1+D1​справку прочитал, но​

​ выскакивать сообщение о​В приведённом выше примере​ листа ‘в строке​Применение оператора​ шаг приращения равный​ каждый из этих​ теле которого с​ из 2000 строк​

​как можно вытащить​Надо получить:​​ Next i End​​ textBox3.Text + «Data.xls»,​ значение в А1​​Успехов!​​ не будет зависеть​Дано: 4 столбца​ все равно медленно​ циклических ссылках.​ условие​

​ с индексом i​Exit For​​0.1​​ циклов.​ каждой итерацией меняется​ или 20, скопировал​ данные из одной​Код уровня группы​ Sub​ Type.Missing, Type.Missing, Type.Missing,​ — ОК. Все.​DiSco​ от фиксированного числа​ с текстовыми значениями,​

​ пока что доходит​Прийдется вручную включать​

​IsEmpty(Cells(iRow, 1))​ Cells(i, 1).Value =​
​продемонстрировано в следующем​
​, то переменная​

​Структура оператора цикла​

office-guru.ru

Excel. Как в Excel сделать циклическую формулу? И будет ли «работать» формула?

​ не сколько переменных​​ ее на этот​
​ таблицы в другую,​ | Наименование |​Пример №2:​ Type.Missing, Type.Missing, Type.Missing,​
​Макс пушкарев​: Как создать цикл​ строк в столбце,​
​ количество строк во​Спасибо!​ итерации.​находится в начале​
​ iFib ‘вычисляем следующее​

​ примере. Здесь цикл​dTotal​
​For​ на величину «к»​

​ лист, нажал на​ если вторая таблица​
​ Подгруппа​В следующем примере​ Type.Missing, Type.Missing, Type.Missing,​: ну это делается​ перебирающий значения клеток?​ а будет запускать​
​ всех столбцах разное.​
​Guest​
​Demetry​ конструкции​

​ число Фибоначчи и​ перебирает 100 записей​для каждого повторения​
​в Visual Basic​ а заканчивается цикл​
​ кнопку и символа​ постоянно разная.​2 | Подгруппа​ скрываются первый и​ Type.Missing, Type.Missing, Type.Missing,​
​ через VBA скорее​ Например: A1,A2…A100?​ очередной цикл, когда​Пример:​
​: Если больше нравится​: Насчет формулы как-то​

​Do Until​​ увеличиваем индекс позиции​ массива и сравнивает​ цикла принимает значения​ может быть организована​
​ по выполнению условия​ поставились бы. Прикрепить​Т.е. Есть табл.1​
​ A |​ второй листы книги.​
​ Type.Missing, Type.Missing); excelsheets​ васего! Alt+F11​
​Что-то вроде:​
​ «наткнется» на пустую​
​______________​ ГПР, то:​ не уверен, а​, следовательно цикл будет​

можно ли задать цикл в одной формуле?

​ элемента на 1​​ каждую со значением​

​ 0.0, 0.1, 0.2,​
​ в одной из​ например e>=1​ файл я не​ с тремя столбцами:​1 | товар1​ Sub example2 ()​ = excelappworkbook.Worksheets; //Excel.Application​piloterist​Set myRange =​ ячейку?​| -|A1|B1|C1|D1|​=ГПР(9E+307;$D4:W4;1)​ функцию можно. Например,​ выполнен хотя бы​
​ iFib_Next = iFib​ переменной​ 0.3, … 9.9,​ двух форм: как​KuklP​ нашел где(((​ 1. наименование 2.​
​ | A​ Dim i As​ app = new​: Добрый день.​ ActiveSheet.Range(‘A1:A100’) For Each​В реальной задаче​|——————-​9E+307 — максимально​
​ такая:​ один раз, если​ + iStep i​dVal​
​ 10.0.​

​ цикл​​:​

​Serge_007​​ сумма 3. символ​

​1 | товар2​​ Long For i​ Microsoft.Office.Interop.Excel.Application(); //app.Workbooks.Add(Type.Missing); Excel.Worksheet​
​Подскажите пожалуйста как​ c In myRange.Cells​ в столбце A1​|1 | A​ возможное (ну или​
​Function CYCLE(m_start As​ первая взятая ячейка​ = i +​
​. Если совпадение найдено,​Для определения шага цикла​For … Next​

​200?’200px’:»+(this.scrollHeight+5)+’px’);»>if e>=1 then exit​

​: Правила надо читать,​​и есть массив,​ | A​
​ = 1 To​

​ sheet = (Excel.Worksheet)excelappworkbook.ActiveSheet;​ сделать цикл по​ ‘ … Next​ будет 64 значения,​
​ | 1| a|​ почти максимально) число​ Integer, m_end As​ не пуста.​ 1 Loop End​

​ то цикл прерывается:​​ в VBA можно​или как цикл​
​ for(do)​ там всё написано.​ где хранятся символа.​1 | ………..​ 2 Sheets(i).Visible =​ label24.Text = sheet.Cells[2,​ столбцам Excel файла.​ cНет, это не​ в B1=32, C1=64,​ X |​ в Excel.​ Integer)​Однако, как было показано​
​ Sub​For i =​ использовать отрицательную величину,​For Each​Только какое отношение​BOOM​ табл.2: 1. наименование​ | A​
​ False Next i​ 2].ToString();результат: System._ComObject​ Надо в первой​ подходит. Он просто​ D1=16.​|2 | B​

​не найдя данное​​For i =​

planetaexcel.ru

Построить формулу с циклом для перебора вариантов сочетаний. (Формулы/Formulas)

​ в примерах цикла​​В приведённом примере условие​
​ 1 To 100​ например, вот так:​.​
​ вопрос имеет к​: я сделал через​
​ 2. символ​2 | Подгруппа​ End Sub​mih0505​ строке отыскать столбец​ работает с выделеным​Знаю, что на​ | 2| b|​ число, или число​ m_start To m_end​Do While​iFib_Next < 1000​ If dValues(i) =​
​For i =​Цикл​ теме? Циклы имеются​ функцию ВПР​Вопрос, как можно​
​ B |​
​Пример №3:​: C# sheet.Cells[2, 2].Value.ToString();​ с нужным числом.​ диапазоном. А мне​
​ лист весь вывод​
​ Y |​
​ больше данного, формула​
​CYCLE = CYCLE​
​, в некоторых ситуациях​проверяется в начале​ dVal Then IndexVal​
​ 10 To 1​For … Next​ в большинстве программ,​
​0mega​ макросом проставить правильные​1 | товар1​
​Рассмотрим вариант цикла​Цикл​Вопрос становиться все​
​ нужно чтобы он​ не поместится, поэтому,​|3 | C​
​ возвращает значение из​
​ + i​ нужно, чтобы цикл​ цикла. Поэтому если​
​ = i Exit​
​ Step -1 iArray(i)​
​использует переменную, которая​
​ это не повод​
​:​
​ символа в таблицу​
​ | B​
​ с Step (шагом)​
​For…Next​
​ актуальнее! Неужели нельзя​
​ проверял условие в​
​ либо буду использовать​
​ | _| c|​
​ последней заполненной ячейки​
​Next​
​ был выполнен хотя​ бы первое значение​ For End If​ = i Next​ последовательно принимает значения​ постить в темы​Гость​
​ 1 из таблицы​
​1 | товар5​
​ через одну ячейку,​используется когда необходимо​ запустить цикл по​
​ каждой строке от​ в колонке A1​ Z |​
​alexfa88​End Function​ бы один раз,​
​iFib_Next​ Next i​ i​
​ из заданного диапазона.​ с циклами вопросы​,​
​ 2, если она​
​ | B​ в данном случае​ повторить действия заранее​ столбца Excel?​
​ 1 до 100.Ну​ каждый раз по​|4 | D​: есть правда один​суммирует в цикле​ не зависимо от​было бы больше​Цикл​Здесь шаг приращения равен​ С каждой сменой​
​ хоть как-то с​никак я могу​ не постоянна, имеет​1 | ……..​ будут заполнены ячейки​
​ заданное кол-во раз.​Петррр​ так какие проблемы,​ 2 значения (получится​ | _| d|​ нюанс:​ все целые в​ первоначального результата условного​ 1000, то цикл​Do While​-1​ значения переменной выполняются​ ними связанные.​ войти в тему​ разное кол-во наименований?​
​ | B​
​ через одну (А1,А3,А5,А7,А9).​Цикл​
​: Собственно, в чем​ вставь проверку условия​
​ как раз 65536),​

​ _ |​если в одном​ диапазоне от m_start​ выражения. В таком​
​ бы не выполнялся​выполняет блок кода​, поэтому переменная​ действия, заключённые в​

​savrix​​ …​0mega​2 | Подгруппа​
​ Sub example3 ()​For…Nex​ проблема?​
​ в том цикле,​
​ либо попрошу опять​
​|5 | E​
​ квартале лимит не​ до m_end включительно.​ случае условное выражение​ ни разу.​
​ до тех пор,​

​i​​ теле цикла. Это​
​: Доброго времени суток!!!​предложенный вариант выполняет​:​ С |​ Dim i As​t имеет следующий синтаксис:​piloterist​
​ который написал Comanche.​ же здесь помощи,​

​ | _| _|​​ устанавливался вовсе (такое​
​alexfa88​ нужно поместить в​Другой способ реализовать цикл​ пока выполняется заданное​
​с каждым повторением​
​ легко понять из​

excelworld.ru

Как создать цикл перебирающий значения клеток в Excel?

​ Господа, подскажите пожалуйста​​ эти требования .​BOOM​1 | товар1​

​ Long For i​
​For i = Start​: ну столбец же​ А если не​ чтобы реализовать переход​ _ |​ тоже может быть),​: Доброго времени суток!​ конце цикла, вот​Do While​ условие. Далее приведён​ цикла принимает значения​ простого примера:​ такой вопрос… Есть​Quote​, здравствуйте​ | С​ = 1 To​ To End [Step​ в Excel имеет​ подходит то опиши​ на другой лист​———————​ но при этом​
​Есть следующая задача:​ так:​
​– поместить условие​ пример процедуры​ 10, 9, 8,​For i =​ табличка, подобие ЗП,​(Гость)200?’200px’:»+(this.scrollHeight+5)+’px’);»>…пользователь получил таблицу​наличие настоящей таблицы​1 | товар2​ 10 Step 2​ StepSize]​ буквенное обозначение… как​

CyberForum.ru

Как сделать цикл в Excel

​ задачу, может какие​ с помощью такого​Хочу в итоговой​ лимит был в​существует ряд предприятий,​Do … Loop​ не в начале,​Sub​ … 1.​ 1 To 10​ и нужно что​ из 2000 строк​ в формате​
​ | С​ ActiveSheet.Range(«A» & i).Value​

​//операторы//​​ мне прогнать цикл​ другие варианты есть.Почти​ макроса (вычитал на​ колонке получить массив​ предыдущем квартале, то​ по которым в​ Until IsEmpty(Cells(iRow, 1))​ а в конце​, в которой при​Цикл​ Total = Total​ бы на отдельных​ или 20, скопировал​.xls​1 | ………​ = i Next​Next [i]​ с буквы А​

​ получилось, он пербирает​​ одном из форумов):​ данных:​ =ПРОСМОТР(9E+307;$D4:W4) вытянет просто​

Цикл по столбцам Excel Файла

​ начале квартала устанавливается​​Урок подготовлен для Вас​
​ цикла. В этом​ помощи цикла​For Each​ + iArray(i) Next​ листах формировались расчетные​ ее на этот​
​- существенно ускорит​ | С​ i End Sub​i​

​ например на 100​​ значения, Но у​200?’200px’:»+(this.scrollHeight+5)+’px’);»>set ws = activesheet​

​1 A1aX​​ самое последнее значение​ лимит задолженности, потом​ командой сайта office-guru.ru​ случае цикл будет​Do While​похож на цикл​ i​ листки, по каждому​ лист…​ вероятность правильного ответа​Я попробовала через​

​Balbasochka​​– численная переменная VBA​ столбцов вперед чтобы​

​ меня следубщая задача:​​If ws.cols.count =​2 A1aY​ из всего массива,​ в течение квартала​Источник: http://www.excelfunctions.net/VBA-Loops.html​ выполнен хотя бы​выводятся последовательно числа​For … Next​В этом простом цикле​

​ сотруднику, которые есть​​Во вторую таблицу​ .​=ЕСЛИ(И(A37=1;СМЕЩ(A37;-1;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-1;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-2;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-2;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-3;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-3;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-4;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-4;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-5;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-5;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-6;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-6;1;1);1);ЕСЛИ(И(A37=1;СМЕЩ(A37;-7;0;;1)=2);ПРАВСИМВ(СМЕЩ(A37;-7;1;1);1);»»)))))))​: Добрый день!​ (счетчик)​ найти столбцы, у​Есть клетка A1,​ 65… then​3 A1aZ​ а не то​ эти лимиты могут​Перевел: Антон Андронов​ раз, не зависимо​ Фибоначчи не превышающие​, но вместо того,​

​For … Next​​ в табличке. Записать​ можно вводить данные​P.S.​Но строк может​
​Помогите, пожалуйста, с​
​Start​ который в i-ой​ D1 и E1.​set ws =​4 A1bX​ что было именно​ пересматриваться, частота и​Автор: Антон Андронов​ от того, выполняется​ 1000:​ чтобы перебирать последовательность​используется переменная​ макрос с созданием​ с клавиатуры, а​если не угадал,​ быть очень много…​ формулой.​– численное выражение, определяет​

​ строке нужные мне​​Если значение A1​

CyberForum.ru

Цикл For…Next

​ activeworkbook.sheets.add​​5 A1bY​​ в конкретном квартале.​ периодичность пересмотров не​Ampersand​
​ ли условие.​​’Процедура Sub выводит​​ значений для переменной-счётчика,​
​i​ этого листка для​ можно через copy-paste.​
​ тогда файл в​
​ можно задать какой-то​

​Есть таблица с​
​ начальное значение для​ данные.​
​ Как сделать?For i​
​end if​…​В принципе это​
​ устанавливаются, т.е. могут​
​: ЦИКЛИЧЕСКИЕ ФОРМУЛЫ​Схематично такой цикл​ числа Фибоначчи, не​
​ цикл​, которая последовательно принимает​ каждого сотрудника и​Quote​ студию​ цикл? Если ЛОЖЬ,​ определенной структурой.​ переменной​Петррр​ = 1 To​Буду благодарен если​12 A1dZ​ я уже начинаю​ пересматривать часто в​Чтобы формулы работали​Do While​ превышающие 1000 Sub​For Each​ значения 1, 2,​ прописать туда ссылки​(Гость)200?’200px’:»+(this.scrollHeight+5)+’px’);»>… нажал на​RAN​ то минус 1​Нужно определить для​
​End​
​: Можно и по​ 100 If Cells(i,​ поможете реализовать идею,​13 A2aX​ умничать и придираться,​
​ одном квартале, в​ в цикле -​с проверяемым условием​ Fibonacci() Dim i​выполняет набор действий​ 3, … 10,​ на нужные ячейки​ кнопку и символа​​:​
​ строка к предыдущему​ каждой позиции подгруппу,​– это также численное​ индексам обращаться.​ 1) < 10​ и объяснить принцип​…​ для решения данной​ другом квартале может​ должны быть включены​​ в конце будет​
​ As Integer ‘счётчик​ для каждого объекта​ и для каждого​ с общей таблицы​ поставились бы…​BOOM​ и т.д.​ в которую она​ выражение, определяет конечное​piloterist​ Then Cells(i, 4)​ действия конкретного макроса.​24 A2dZ​ проблемы можно вручную​

excelworld.ru

Цикл в формуле — проверка условий и подстановка значений (Формулы/Formulas)

​ обойтись вообще без​​ итерации.​
​ выглядеть вот так:​ для обозначения позиции​
​ из указанной группы​ из этих значений​
​ не проблема… НО​Символы займут нужное​или не​VBA совсем не​ входит. Код уровня​ значение для переменной.​: По каким индексам?​ = Cells(i, 1)​Прикрепил сам файл​25 B1aX​ изменить диапазон массива,​ пересмотров.​Ячейка выполняет действия​Do … Loop​
​ элемента в последовательности​
​ объектов. В следующем​ выполняется код VBA,​ делать это для​
​ место автоматически сразу​BOOM​
​ знаю. Помогите, пожалуйста!​ для наименования подгруппы​
​Цикл по счетчику​ Задача пройтись циклом​
​ Else Cells(i, 5)​ с задачей, а​
​…​ что не так​
​Каким образом можно​ со своими же​
​ While iFib_Next <​ Dim iFib As​
​ примере при помощи​
​ находящийся внутри цикла.​ каждого сотрудника долго((((…​
​ после ввода таблицы​отвечать на вопрос,​
​_Boroda_​ всегда один и​
​ выделяется ключевыми словами​
​ по первой строке​
​ = Cells(i, 1)​ то строки таблицы​…​
​ долго,​ на определенный срез​
​ значеними​ 1000​
​ Integer ‘хранит текущее​ цикла​
​ Таким образом, данный​ Так вот суть​
​А кнопочка-то зачем​ зависит от вас.​
​: Так пойдет?​ тот же, код​
​ For и Next.​ всех столбцов и​
​ End If Next​ съезжают…​
​120 E2dZ​но если в​
​ (например на последний​В ячейку D2​
​Цикл​ значение последовательности Dim​
​For Each​ цикл суммирует элементы​
​ вопроса… Подскажите, как​​ нужна ?​
​0mega​=ЕСЛИ(A20=2;ПСТР(B20;11;99);C19)​ уровня для номенклатуры​ После начального For​ отобрать столбцы прошедшие​ i​Светлый​
​Конец.​ формулу еще заложить​

​ день квартала) в​​ вволите значение и​
​Do Until​
​ iFib_Next As Integer​выполняется перечисление всех​
​ массива​

​ сделать цикл, что​​BOOM​принципиальный противник макросов,​Или так (если​ тоже всегда один​
​ указывается имя переменной,​ по условию. А​Задача есть 2 формулы​: Макросы (VBA) в​Для упрощения решения​
​ механизм просмотра массива​ одном столбце сразу​ ячейка A2 сама​очень похож на​ ‘хранит следующее значение​

​ листов в текущей​​iArray​ бы он проходил​
​: просто задачу такую​
​ так что его​ с пропусками)​ и тот-же. Количество​ данная переменная (i)​ потом у этих​ 1 в первую​ другом разделе. Или​

excelworld.ru

цикл (цикл)

​ могу предложить добавить​​ по определенному критерию,​ подтянуть все самые​
​ себя пересчитывает​ цикл​ последовательности Dim iStep​ рабочей книге Excel:​в переменной​
​ по всей табличке​ поставили . Т.к​ ответ либо не​Код=ЕСЛИ(A20=2;»»;ЕСЛИ(A19=2;ПСТР(B19;11;99);D19))​
​ строк в каждой​ будет счетчиком, после​ столбцов получить значение​ подставляется число X.​
​ переименуйте тему.​ в каждый исходный​ то это будет​ последние пересмотренные лимиты?​B2=ABS(B2-D2)​Do While​ As Integer ‘хранит​

​Dim wSheet As​​Total​​ и для каждого​​ пользователи не умеют​
​ удовлетворяет постановке задачи​Balbasochka​​ подгруппе неопределенное, количество​​ знака равенства идёт​ в определенной строке.​ В конце расчёта​
​А формульное решение​
​ столбец количество символов​ очень замечательно! :)​Прилагаю файл, в​

​В ячейку А1​​: блок кода в​​ размер следующего приращения​​ Worksheet For Each​​.​​ сотрудника создавал расчетный​ пользоваться офисом и​
​либо вы поставили​​: Не работает, возможно​ подгрупп тоже может​ начальное значение счетчика,​Петррр​
​ получаем число X​ Вашей задачи во​
​ для равного значения​kim​ нем же есть​sad

​ вводим любую информацию​​ теле цикла выполняется​ ‘инициализируем переменные i​ wSheet in Worksheets​В приведённом выше примере​
​ листок. Пример файла​ чтобы им меньше​ задачу неверно.​
​ я описала в​ отличаться.​

​ а после ключевого​​: C# using System;​
​ но другое. Теперь​ вложенном файле.​ строк в каждом​: =ЕСЛИОШИБКА(ПРОСМОТР(2;1/((X2=$D$2:$W$2)*($D4:$W4<>»»));$D4:W4);»»)​ предложение, какой именно​Автоматически в В1​ раз за разом​ и iFib_Next i​ MsgBox «Найден лист:​ шаг приращения цикла​ прилагаю. Заранее благодарен​ делать манипуляций, хотят​На форум иногда​ тексте не очень​Имеем:​ слова To -​ using Exel =​ надо подставить это​200?’200px’:»+(this.scrollHeight+5)+’px’);»>=СМЕЩ(A$1;ОТБР((СТРОКА()-1)/32/64/16);)&СМЕЩ(B$1;ОСТАТ(ОТБР((СТРОКА()-1)/64/16);32);)&СМЕЩ(C$1;ОСТАТ(ОТБР((СТРОКА()-1)/16);64);)&СМЕЩ(D$1;ОСТАТ(СТРОКА()-1;16);)​

​ столбце:​​Yurasha​ цикл нужно использовать,​

​ зафиксируется время​​ до тех пор,​ = 1 iFib_Next​

​ » & wSheet.Name​​ не указан, поэтому​​ за любую помощь.​​ одной кнопочкой.​
​ заглядывают экстрасенсы, но​ точно.​Код уровня группы​
​ конечное значение счетчика.​ Microsoft.Office.Interop.Excel; class Program​
​ число в начало​​И универсальная:​| | A1|B1|C1|D1|​: Здравствуйте!​ но, к сожалению​Интересное решение предложил​
​ пока заданное условие​ = 0 ‘цикл​ Next wSheet​ для пошагового увеличения​
​ Всем добра )​​я могу проставить​ не часто…​В ячейку C​
​ | Наименование |​ По умолчанию счётчик​ { static void​
​ и так до​Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>=СМЕЩ(A$1;ОСТАТ(ОТБР((СТРОКА()-1)/СЧЁТЗ(B:B)/СЧЁТЗ(C:C)/СЧЁТЗ(D:D));СЧЁТЗ(A:A));)&СМЕЩ(B$1;ОСТАТ(ОТБР((СТРОКА()-1)/СЧЁТЗ(C:C)/СЧЁТЗ(D:D));СЧЁТЗ(B:B));)&СМЕЩ(C$1;ОСТАТ(ОТБР((СТРОКА()-1)/СЧЁТЗ(D:D));СЧЁТЗ(C:C));)&СМЕЩ(D$1;ОСТАТ(СТРОКА()-1;СЧЁТЗ(D:D));)​

​|——————-​​Я здесь новичок​ не догадываюсь, как​ Michael_S​ выполняется (результат условного​ Do While будет​Оператор​ переменной​
​Udik​ в цикле только​0mega​ нужно проставить значение​ Подгруппа​ работает с шагом​

​ Main(string[] args) {​​ тех пор пока​
​А эту формулу​
​|1 | A​ и это мой​
​ его реализовать в​Но этот способ​
​ выражения равен​
​ выполняться до тех​
​Exit For​

​i​​: Лучше вам новую​ значение, типа символа​: Все мало-мальски имеющие​

​ из столбца B​​2 | Подгруппа​ равным единице. Можно​ Exel.Application app =​ верхнее и нижнее​ можно протянуть по​ | 1| a|​ первый пост.​ одной формуле.​ требует дополнителный столбец​True​

​ пор, пока значение​​применяется для прерывания​​от 1 до​ тему открыть, типа​
​ или слова, а​ эти возможности сейчас​ и его надо​ A |​ задавать другое значение​ new Microsoft.Office.Interop.Excel.Application(); app.Workbooks.Add(Type.Missing);​ значения X не​ столбцам и получим​ X |​

​Помогите пожалуйста составить​​Пожалуйста, если есть​ (который можно закрыть​). В следующей процедуре​ ‘текущего числа Фибоначчи​ цикла. Как только​ 10 по умолчанию​добавление новых листов по​ вот как формулу​ участвуют на съемках​ найти снизу вверх.​1 | товар1​ (StepSize), на которое​ Exel.Worksheet sheet =​ совпадут.​ все 64*32*64*16 сочетаний:​|2 | B​ цикл.​ какие либо варианты​ или расположить на​Sub​ не превысит 1000​ в коде встречается​ используется приращение​ списку​ проставлять не знаю​ TV​Если была бы​ |​ будет изменяться «i»,​ (Exel.Worksheet)app.ActiveSheet; for (int​

​Как это сделать​​Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>=СМЕЩ($A$1;ОТБР(((СТРОКА()-1)+(СТОЛБЕЦ(A1)-1)*65536)/32/64/16);)&СМЕЩ($B$1;ОСТАТ(ОТБР(((СТРОКА()-1)+(СТОЛБЕЦ(A1)-1)*65536)/64/16);32);)&СМЕЩ($C$1;ОСТАТ(ОТБР(((СТРОКА()-1)+(СТОЛБЕЦ(A1)-1)*65536)/16);64);)&СМЕЩ($D$1;ОСТАТ(СТРОКА()-1;16);)​ | 2| b|​​Думаю, что правильнее​ — помогите пожалуйста,​

excelworld.ru

​ «далеких » адресах.​

This post provides a complete guide to the standard VBA For Loop and the VBA For Each Loop.

If you are looking for information about the VBA While and VBA Do Loop then go here.

If you want some quick info about the For loops then check out the Quick Guide table in the section below.

If you are looking for information on a particular topic then check out the Table of Contents below.

“History is about loops and continuums” – Mike Bidlo.
 

Related Links for the VBA For Loop

The Complete Guide to Ranges in Excel VBA.
The Complete Guide to Copying Data in Excel VBA.
VBA Do While Loop.

A Quick Guide to the VBA For Loop

Loop format Description Example
For … Next Run 10 times For i = 1 To 10
Next
For … Next Run 5 times. i=2,4, 6 etc. For i = 2 To 10 Step 2
Next
For … Next Run in reverse order For i = 10 To 1 Step -1
    Debug.Print i
Next
For … Next Go through Collection For i = 1 To coll.Count
    Debug.Print coll(i)
Next
For … Next Go through array For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next i
For … Next Go through 2D array For i = LBound(arr) To UBound(arr)
    For j = LBound(arr,2) To UBound(arr,2)
        Debug.Print arr(i, j)
    Next j
Next i
For Each … Next Go through Collection Dim item As Variant
For Each item In coll
    Debug.Print item
Next item
For Each … Next Go through array Dim item As Variant
For Each item In arr
    Debug.Print item
Next item
For Each … Next Go through 2D array Dim item As Variant
For Each item In arr
    Debug.Print item
Next item
For Each … Next Go through Dictionary Dim key As Variant
For Each key In dict.Keys
    Debug.Print key, dict(key)
Next key
Both types Exit Loop For i = 1 To 10
    If Cells(i,1) = «found» Then
        Exit For
    End If
Next i

The VBA For Loop Webinar

If you are a member of the website, click on the image below to view the webinar for this post.

(Note: Website members have access to the full webinar archive.)

Introduction to the VBA For Loop

Loops are by far the most powerful component of VBA. They are the rocket fuel of your Macros. They can perform tasks in milliseconds that would take humans hours. They also dramatically reduce the lines of code your applications need.

For Loops have been part of all major programming languages since they were first used with Fortan in 1957.

If you have never used loops before then this post is a great place to start. It provides an in-depth guide to loops, written in plain English without the jargon.

Let’s start with a very important question – what are loops and why do we need them?

What are VBA For Loops?

A loop is simply a way of running the same lines of code a number of times. Obviously running the same code over and over would give the same result.

So what is important to understand is that the lines of code normally contain a variable that changes slightly each time the loop runs.

For example, a loop could write to cell A1, then cell A2, A3 and so on. The slight change each time is the row.

Let’s look at a simple example.

VBA For Loop Example 1

 
The following code  prints the values 1 to 5 in the Immediate Window(Ctrl + G to view).

Debug.Print 1
Debug.Print 2
Debug.Print 3
Debug.Print 4
Debug.Print 5

The Immediate Window

If you have not used the Immediate Window before then this section will get you up to speed quickly.

The function Debug.Print writes values to the Immediate  Window. To view this window select View->Immediate Window from the menu( the shortcut is Ctrl + G)

 
ImmediateWindow

 
ImmediateSampeText

VBA For Loop Example 2

Now imagine we want to print out the numbers 1 to 20. We would need to add 15 more lines to the example above.

 
However, using a loop we only need to write Debug.Print once.

    For i = 1 To 20
        Debug.Print i
    Next i

 
The output is:

VBA Excel

Output

 
If we needed print the numbers 1 to 1000 then we only need to change the 20 to 1000.

Normally when we write code we would use a variable instead of a number like 20 or 1000. This gives you greater flexibility. It allows you to decide the number of times you wish to run the loop when the code is running. The following example explains this.

VBA For Loop Example 3

A common task in Excel is read all the rows with with data. 

 
The way you approach this task is as follows

  1. Find the last row with data
  2. Store the value in variable
  3. Use the variable to determine how many times the loop runs

 
Using a variable in the loop makes your code very flexible. Your will work no matter how many rows there are.

Let’s have a look at an example. Imagine you receive a sheet with a list of fruit types and their daily sales. You want to count the number of Oranges sold and this list will vary in size depending on sales.

 
The following screenshot shows an example of this list

Sample Data of Fruit Sales

Sample Data of Fruit Sales

 
We can use the code to count the oranges

' https://excelmacromastery.com/
Sub CountFruit()

    ' Get the last row with text
    Dim LastRow As Long
    LastRow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row

    Dim i As Long, Total As Long
    ' Use LastRow in loop
    For i = 2 To LastRow
        ' Check if cell has text "Orange"
        If Sheet1.Cells(i, 1).Value = "Oranges" Then
            ' Add value in column B to total
            Total = Total + Sheet1.Cells(i, 2).Value
        End If
    Next i

    ' Print total
    Debug.Print "Total oranges sold was:"; Total

End Sub

 
You can try this code for yourself. Change the number of fruit items and you will see that the code still works fine.

If you were to increase the number fruit items to a large value like 10,000 then you will hardly notice the difference in the time it takes to run – almost instantly.

Loops are super fast. This is what makes them so powerful. Imagine performing a manual task on 10,000 cells. It would take a considerable amount of time.

Advantages of the VBA For Loop

4To conclude this section we will list the major advantages of using loops

  • They reduce the lines code you need
  • They are flexible
  • They are fast

 
In the next sections we will look at the different types of loops and how to use them.

The Standard VBA For Loop

The VBA For loop is the most common loop you will use in Excel VBA. The For Loop is used when you can determine the number of times it will be run. For example, if you want to repeat something twenty times.

YouTube Video For Loop

Check out this YouTube Video of the For Loop:

Get the workbook and code for this video here
 

Format of the Standard VBA For Loop

The Standard VBA For Loop has the following format:

For <variable> = <start value> to <end value>
Next <variable>

The start and end values can be variables. Also the variable after Next is optional but it is useful and it makes it clear which for loop it belongs to.

How a For Loop Works

Let’s look at a simple for loop that prints the numbers 1 to 3

    Dim i As Long
    For i = 1 To 3
        Debug.Print i
    Next i

 
How this code works is as follows

i is set to 1
The value of i(now 1) is printed

 
i is set to 2
The value of i(now 2) is printed

 
i is set to 3
The value of i(now 3) is printed

 
If we did not use a loop then the equivalent code would be

    Dim i As Long
    i = i + 1
    Debug.Print i
    i = i + 1
    Debug.Print i
    i = i + 1
    Debug.Print i

 
The i = i + 1 line is used to add 1 to i and is a common way in programming to update a counter.

Using Step with the VBA For Loop

You can see that i is increased by one each time. This is the default. You can specify this interval using Step keyword.

 
The next example shows you how to do this:

    ' Prints the even numbers i.e. 2,4,6,8 ... 20
    For i = 2 To 20 Step 2
        Debug.Print i
    Next i

 
You can use a negative number with Step which will count in reverse

    ' Prints the even numbers in reverse i.e. 20,18,16,14 ... 2
    For i = 20 To 2 Step -2
        Debug.Print i
    Next i

 
Note: if Step is positive then your starting number must be lower than you ending number. The following loop will not run because the starting number 20 is greater than 10. VBA therefore, thinks it has already reached the target value 10.

    ' Will not run as starting number already greater than 10
    For i = 20 To 10 Step 1
        Debug.Print i
    Next i

 
If Step is negative then the start number must be greater than the end number.

Exit the For Loop

Sometimes you may want to leave the loop earlier if a certain condition occurs. For example if you read bad data.

 
You can use Exit For to automatically leave  the loop as shown in the following code

    For i = 1 To 1000

        ' If cell is blank then exit for
        If Cells(i, 1) = "" Then
            MsgBox "Blank Cell found - Data error"
            Exit For
        End If

    Next i

Using the VBA For Loop with a Collection

The For loop can also be used to read items in a Collection.

 
In the following example, we display the name of all the open workbooks

    Dim i As Long
    For i = 1 To Workbooks.Count
        Debug.Print Workbooks(i).FullName
    Next i

Using Nested For Loops

Sometimes you may want to use a loop within a loop. An example of this would be where you want to print the names of the worksheets of each open workbook.

The first loop would go through each workbook. Each time this loop runs it would use a second loop to go through all the worksheets of that workbook. It is actually much easier to do than it sounds.

 
The following code shows how:

' https://excelmacromastery.com/
Sub ListWorksheets()

    Dim i As Long, j As Long
    ' First Loop goes through all workbooks
    For i = 1 To Workbooks.Count

        ' Second loop goes through all the worksheets of workbook(i)
        For j = 1 To Workbooks(i).Worksheets.Count
            Debug.Print Workbooks(i).Name + ":" + Worksheets(j).Name
        Next j

    Next i

End Sub

 
This works as follows:

 
The first loop sets i to 1

 
The second loop then uses the workbook at 1 to go through the worksheets.

 
The first loop sets i to 2

 
The second loop then uses the workbook at 2 to go through the worksheets.

 
and so on

 
It the next section we will use a For Each loop to perform the same task. You will find the For Each version much easier to read.

The VBA For Each Loop

The VBA For Each loop is used to read items from a collection or an array. We can use the For Each loop to access all the open workbooks. This is because Application.Workbooks is a collection of open workbooks.

 
This is a simple example of using the For Each Loop

    Dim wk As Workbook
    For Each wk In Workbooks
        Debug.Print wk.FullName
    Next wk

 Format of the VBA For Each Loop

You can see the format of the VBA for each loop here(See Microsoft For Each Next documentation):
For Each <variable> in <collection>
Next <variable>

To create a For Each loop we need a variable of the same type that the collection holds. In the example here we created a variable of type Workbook.

If the collection has different types of items we can declare the variable as a variant.

VBA contains a collection called Sheets. This is a collection of sheets of type Worksheet(normal) and Chart(when you move a chart to be a full sheet). To go through this collection you would declare the variable as a Variant.

 
The following code uses For Each to print out the name of all the sheets in the current workbook

    Dim sh As Variant
    For Each sh In ThisWorkbook.Sheets
        Debug.Print sh.Name
    Next sh

Order of Items in the For Loop

For Each goes through items in one way only.

For example, if you go through all the worksheets in a workbook it will always go through from left to right. If you go through a range it will start at the lowest cell e.g. Range(“A1:A10”) will return A1,A2,A3 etc.

This means if you want any other order then you need to use the For loop.

 
Both loops in the following example will read the worksheets from left to right:

    ' Both loops read the worksheets from left to right
    Dim wk As Worksheet
    For Each wk In ThisWorkbook.Worksheets
        Debug.Print wk.Name
    Next

    Dim i As Long
    For i = 1 To ThisWorkbook.Worksheets.Count
        Debug.Print ThisWorkbook.Worksheets(i).Name
    Next

 
As you can see the For Each loop is neater to write. However if you want to read the sheets in any other order e.g. right to left then you have to use the for loop:

    ' Reading the worksheets from right to left
    Dim i As Long
    For i = ThisWorkbook.Worksheets.Count To 1 Step -1
        Debug.Print ThisWorkbook.Worksheets(i).Name
    Next

Using the VBA For Each Loop With Arrays

One thing to keep in my is that the For Each loop is that it is read-only when you use it with arrays.

 
The following example demonstrates this:

' https://excelmacromastery.com/
Sub UseForEach()

    ' Create array and add three values
    Dim arr() As Variant
    arr = Array("A", "B", "C")

    Dim s As Variant
    For Each s In arr
        ' Changes what s is referring to - not value of array item
        s = "Z"
    Next

    ' Print items to show the array has remained unchanged
    For Each s In arr
        Debug.Print s
    Next

End Sub

 
In the first loop we try to assign s to “Z”. When happens is that s is now referring the string “Z” and no longer to the item in the array.

In the second loop we print out the array and you can see that none of the values have changed.

 
When we use the For Loop we can change the array item. If we change the previous code to use the For Loop you it will change all the array values to “Z”

' https://excelmacromastery.com/
Sub UsingForWithArray()

    ' Create array and add three values
    Dim arr() As Variant
    arr = Array("A", "B", "C")

    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        ' Changes value at position to Z
        arr(i) = "Z"
    Next

    ' Print items to show the array values have change
    For i = LBound(arr) To UBound(arr)
        Debug.Print arr(i)
    Next

End Sub

If your Collection is storing Objects the you can change the items using a For Each loop.

Using Nested For Each Loops

We saw already that you can have a loop inside other loops. Here is the example from above:

' https://excelmacromastery.com/
Sub ListWorksheets()

    Dim i As Long, j As Long
    ' First Loop goes through all workbooks
    For i = 1 To Workbooks.Count

        ' Second loop goes through all the worksheets of workbook(i)
        For j = 1 To Workbooks(i).Worksheets.Count
            Debug.Print Workbooks(i).Name + ":" + Worksheets(j).Name
        Next j

    Next i

End Sub

This time we will use the For Each loop to perform the same task:

' https://excelmacromastery.com/
Sub ReadAllWorksheets()

    Dim wk As Workbook, sh As Worksheet
    ' Read each workbook
    For Each wk In Workbooks

        ' Read each worksheet in the wk workbook
        For Each sh In wk.Worksheets
            ' Print workbook name and worksheet name
            Debug.Print wk.Name + ": " + sh.Name
        Next sh

    Next wk

End Sub

As you can see this is a neater way of performing this task than using the For Loop:

This code run as follows:

  1. Get the first Workbook from the Workbooks collection
  2. Go through all the worksheets in this workbook
  3. Print the workbook/worksheet details
  4. Get the next workbooks in the collection
  5. Repeat steps 2 to 3
  6. Continue until no more workbooks are left in the collection

How to Loop Through a Range

In Excel VBA, the most common use of a For Loop is to read through a range.

Imagine we have the data set in the screenshot below. Our task is to write code that will read through the data and copy the amounts to the column J. We are only going to copy amounts that are greater than 200,000.

VBA For Loop Range

 
The following example shows how we do it:

' Read through an Excel Range using the VBA For Loop
' https://excelmacromastery.com/
Sub ForLoopThroughRange()

    ' Get the worksheet
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    
    ' Get the Range
    Dim rg As Range
    Set rg = sh.Range("A1").CurrentRegion
    
    ' Delete existing output
    sh.Range("J1").CurrentRegion.ClearContents
    
    ' Set the first output row
    Dim row As Long
    row = 1
    
    ' Read through all the rows using the For Loop
    Dim i As Long
    For i = 2 To rg.Rows.Count
    
        ' Check if amount is greater than 200000
        If rg.Cells(i, 4).Value > 200000 Then
        
            ' Copy amount to column m
            sh.Cells(row, "J").Value = rg.Cells(i, 4).Value
            
            ' Move to next output row
            row = row + 1
            
        End If
        
    Next i
    
End Sub

 
This is a very basic example of copying data using Excel VBA. If you want a complete guide to copying data using Excel VBA then check out this post

Summary of the VBA For Loops

The Standard VBA For Loop

  • The For  loop is slower than the For  Each loop.
  • The For loop can go through a selection of items e.g. 5 to 10.
  • The For loop can read items in reverse e.g. 10 to 1.
  • The For loop is not as neat to write as the For Each Loop especially with nested loops.
  • To exit a For loop use Exit For.

The VBA For Each Loop

  • The For Each loop is faster than the For loop.
  • The For Each loop goes through all items in the collectionarray.
  • The For Each loop can go through items in one order only.
  • The For Each loop is neater to write than a For Loop especially for nested loops.
  • To exit a For Each loop use Exit For.

What’s Next?

Free VBA Tutorial If you are new to VBA or you want to sharpen your existing VBA skills then why not try out the The Ultimate VBA Tutorial.

Related Training: Get full access to the Excel VBA training webinars.

(NOTE: Planning to build or manage a VBA Application? Learn how to build 10 Excel VBA applications from scratch.)

7.1 Операторы цикла
7.2 Вложенные циклы


7.1 Операторы цикла.

Циклы позволяют выполнить одну или несколько строк кода несколько раз. VBA поддерживает следующие циклы:

For...Next
For Each...Next
Do... Loop

Конструкция For . . . Next. Когда число повторений известно заранее, используют цикл For . . . Next. В цикле For используется переменная, называемая переменной цикла или счетчиком цикла, которая увеличивается или уменьшается на заданную величину при каждом повторении цикла. Синтаксис этой конструкции следующий:

For counter = start To end [Step increment]
 операторы 
Next [counter]

Параметры counter (счетчик), start (начало цикла), end (конец цикла) и increment (приращение) являются числовыми.

Примечание. Параметр increment может быть как положительным, так и отрицательным. Если он положителен, параметр start должен быть меньше или равен параметру end, иначе цикл не будет выполняться. Если параметр increment отрицателен, то параметр start должен быть больше или равен значению параметра end, чтобы выполнялось тело цикла. Если параметр Step не задан, то значение параметра increment по умолчанию равно 1.

VBA выполняет цикл For в следующей последовательности:

1. Устанавливает значение переменной цикла counter в значение start.

2. Сравнивает значение переменной цикла counter и значение параметра end. Если переменная counter больше, VBA завершает выполнение цикла. (Если значение параметра increment отрицательно, то VBA прекращает выполнение цикла при условии, что значение переменной цикла counter меньше значения параметра end.)

3. Выполняет операторы тела цикла statements.

4. Увеличивает значение переменной цикла counter на 1 или на величину значения параметра increment, если он задан.

5. Повторяет шаги со 2 по 4.

Рассмотрим пример: Вычислить значение функции f(t)

при заданных a, b, n, если t изменяется от a до b с шагом Dt=(b-a)/(n-1).

Sub пример3()
Dim f() As Single
Dim a As Single, b As Single, t As Single, dt As Single
Dim i As Integer, n As Integer
Call read("a1", a) : Call read("b1", b) : Call read("c1", n)
ReDim f(1 To n - 1)
dt = (b - a) / (n - 1) : t = a
Call out("a2", "i") : Call out("b2", "t") : Call out("c2", "f(t)")
For i = 1 To n - 1
t = t + dt
If t <= -1 Then
f(i) = -1
ElseIf t > 1 Then
f(i) = 1
Else
f(i) = t
End If
Call out("a" & (2 + i), i) : Call out("b" & (2 + i), t) : Call out("c" & (2 + i), f(i))
Next i
End Sub

Конструкция For Each . . . Next

Цикл For Each . . . Next похож на цикл For . . . Next, но он повторяет группу операторов для каждого элемента из набора объектов или из массива, вместо повторения операторов заданное число раз. Он особенно полезен, когда неизвестно, сколько элементов содержится в наборе.

Синтаксис конструкции цикла For Each . . . Next таков:

For Each element In group
  операторы 
Next element

Следует помнить следующие ограничения при использовании цикла For Each . . . Next:

 Для наборов параметр element может быть только переменной типа variant, общей переменной типа object или объектом, перечисленным в Object Browser

 Для массивов параметр element может быть только переменной типа Variant

 Нельзя использовать цикл For Each . . . Next с массивом, имеющим определенный пользователем тип, так как переменная типа variant не может содержать значение определенного пользователем типа

Конструкция Do…Loop

Цикл Do применяется для выполнения блока операторов неограниченное число раз. Существует несколько разновидностей конструкции Do . . . Loop, но каждая из них вычисляет выражение-условие, чтобы определить момент выхода из цикла. Как и в случае конструкции If . . . Then условие должно быть величиной или выражением, принимающими значение False (нуль) или True (не нуль).

В следующей конструкции Do . . . Loop операторы выполняются до тех пор, пока значением условия является True (Истина):

Do While условие
  операторы 
Loop

Выполняя этот цикл, VBA сначала проверяет условие. Если условие ложно (False), он пропускает все операторы цикла. Если оно истинно (True), VBA выполняет операторы цикла, снова возвращается к оператору Do While и снова проверяет условие.

Следовательно, цикл, представленный данной конструкцией, может выполняться любое число раз, пока значением условия является не нуль или True (Истина). Отметим, что операторы тела цикла не выполняются ни разу, если при первой проверке условия оно оказывается ложным (False).

Рассмотрим пример: Вычислить сумму ряда

с заданной точностью.

Sub пример4()
Dim e As Single, x As Single, s As Single
Dim m As Single, p As Single, i As Single
Call read("a1", x) : Call read("b1", e)
s = 0: i = 1: m = 1: p = -1
Call out("a2", "i") : Call out("b2", "m") : Call out("c2", "s")
Do While Abs(m) >= e
p = -p * x
m = p / i
s = s + m
Call out("a" & (2 + i), i) : Call out("b" & (2 + i), Abs(m)) : Call out("c" & (2 + i), s)
i = i + 1
Loop
End Sub

Другая разновидность конструкции Do . . . Loop сначала выполняет операторы тела цикла, а затем проверяет условие после каждого выполнения. Эта разновидность гарантирует, что операторы тела цикла выполнятся по крайней мере один раз:

Do
  операторы 
Loop 
While условие

Две другие разновидности конструкции цикла аналогичны предыдущим, за исключением того, что цикл выполняется, пока условие ложно (False):

 Цикл не выполняется вообще или выполняется много раз:

Do Until условие

операторы Loop

 Цикл выполняется по крайней мере один раз:

Do

операторы

Loop Until условие

7.2 Вложенные циклы.

Можно помещать структуры управления внутрь других структур управления (например, блок If . . . Then внутрь цикла For . . . Next). Говорят, что структура управления, помещенная внутрь другой структуры управления, является вложенной.

Глубина вложения управляющих структур в VBA не ограничена. Для улучшения читаемости кода принята практика смещения тела конструкции принятия решения или цикла в программе в случае использования вложенных структур управления.

При вложении в цикл одного или несколько других циклов говорят о вложенных циклах, в которых различают внешние (охватывающие) и внутренние (вложенные) циклы.

Рассмотрим пример суммирования элементов Aij матрицы A(n,m) построчно.

Sub пример5()
Dim a() As Single, s() As Single
Dim n As Integer, m As Integer
Dim i As Integer, j As Integer
Call read("a1", n): Call read("b1", m)
ReDim a(1 To n, 1 To m), s(1 To n)
'Чтение матрицы
For i = 1 To n
For j = 1 To m
Call readcell(i + 1, j, a(i, j))
Next j
Next i
'Вычисление
For i = 1 To n
s(i) = 0
For j = 1 To m
s(i) = s(i) + a(i, j)
Next j
Call outcell(i + 1, m + 1, s(i))
Next i
End Sub

Заметим, что первый оператор Next закрывает внутренний цикл For, а последний оператор Next закрывает внешний цикл For. Точно так же и для вложенных операторов If, операторы End If автоматически применяются для закрытия ближайшего к нему оператора If. Вложенные структуры Do . . . Loop работают подобным же образом: самый дальний оператор Loop соответствует самому дальнему оператору Do.

При вводе/выводе элементов двумерного массива на рабочий лист Microsoft Excel удобно применять пользовательские процедуры ввода/вывода:

Sub readcell(i As Integer, j As Integer, val As Variant)
val = Лист1.Cells(i, j).Value
End Sub
Sub outcell(i As Integer, j As Integer, val As Variant)
Лист1.Cells(i, j).Value = val
End Sub

где I — номер строки, j — номер столбца рабочего листа.

Выход из структур управления

Оператор Exit позволяет выходить непосредственно из цикла For, цикла Do, процедуры Sub или процедуры Function. Синтаксис оператора Exit прост:

For counter = start To end [Step -increment]
[блок операторов]
[Exit For]
[блок операторов] 
Next [counter]
Do [(While | Until} условие]
[блок операторов]
[Exit Do]
[блок операторов] 
Loop

Exit For внутри цикла For и Exit Do внутри цикла Do могут появиться сколько угодно раз.

Оператор Exit Do работает со всеми разновидностями синтаксиса цикла Do.

Операторы Exit For и Exit Do применяются, если необходимо завершить цикл немедленно, не продолжая дальнейших итераций или не ожидая выполнения блока операторов в теле цикла.

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

 При нормальном завершении цикла значение переменной цикла имеет на единицу больше верхней границы числа циклов

 При преждевременном завершении цикла переменная цикла сохраняет свое значение, которое она получила с учетом обычных правил

 При завершении цикла по концу набора переменная цикла имеет значение Nothing (Ничего), если она является переменной типа object (Объект), или значение Empty (Пусто), если она является переменной типа Variant

В этом учебном материале вы узнаете, как использовать Excel оператор FOR … NEXT для создания цикла FOR в VBA с синтаксисом и примерами.

Описание

Оператор Microsoft Excel FOR … NEXT используется для создания цикла FOR, чтобы вы могли выполнять код VBA определенное количество раз. Оператор FOR … NEXT является встроенной функцией Excel, которая относится к категории логических функций. Её можно использовать как функцию VBA в Excel.
В качестве функции VBA вы можете использовать эту функцию в коде макроса, который вводится через редактор Microsoft Visual Basic Editor.

Синтаксис

Синтаксис для создания цикла FOR с использованием оператора FOR … NEXT в Microsoft Excel:

For counter = start To end [Step increment] {…statements…}Next [counter]

Аргументы или параметры

counter
Переменная счетчика цикла.
start
Начальное значение для counter.
end
Конечное значение для counter.
increment
По желанию. Значение counter увеличивается при каждом проходе цикла. Это может быть положительное или отрицательное число.
Если не указано, по умолчанию будет приращение 1, так что каждый проход через цикл увеличивает counter на 1.
statement
Операторы кода для выполнения каждого прохода через цикл.

Возвращаемое значение

Оператор FOR … NEXT создает цикл FOR в VBA.

Примечание

  • См. также инструкцию WHILE … WEND, чтобы создать цикл WHILE в VBA.

Применение

  • Excel для Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 для Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000

Тип функции

  • Функция VBA

Пример (как функция VBA)

Оператор FOR … NEXT может использоваться только в коде VBA в Microsoft Excel.
Давайте посмотрим, как создать цикл FOR в Microsoft Excel, начиная с одинарного цикла, двойной цикл и тройной цикл, а затем исследуем, как изменить значение, используемое для увеличения счетчика при каждом прохождении цикла.

Одинарный цикл

Простейшей реализацией цикла FOR является использование оператора FOR … NEXT для создания одного цикла. Это позволит вам повторять код VBA фиксированное количество раз, например:

Sub Single_Loop_Example

  Dim LCounter As Integer

  For LCounter = 1 To 5

   MsgBox (LCounter)

  Next LCounter

End Sub

В этом примере цикл FOR управляется переменной LCounter. Он будет повторяться 5 раз, начиная с 1 и заканчивая 5. Каждый раз внутри цикла он будет отображать окно сообщения со значением переменной LCounter. Этот код отобразит 5 окон сообщений со следующими значениями: 1, 2, 3, 4 и 5.

Одинарный цикл — изменение приращения

По умолчанию цикл FOR увеличивает свой счетчик цикла на 1, но это можно настроить. Вы можете использовать Step increment, чтобы изменить значение, используемое для увеличения счетчика. Приращение цикла FOR может иметь как положительные, так и отрицательные значения.

Положительное приращение

Давайте сначала рассмотрим пример того, как увеличить счетчик цикла FOR на положительное значение.
Например:

Sub Increment_Positive_Example

  Dim LCounter As Integer

  For LCounter = 1 To 9 Step 2

   MsgBox LCounter

  Next LCounter

End Sub

В этом примере мы использовали шаг 2 в цикле FOR, чтобы изменить приращение на 2. Это означает, что цикл FOR будет начинаться с 1, увеличиваться на 2 и заканчиваться на 9. Код будет отображать 5 окон сообщений со следующими значениями: 1, 3, 5, 7 и 9.

Отрицательное приращение

Теперь давайте посмотрим, как увеличить счетчик цикла FOR на отрицательное значение.
Например:

Sub Increment_Negative_Example

  Dim LCounter As Integer

  For LCounter = 50 To 30 Step 5

   MsgBox LCounter

  Next LCounter

End Sub

Когда вы увеличиваете на отрицательное значение, вам нужно, чтобы начальное число был с более высоким значением, а конечное число — с меньшим значением, поскольку цикл FOR будет вести обратный отсчет. Итак, в этом примере цикл FOR будет начинаться с 50, увеличиваться на -5 и заканчиваться на 30. Код отобразит 5 окон сообщений со следующими значениями: 50, 45, 40, 35 и 30.

Двойной цикл

Теперь давайте рассмотрим пример создания двойного цикла FOR в Microsoft Excel.
Например:

Sub Double_Loop_Example

  Dim LCounter1 As Integer

  Dim LCounter2 As Integer

  For LCounter1 = 1 To 4

   For LCounter2 = 8 To 9

     MsgBox LCounter1 & «-« & LCounter2

   Next LCounter2

  Next LCounter1

End Sub

Здесь у нас есть 2 цикла FOR. Внешний цикл FOR управляется переменной LCounter1. Внутренний цикл FOR управляется переменной LCounter2. В этом примере внешний цикл FOR будет повторяться 4 раза (начиная с 1 и заканчивая 4), а внутренний цикл FOR будет повторяться 2 раза (начиная с 8 и заканчивая 9). Во внутреннем цикле код будет каждый раз отображать окно сообщения со значением LCounter1-LCounter2. Таким образом, в этом примере будут отображаться 8 окон сообщений со следующими значениями: 1-8, 1-9, 2-8, 2-9, 3-8, 3-9, 4-8 и 4-9.

Тройной цикл

Теперь давайте рассмотрим пример того, как создать тройной цикл FOR в Microsoft Excel.
Например:

Sub Triple_Loop_Example

  Dim LCounter1 As Integer

  Dim LCounter2 As Integer

  Dim LCounter3 As Integer

  For LCounter1 = 1 To 2

   For LCounter2 = 5 To 6

     For LCounter3 = 7 To 8

      MsgBox LCounter1 & «-« & LCounter2 & «-« & LCounter3

     Next LCounter3

   Next LCounter2

  Next LCounter1

End Sub

В приведенном выше примере у нас есть 3 цикла FOR. Самый внешний цикл FOR управляется переменной LCounter1. Следующий цикл FOR управляется переменной LCounter2. Самый внутренний цикл FOR управляется переменной LCounter3. В этом примере самый внешний цикл FOR будет повторяться 2 раза (начиная с 1 и заканчивая 2), следующий цикл FOR будет повторяться 2 раза (начиная с 5 и заканчивается на 6), а самый внутренний цикл FOR будет повторяться 2 раза (начиная с 7 и заканчивая 8). Внутри самого внутреннего цикла код будет каждый раз отображать окно сообщения со значением LCounter1-LCounter2 -LCounter3. Этот код отображает 8 окон сообщений со следующими значениями: 1-5-7, 1-5-8, 1-6-7, 1-6-8, 2-5-7, 2-5-8, 2- 6-7 и 2-6-8.

Понравилась статья? Поделить с друзьями:
  • Циклы на примерах excel vba
  • Цикл по ячейкам столбца vba excel
  • Циклы в макросах word
  • Цикл по строкам в word
  • Циклы в vba excel для ячеек