Цикл в макросе excel: Циклы в VBA — ОфисГуру

Содержание

Циклы в VBA — ОфисГуру


Автор Антон Андронов На чтение 6 мин Опубликовано

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

К циклам VBA относятся:

  • Цикл For
  • Цикл Do While
  • Цикл Do Until

Далее мы подробно рассмотрим каждый из этих циклов.

Содержание

  1. Оператор цикла «For» в Visual Basic
  2. Цикл «For … Next»
  3. Цикл «For Each»
  4. Оператор прерывания цикла «Exit For»
  5. Цикл «Do While» в Visual Basic
  6. Цикл «Do Until» в Visual Basic

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

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

For i = 1 To 10
   Total = Total + iArray(i)
Next i

В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1. Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.

For d = 0 To 10 Step 0.1
   dTotal = dTotal + d
Next d

Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

For i = 10 To 1 Step -1
   iArray(i) = i
Next i

Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Dim wSheet As Worksheet

For Each wSheet in Worksheets
   MsgBox "Найден лист: " & wSheet. Name
Next wSheet

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

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:

For i = 1 To 100
   If dValues(i) = dVal Then
      IndexVal = i
      Exit For
   End If
Next i

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

'Процедура Sub выводит числа Фибоначчи, не превышающие 1000
Sub Fibonacci()
   Dim i As Integer 'счётчик для обозначения позиции элемента в последовательности
   Dim iFib As Integer 'хранит текущее значение последовательности
   Dim iFib_Next As Integer 'хранит следующее значение последовательности
   Dim iStep As Integer 'хранит размер следующего приращения

   'инициализируем переменные i и iFib_Next
   i = 1
   iFib_Next = 0
   'цикл Do While будет выполняться до тех пор, пока значение
   'текущего числа Фибоначчи не превысит 1000

   Do While iFib_Next < 1000
      If i = 1 Then
         'особый случай для первого элемента последовательности
         iStep = 1
         iFib = 0
      Else
         'сохраняем размер следующего приращения перед тем, как перезаписать
         'текущее значение последовательности
         iStep = iFib
         iFib = iFib_Next
      End If

      'выводим текущее число Фибоначчи в столбце A активного рабочего листа
      'в строке с индексом i
      Cells(i, 1). Value = iFib
      'вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1
      iFib_Next = iFib + iStep
      i = i + 1
   Loop

End Sub

В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.

Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.

Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:

Do
...
Loop While iFib_Next < 1000

Цикл «Do Until» в Visual Basic

Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:

iRow = 1
Do Until IsEmpty(Cells(iRow, 1))
   'Значение текущей ячейки сохраняется в массиве dCellValues
   dCellValues(iRow) = Cells(iRow, 1).Value
   iRow = iRow + 1
Loop

В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until, следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.

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

Do
...
Loop Until IsEmpty(Cells(iRow, 1))

Оцените качество статьи. Нам важно ваше мнение:

Все циклы VBA в Excel читать в подробной статье

Рамакришна, Источники индийской мудрости

Сейчас … мы идем по кругу

Эта статья содержит полное руководство по VBA Do While и VBA While Loops. (Если вы ищете информацию о циклах VBA For и For Each, перейдите сюда)

Цикл VBA While существует, чтобы сделать его совместимым со старым кодом. Однако Microsoft рекомендует использовать цикл Do Loop, поскольку он более «структурирован и гибок». Оба этих цикла рассматриваются в этом посте.

Для быстрого ознакомления с этими циклами перейдите к таблице быстрого руководства ниже.

Если вы ищете что-то конкретное, вы можете посмотреть содержание ниже.

Содержание

  1. Краткое руководство по VBA While Loops
  2. Введение
  3. Цикл For против цикла Do While
  4. Условия
  5. Формат цикла Do
  6. Цикл Exit Do
  7. While Wend
  8. Бесконечный цикл
  9. Использование функций Worksheet вместо циклов
  10. Резюме

Краткое руководство по VBA While Loops

Формат циклаОписаниеПример
Do While … LoopЗапускается 0 или более раз, пока условие выполняетсяDo While result = «Верно»
Loop
Do … Loop WhileЗапускается 1 или более раз, пока условие выполняетсяDo 
Loop While result = «Верно»
Do Until … LoopЗапускается 0 или более раз, пока условие не будет выполненоDo Until result <> «Верно»
Loop
Do … Until LoopЗапускается 1 или более раз, пока условие не будет выполненоDo 
Loop Until result <> «Верно»
While … Wend
R
Запускается 0 или более раз, пока условие истинно.
Примечание: этот цикл считается устаревшим.
While result = «Верно»
Wend
Exit the Do LoopЗавершает DoDo While i < 10
   i = GetTotal
   If i < 0 Then
      Exit Do
   End If
Loop

Введение

Если вы никогда ранее не использовали циклы, тогда вы можете прочитать «Что такое циклы и зачем они вам нужны» из моего поста в журнале For Loop.

Я собираюсь сосредоточиться в основном на Do Loop в этой статье. Как я упоминал выше, мы видели, что цикл While Wend считается устаревшим. Для полноты информации я все равно его включил в эту статью.

Итак, во-первых, зачем нам нужны циклы Do While, когда у нас уже есть циклы For?

Цикл For против цикла Do While

Когда мы используем цикл For Loop, мы заранее знаем, сколько раз мы хотим его запустить. Например, мы можем захотеть запустить цикл один раз для каждого элемента в коллекции, массиве или словаре.

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

' запускается 5 раз
For i = 1 To 5
' запускается один раз для каждого элемента коллекции
For i = 1 To coll.Count
' запускается один раз для каждого элемента в arr
For i = LBound(arr) To coll.lbound(arr)
' запускается один раз для каждого значения от 1 до значения в lastRow
For i = 1 To lastRow
' запускается один раз для каждого элемента в коллекции
For Each s In coll

Цикл Do другой. Он работает:

  • В то время как условие верно
  • Пока условие не будет выполнено

Другими словами, количество циклов в большинстве случаев не имеет значения.

Итак, что такое условие и как мы их используем?

Условия

Условие — это утверждение, которое оценивается как истинное или ложное. Они в основном используются с операторами Loops и If. При создании условия вы используете такие знаки, как >, <, <>,> =, =.

Ниже приведены примеры условий

УсловиеИстина, когда…
x < 5x меньше 5
x <= 5x меньше либо равен 5
x > 5x больше 5
x >= 5x больше либо равен 5
x = 5x равен 5
x <> 5x не равен 5
x > 5 And x < 10x больше 5 И меньше 10
x = 2 Or x >10x равен 2 ИЛИ больше 10
Range(«A1») = «Иван»Ячейка A1 содержит текст «Иван»
Range(«A1») <> «Иван»Ячейка A1 не содержит текст «Иван»

Вы могли заметить x = 5 как условие. Его следует путать с х = 5, при использовании в качестве назначения.

Например

' означает: значение 6 будет храниться в х
x = 6
' означает: х равен 6?
If x = 6
' означает: х равен 6?
Do While x = 6

В следующей таблице показано, как «=» используется в условиях и назначениях.

Использование «=»ТипИмеется в виду
Loop Until x = 5Условиеx равен 5?
Do While x = 5Условиеx равен 5?
If x = 5 ThenУсловиеx равен 5?
For x = 1 To 5ПрисваиваниеУстановите значение x = 1, затем = 2 и т.д.
x = 5ПрисваиваниеУстановите значение x=5
b = 6 = 5Присваивание и
условие
Присвойте b
результату условия
6 = 5
x = MyFunc(5,6)ПрисваиваниеПрисвойте х
значение,
возвращаемое
функцией

Формат цикла Do

Цикл Do можно использовать четырьмя способами, и это часто вызывает путаницу. Однако в каждом из этих четырех способов есть только небольшая разница.

Do всегда в начале первой строки, а Loop всегда в конце последней строки.

Do 
Loop

Мы можем добавить условие после любой строки.

Do [условие]
Loop
Do 
Loop [условие]

Условию предшествует While или Until, которое дает нам эти четыре возможности

Do While [условие]
Loop
Do Until [условие]
Loop
Do 
Loop While [условие]
Do 
Loop Until [условие]

Давайте посмотрим на некоторые примеры, чтобы прояснить это.

Примеры цикла Do

Представьте, что вы хотите, чтобы пользователь ввел список элементов. Каждый раз, когда пользователь вводит элемент, вы печатаете его в «Immediate Window». Когда пользователь вводит пустую строку, вы хотите, чтобы приложение закрывалось.

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

Следующий код показывает это

 Dim sCommand As String
    Do
        ' Получить пользовательский ввод
        sCommand = InputBox("Пожалуйста, введите элемент")
        ' Печать в Immediate Window (Ctrl + G для просмотра)
        Debug.Print sCommand
    Loop While sCommand <> ""

Код входит в цикл и продолжается до тех пор, пока не достигнет строки «Loop While». На этом этапе он проверяет, оценивается ли условие как истинное или ложное.

Если условие оценивается как ложное, то код выходит из цикла и продолжается.
Если условие оценивается как истинное, то код возвращается к строке Do и снова проходит через цикл.
Разница между наличием условия на линии Do и на линии Loop очень проста.

Когда условие находится в строке Do, цикл может вообще не работать. Так что он будет работать ноль или более раз.
Когда условие находится на линии Loop, цикл всегда будет запущен хотя бы один раз. Так что он будет запущен один или несколько раз.

В нашем последнем примере условие находится в строке Loop, потому что мы всегда хотим получить хотя бы одно значение от пользователя. В следующем примере мы используем обе версии цикла. Цикл будет выполняться, пока пользователь не введет букву «н».

Sub GetInput()
    Dim sCommand As String
    ' Условие в начале
    Do While sCommand <> "н"
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")
    Loop
    ' Условие в конце
    Do
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")
    Loop While sCommand <> "н"
End Sub

В приведенном выше примере оба цикла будут вести себя одинаково.

Однако, если мы установим для sCommand значение «н» до запуска цикла «Do While», код не войдет в цикл.

Sub GetInput2()
    Dim sCommand As String
    sCommand = "н"
    ' Цикл не будет работать, поскольку команда "н"
    Do Whilel sCommand <> "н"
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")
    Loop
    ' Цикл все равно будет запущен хотя бы один раз
    Do
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")
    Loop While sCommand <> "н"
End Sub

Второй цикл в вышеприведенном примере (то есть Loop While) всегда будет запускаться хотя бы один раз.

While против Until

При использовании Do Loop условию должно предшествовать Until или While.

Until и While, по сути, противоположны друг другу. Они используются в VBA аналогично тому, как они используются в английском языке.

Например:

  • Оставьте одежду, пока не пойдет дождь
  • Оставь одежду, пока не идет дождь

Другой пример:

  • Оставайся в постели, пока не станет светло
  • Оставайся в постели, пока темно

Еще один пример:

  • повторять, пока число не станет больше или равно десяти
  • повторить пока счет меньше десяти

Как видите, использование Until и While — это просто противоположный способ написания одного и того же условия.

Примеры Until и While

Следующий код показывает циклы «While» и «Until» рядом. Как видите, единственная разница в том, что условие полностью изменено.

Примечание: знаки <> означают «не равно».

Sub GetInput()
    Dim sCommand As String
    ' Условие в начале
    Do Until sCommand = "н"
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")
    Loop
    Do While sCommand <> "н"
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")
    Loop
    ' Условие в конце
    Do
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")
    Loop Until sCommand = "н"
    Do
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")
    Loop While sCommand <> "н"
End Sub
  • Первый цикл: запускается только в том случае, если sCommand не равен ‘н’.
  • Второй цикл: запускается только в том случае, если sCommand не равен ‘н’.
  • Третий цикл: будет запущен хотя бы один раз перед проверкой sCommand.
  • Четвертый цикл: будет запущен хотя бы один раз перед проверкой sCommand.

Пример: проверка объектов

Примером использования Until и While является проверка объектов. Когда объект не был назначен, он имеет значение Nothing.

Поэтому, когда мы объявляем переменную книги в следующем примере, она имеет значение Nothing, пока мы не назначим ее Workbook.

 Dim wrk As Workbook

Противоположностью Nothing не является Nothing, что может сбить с толку.

Представьте, что у нас есть две функции: GetFirstWorkbook и GetNextWorkbook, которые возвращают некоторые объекты книги. Код будет печатать имя рабочей книги до тех пор, пока функции больше не вернут действительную рабочую книгу.

Вы можете увидеть пример кода здесь:

Dim wrk As Workbook
    Set wrk = GetFirstWorkbook()
    Do Until wrk Is Nothing
        Debug. Print wrk.Name
        Set wrk = GetNextWorkbook()
    Loop

Написание этого кода с использованием Do While было бы более запутанным, так как условие Not Is Nothing

Dim wrk As Workbook
    Set wrk = GetFirstWorkbook()
    Do While Not wrk Is Nothing
        Debug.Print wrk.Name
        Set wrk = GetNextWorkbook()
    Loop

Это делает код более понятным, и наличие четких условий — всегда хорошо. Честно говоря, разница маленькая, и выбор между «While» и «Until» действительно сводится к личному выбору.

Цикл Exit Do

Мы можем выйти из любого цикла Do с помощью оператора Exit Do.

Следующий код показывает пример использования Exit Do

Do While i < 1000
     If Cells(i,1) = "Найдено" Then 
         Exit Do
     End If
     i = i + 1
Loop 

В этом случае мы выходим из цикла Do Loop, если ячейка содержит текст «Найдено».

While Wend

Этот цикл в VBA, чтобы сделать его совместимым со старым кодом. Microsoft рекомендует использовать циклы Do, поскольку они более структурированы.

Из MSDN: «Оператор Do… Loop обеспечивает более структурированный и гибкий способ выполнения циклов».

Формат цикла VBA While Wend

Цикл VBA While имеет следующий формат:

While <Условие>
Wend

While Wend против Do

Разница между циклами VBA While и VBA Do заключается в следующем:

  1. While может иметь условие только в начале цикла.
  2. While не имеет версии Until.
  3. Не существует оператора для выхода из цикла While, как Exit For или Exit Do.

Условие для цикла VBA While такое же, как и для цикла VBA Do While. Два цикла в приведенном ниже коде работают точно так же.

Sub GetInput()
    Dim sCommand As String
    Do While sCommand <> "н"
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 1")
    Loop
    While sCommand <> "н"
        sCommand = InputBox("Пожалуйста, введите элемент для цикла 2")
    Wend
End Sub

Бесконечный цикл

Даже если вы никогда не писали код в своей жизни, я уверен, что вы слышали фразу «Бесконечный цикл». Это цикл, в котором условие никогда не будет выполнено. Обычно это происходит, когда вы забыли обновить счетчик.

Следующий код показывает бесконечный цикл

Dim cnt As Long
    cnt = 1
    'это бесконечный цикл
    Do While cnt <> 5
    Loop

В этом примере cnt установлен в 1, но он никогда не обновляется. Поэтому условие никогда не будет выполнено — cnt всегда будет меньше 5.

В следующем коде cnt обновляется каждый раз, поэтому условие будет выполнено.

Dim cnt As Long
    cnt = 1
    Do While cnt <> 5
        cnt = cnt + 1
    Loop

Как вы можете видеть, использование For Loop безопаснее для подсчета, поскольку оно автоматически обновляет счет в цикле. Ниже приведен тот же цикл с использованием For.

Dim i As Long
    For i = 1 To 4
    Next i

Это явно лучший способ сделать это. Цикл For устанавливает начальное значение, условие и счет в одну строку.

Конечно, можно использовать бесконечный цикл, используя For — это потребует немного больше усилий 🙂

 Dim i As Long
    ' Бесконечный цикл
    For i = 1 To 4
        ' i никогда не достигнет 4
        i = 1
    Next i

Работа с бесконечным циклом

Когда у вас бесконечный цикл — VBA не выдаст ошибку. Ваш код будет продолжать работать, а редактор Visual Basic не будет отвечать.

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

Вы также можете выйти из цикла, убив процесс. Нажмите Ctrl + Shift + Esc. На вкладке Процессы найдите Excel / Microsoft Excel. Щелкните правой кнопкой мыши по этому и выберите «Завершить процесс». Это закроет Excel, и вы можете потерять часть работы — так что гораздо лучше использовать Ctrl + Break или его эквивалент.

Использование функций Worksheet вместо циклов

Иногда вы можете использовать функцию листа вместо цикла.

Например, представьте, что вы хотите добавить значения в список ячеек. Вы можете сделать это с помощью цикла, но было бы более эффективно использовать функцию таблицы Sum. Это быстрее и экономит много кода.

Использовать функции рабочего листа очень просто. Ниже приведен пример использования Sum и Count.

Sub WorksheetFunctions()
    Debug.Print WorksheetFunction.Sum(Range("A1:A10"))
    Debug.Print WorksheetFunction.Count(Range("A1:A10"))
End Sub

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

Sub SumWithLoop()
    Dim total As Long, count As Long
    Dim rg As Range
    For Each rg In Range("A1:A10")
        ' Total
        total = total + rg
        ' Count
        If rg <> "" Then
            count = count + 1
        End If
    Next rg
    Debug.Print total
    Debug.Print count
End Sub

Резюме

Цикл Do While

  • Цикл Do можно использовать 4 способами.
  • Его можно использовать в начале или в конце, Do While .. Loop, Do … Loop While
  • Может использоваться с Until в начале или в конце, Do Until .. Loop, Do … Loop Until
  • While и Until используют противоположные условия друг к другу.
  • Бесконечный цикл происходит, если ваше условие выхода никогда не будет выполнено.
  • Иногда использование функции рабочего листа более эффективно, чем использование цикла.

Цикл While Wend

  • Цикл Wend Wend устарел, и вы можете вместо этого использовать цикл Do.

Далее, Делать пока, Делать до, Для каждого (с примерами)

Чтобы получить максимальную отдачу от Excel и VBA, вам необходимо знать, как эффективно использовать циклы.

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

Вот простой пример использования циклов VBA в Excel.

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

Теперь это, конечно, очень простое зацикливание в Excel VBA (и вы также можете сделать это с помощью условного форматирования).

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

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

  • Циклическое перебор диапазона ячеек и анализ каждой ячейки (выделение ячеек с определенным текстом).
  • Перебрать все рабочие листы и сделать что-нибудь с каждым (например, защитить/снять защиту).
  • Перебрать все открытые книги (и сохранить каждую книгу или закрыть все, кроме активной книги).
  • Переберите все символы в ячейке (и извлеките числовую часть из строки).
  • Перебрать все значения массива.
  • Прокрутите все диаграммы/объекты (и задайте границу или измените цвет фона).

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

В этом руководстве я продемонстрирую различные типы циклов VBA Excel и приведу несколько примеров для каждого цикла.

Примечание. деталь. Я рекомендую вам добавить эту страницу в закладки для дальнейшего использования.

Если вы заинтересованы в простом изучении VBA, ознакомьтесь с моим курсом Online Excel VBA Training .

Это руководство охватывает:

Цикл For Next

Цикл For Next позволяет пройти через блок кода указанное количество раз.

Например, если я попрошу вас сложить целые числа от 1 до 10 вручную, вы должны добавить первые два числа, затем добавить к результату третье число, затем добавить к результату четвертое число и т. д.

Не так ли?

Та же логика используется в цикле For Next в VBA.

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

Ниже приведен синтаксис цикла For Next:

 Для счетчика = от начала до конца [значение шага]
[Блок кода для выполнения]
Next [counter] 

В цикле For Next вы можете использовать Counter (или любую переменную), которая будет использоваться для запуска цикла. Этот счетчик позволяет запустить этот цикл необходимое количество раз.

Например, если я хочу сложить первые 10 положительных целых чисел, то значение счетчика будет от 1 до 10.

Давайте рассмотрим несколько примеров, чтобы лучше понять, как работает цикл For Next.

Пример 1. Сложение первых 10 положительных целых чисел

Ниже приведен код, который складывает первые 10 положительных целых чисел с помощью цикла For Next.

Затем появится окно сообщения, показывающее сумму этих чисел.

 SubAddNumbers()
Dim Total как целое число
Dim Count как целое число
Всего = 0
Для количества = от 1 до 10
Всего = Всего + Количество
Следующий счет
Всего сообщений
End Sub 

В этом коде значение Total устанавливается равным 0 перед переходом в цикл For Next.

Как только он попадает в цикл, он сохраняет общее значение после каждого цикла. Таким образом, после первого цикла, когда счетчик равен 1, значение «Общее» становится равным 1, а после второго цикла оно становится равным 3 (1+2) и так далее.

И, наконец, когда цикл заканчивается, переменная Total имеет сумму первых 10 положительных целых чисел.

Затем MsgBox просто отображает результат в окне сообщения.

Пример 2. Сложение первых 5 четных положительных целых чисел

Для суммирования первых пяти четных положительных целых чисел (т. е. 2, 4, 6, 8 и 10) вам потребуется аналогичный код с условием учета только числа и игнорировать нечетные числа.

Вот код, который это сделает:

 Sub AddEvenNumbers()
Dim Total как целое число
Dim Count как целое число
Всего = 0
Для количества = от 2 до 10 Шаг 2
Всего = Всего + Количество
Следующий счет
Всего сообщений
Конец суб 

Обратите внимание, что мы начали значение счетчика с 2, а также использовали « Шаг 2 ».

Когда вы используете «Шаг 2» , он указывает коду увеличивать значение «Счетчик» на 2 каждый раз при запуске цикла.

Таким образом, значение счетчика начинается с 2, а затем становится равным 4, 6, 8 и 10 по мере зацикливания.

ПРИМЕЧАНИЕ. Другой способ сделать это — запустить цикл от 1 до 10 и внутри цикла проверить, является ли число четным или нечетным. Однако использование Step в этом случае является более эффективным способом, так как не требует, чтобы цикл выполнялся 10 раз, а только 5 раз.

Значение шага также может быть отрицательным. В таком случае счетчик начинается с более высокого значения и продолжает уменьшаться на указанное значение шага.

Пример 3. Ввод серийного номера в выбранные ячейки

Вы также можете использовать цикл For Next для просмотра набора объектов (таких как ячейки, рабочие листы или рабочие книги),

Вот пример быстрого ввода серийных номеров во всех выбранных ячейках.

 Sub EnterSerialNumber()
Dim Rng As Range
Dim Counter как целое число
Dim RowCount как целое число
Установить кольцо = выбор
Количество строк = Rng.Rows.Count
Для счетчика = 1 для счетчика строк
ActiveCell.Offset(Счетчик - 1, 0).Значение = Счетчик
Следующий счетчик
Конец суб 

Приведенный выше код сначала подсчитывает количество выбранных строк, а затем присваивает это значение переменной RowCount. Затем мы запускаем цикл от «1 до RowCount».

Также обратите внимание, что, поскольку выбор может быть любым количеством строк, мы установили переменную Rng в Selection (со строкой «Set Rng = Selection»). Теперь мы можем использовать переменную «Rng» для ссылки на выделение в нашем коде.

Пример 4. Защита всех листов в активной книге

Вы можете использовать цикл «Для следующего», чтобы просмотреть все листы в активной книге и защитить (или снять защиту) каждый из листов.

Ниже приведен код, который это сделает:

 Sub ProtectWorksheets()
Dim i как целое число
Для i = 1 в ActiveWorkbook.Worksheets.Count
Рабочие листы(i).Защитить
Далее я
End Sub 

Приведенный выше код подсчитывает количество листов с помощью ActiveWorkbook.Worksheets.Count. Это сообщает VBA, сколько раз необходимо выполнить цикл.

В каждом экземпляре он ссылается на I-ю книгу (с помощью Worksheets(i)) и защищает ее.

Этот же код можно использовать и для снятия защиты с рабочих листов. Просто измените строку Рабочие листы(i).Защитить от до Рабочие листы(i).Снять защиту .

Вложенные циклы For Next

Вы можете использовать вложенные циклы For Next для более сложной автоматизации в Excel. Вложенный цикл «For Next» будет означать, что внутри цикла «For Next» есть цикл «For Next».

Позвольте мне показать вам, как использовать это на примере.

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

Ниже приведен код, который это сделает:

 Sub ProtectWorksheets()
Dim i как целое число
Dim j как целое число
Для i = 1 To Workbooks.Count
Для j = 1 в Workbooks(i).Worksheets.Count
Рабочие книги(i).Рабочие листы(j).Защитить
Следующий j
Далее я
End Sub 

Это вложенный цикл For Next, поскольку мы использовали один цикл For Next внутри другого.

Операторы «EXIT For» в циклах For Next

Оператор «Exit For» позволяет полностью выйти из цикла «For Next».

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

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

Но чтобы сделать код более эффективным, мы можем сначала проверить, есть ли в списке отрицательные значения. Если нет отрицательных значений, мы можем использовать оператор Exit For, чтобы просто выйти из кода.

Ниже приведен код, который это делает:

 ПодсветкаОтрицательный()
Dim Rng As Range
Установите Rng = Range ("A1", Range ("A1"). Конец (xlDown))
Счетчик = Rng.Count
Для i = 1 для счетчика
Если WorksheetFunction.Min(Rng) >= 0, то выход для
Если Rng(i).Value < 0 Тогда Rng(i).Font.Color = vbRed
Далее я
End Sub 

Когда вы используете оператор «Exit For» во вложенном цикле «For Next», он выходит из цикла, в котором он выполняется, и переходит к выполнению следующей строки в коде после цикла For Next. .

Например, в приведенном ниже коде оператор «Exit For» выводит вас из внутреннего цикла, но внешний цикл продолжает работать.

 Sub SampleCode()
Для i = от 1 до 10
Для j = от 1 до 10
Выход для
Следующий J
Далее я
End Sub 

Цикл Do While

Цикл Do While позволяет проверить условие и запустить цикл, пока это условие выполняется (или истинно).

В цикле Do While есть два типа синтаксиса.

 Делать [Пока условие]
[Блок кода для выполнения]
Петля 

и

 До
[Блок кода для выполнения]
Loop [While condition] 

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

Это означает, что если условие «Пока» имеет значение «Ложь» в обоих случаях, код все равно будет выполняться хотя бы один раз во втором случае (поскольку условие «Пока» проверяется после того, как код был выполнен один раз).

Теперь давайте рассмотрим несколько примеров использования циклов Do While в VBA.

Пример 1. Сложение первых 10 положительных целых чисел с помощью VBA

Предположим, вы хотите сложить первые десять положительных целых чисел с помощью цикла Do While в VBA.

Для этого вы можете использовать цикл Do While, пока следующее число не станет меньше или равно 10. Как только число превысит 10, ваш цикл остановится.

Вот код VBA, который запустит этот цикл Do While и покажет результат в окне сообщения.

 Sub AddFirst10PositiveIntegers()
Dim i как целое число
я = 1
Делать, пока я <= 10
Результат = Результат + я
я = я + 1
Петля
MsgBox Результат
End Sub 

Приведенный выше цикл продолжает работать до тех пор, пока значение i не станет равным 11. Как только оно станет равным 11, цикл завершится (поскольку условие While становится ложным).

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

Пример 2. Введите даты текущего месяца

Допустим, вы хотите ввести все даты текущего месяца в столбец листа.

Вы можете сделать это, используя следующий код цикла Do While:

 Sub EnterCurrentMonthDates()
Dim CMDate As Date
Dim i как целое число
я = 0
CMDate = DateSerial (год (дата), месяц (дата), 1)
Делать, пока месяц (CMDate) = месяц (дата)
Диапазон ("A1"). Смещение (i, 0) = CMDate
я = я + 1
CMDate = CMDate + 1
Петля
Конец суб 

Приведенный выше код введет все даты в первый столбец рабочего листа (начиная с A1). Циклы продолжаются до тех пор, пока значение месяца переменной «CMDate» не совпадет со значением текущего месяца.

Оператор Exit Do

Вы можете использовать оператор Exit Do для выхода из цикла. Как только код выполняет строку Exit Do, он выходит из цикла Do While и передает управление следующей строке сразу после цикла.

Например, если вы хотите ввести только первые 10 дат, вы можете выйти из цикла, как только будут введены первые 10 дат.

Следующий код сделает это:

 Sub EnterCurrentMonthDates()
Dim CMDate As Date
Dim i как целое число
я = 0
CMDate = DateSerial (год (дата), месяц (дата), 1)
Делать, пока месяц (CMDate) = месяц (дата)
Диапазон ("A1"). Смещение (i, 0) = CMDate
я = я + 1
Если i >= 10, то выход Do
CMDate = CMDate + 1
Петля
End Sub 

В приведенном выше коде оператор IF используется для проверки того, больше ли значение i 10 или нет. Как только значение «i» становится равным 10, выполняется оператор Exit Do, и цикл завершается.

Цикл «До»

Циклы «До» очень похожи на циклы «До».

В режиме «Делать пока» цикл выполняется до тех пор, пока не будет выполнено заданное условие, а в режиме «Делать до тех пор» цикл выполняется до тех пор, пока не будет выполнено указанное условие.

Существует два типа синтаксиса цикла «Выполнить до».

 Выполнить [До условия]
[Блок кода для выполнения]
Петля 

и

 Сделать
[Блок кода для выполнения]
Цикл [Условие до] 

Разница между этими двумя в том, что в первом случае сначала проверяется условие «До тех пор», прежде чем будет выполнен любой кодовый блок, а во втором случае сначала выполняется кодовый блок, а затем проверяется условие «До тех пор». .

Это означает, что если условие «До тех пор» имеет значение ИСТИНА в обоих случаях, код все равно будет выполняться хотя бы один раз во втором случае (поскольку условие «До» проверяется после того, как код был выполнен один раз).

Теперь давайте посмотрим на несколько примеров использования циклов Do Until в VBA.

Примечание. Все примеры для команды «До» такие же, как и для функции «До». Они были изменены, чтобы показать вам, как работает цикл «До».

Пример 1. Добавление первых 10 положительных целых чисел с помощью VBA

Предположим, вы хотите сложить первые десять положительных целых чисел, используя цикл «До тех пор» в VBA.

Для этого вам нужно запустить цикл до тех пор, пока следующее число не будет меньше или равно 10. Как только число станет больше 1o, ваш цикл остановится.

Вот код VBA, который запустит этот цикл и покажет результат в окне сообщения.

 Sub AddFirst10PositiveIntegers()
Dim i как целое число
я = 1
Делать до i > 10
Результат = Результат + я
я = я + 1
Петля
MsgBox Результат
Конец суб 

Цикл, описанный выше, продолжает работать до тех пор, пока значение «i» не станет равным 11. Как только оно станет равным 11, цикл завершится (поскольку условие «Пока» не станет истинным).

Пример 2. Ввод дат текущего месяца

Допустим, вы хотите ввести все даты текущего месяца в столбец листа.

Вы можете сделать это, используя следующий код цикла Do Until:

 Sub EnterCurrentMonthDates()
Dim CMDate As Date
Dim i как целое число
я = 0
CMDate = DateSerial (год (дата), месяц (дата), 1)
Делать до Месяц(CMDate) <> Месяц(Дата)
Диапазон ("A1"). Смещение (i, 0) = CMDate
я = я + 1
CMDate = CMDate + 1
Петля
Конец суб 

Приведенный выше код введет все даты в первый столбец рабочего листа (начиная с A1). Цикл продолжается до тех пор, пока месяц переменной CMDate не будет равен месяцу текущего месяца.

Оператор Exit Do

Вы можете использовать оператор Exit Do для выхода из цикла.

Как только код выполняет строку «Exit Do», он выходит из цикла «Выполнить до» и передает управление следующей строке сразу после цикла.

Например, если вы хотите ввести только первые 10 дат, вы можете выйти из цикла, как только будут введены первые 10 дат.

Следующий код сделает это:

 Sub EnterCurrentMonthDates()
Dim CMDate As Date
Dim i как целое число
я = 0
CMDate = DateSerial (год (дата), месяц (дата), 1)
Делать до Месяц(CMDate) <> Месяц(Дата)
Диапазон ("A1"). Смещение (i, 0) = CMDate
я = я + 1
Если i >= 10, то выход Do
CMDate = CMDate + 1
Петля
End Sub 

В приведенном выше коде, как только значение «i» становится равным 10, выполняется оператор Exit Do, и цикл завершается.

Для каждого

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

Вот несколько примеров коллекций в Excel VBA:

  • Коллекция всех открытых книг.
  • Коллекция всех листов книги.
  • Набор всех ячеек в диапазоне выбранных ячеек.
  • Коллекция всех диаграмм или фигур в книге.

Используя цикл «Для каждого», вы можете просмотреть каждый из объектов в коллекции и выполнить над ним какое-либо действие.

Например, вы можете просмотреть все рабочие листы в книге и защитить их, или вы можете просмотреть все выбранные ячейки и изменить форматирование.

При использовании цикла «Для каждого» (также называемого циклом «Для каждого следующего») вам не нужно знать, сколько объектов содержится в коллекции.

Цикл «Для каждого» будет автоматически проходить по каждому объекту и выполнять указанное действие. Например, если вы хотите защитить все листы в книге, код будет одинаковым, независимо от того, есть ли у вас книга с 3 листами или 30 листами.

Вот синтаксис цикла For Each-Next в Excel VBA.

 Для каждого элемента В коллекции
[Блок кода для выполнения]
Далее [элемент] 

Теперь давайте рассмотрим пару примеров использования цикла For Each в Excel.

Пример 1. Просмотрите все рабочие листы в рабочей книге (и защитите ее)

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

Ниже цикл For Each-Next может сделать это легко:

 Sub ProtectSheets()
Dim ws As рабочий лист
Для каждого ws в ActiveWorkbook. Worksheets
ws.Protect
Следующая сс
Конец суб 

В приведенном выше коде мы определили переменную «ws» как объект Worksheet. Это говорит VBA, что «ws» следует интерпретировать в коде как объект рабочего листа.

Теперь мы используем оператор «Для каждого», чтобы просмотреть каждый «ws» (который является объектом рабочего листа) в коллекции всех рабочих листов в активной книге (предоставленной ActiveWorkbook.Worksheets).

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

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

Пример 2. Просмотр всех открытых книг (и сохранение всех)

Если вы работаете с несколькими книгами одновременно, может пригодиться возможность одновременного сохранения всех этих книг.

Ниже код VBA может сделать это для нас:

 Sub SaveAllWorkbooks()
Dim wb как рабочая книга
Для каждого ББ в рабочих книгах
wb. Сохранить
Следующий бб
Конец суб 

Обратите внимание, что в этом коде вы не получаете запрос на сохранение книги в определенном месте (при первом сохранении).

Сохраняет в папку по умолчанию (в моем случае это была папка «Документы»). Этот код работает лучше всего, когда эти файлы уже сохранены, и вы вносите изменения и хотите быстро сохранить все рабочие книги.

Пример 3. Просмотр всех ячеек в выделенном диапазоне (выделите отрицательные значения)

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

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

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

 Sub HighlightNegativeCells()
Dim Cll как диапазон
Для каждой клетки в выборе
Если Cll.Value < 0 Тогда
Cll.Interior.Color = vbRed
Конец, если
Следующий кл
End Sub 

(Обратите внимание, что я использовал Cll в качестве короткого имени переменной для Cell. Рекомендуется не использовать имена объектов, такие как Sheets или Range, в качестве имен переменных)

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

Если у вас нет выбора, и вместо этого вы хотите, чтобы VBA выбрал все заполненные ячейки в столбце, начиная с определенной ячейки (точно так же, как мы используем Control + Shift + клавишу со стрелкой вниз, чтобы выбрать все заполненные ячейки), вы можете использовать следующий код:

 Sub HighlightNegativeCells()
Dim Cll как диапазон
Dim Rng As Range
Установите Rng = Range ("A1", Range ("A1"). Конец (xlDown))
Для каждой ячейки в ряду
Если Cll.Value < 0 Тогда
Cll.Interior.Color = vbRed
Конец, если
Следующий кл
End Sub 

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

Вам также не нужно выбирать ячейку A1. Вы можете выбрать любую удаленную ячейку, и когда код запустится, он все равно будет учитывать все ячейки в столбце A (начиная с A1) и окрашивать отрицательные ячейки.

Оператор «Exit For»

Вы можете использовать оператор «Exit For» в цикле For Each-Next, чтобы выйти из цикла. Обычно это делается в случае выполнения определенного условия.

Например, в Примере 3, когда мы просматриваем набор ячеек, может быть более эффективно проверить, есть ли какие-либо отрицательные значения или нет. Если отрицательных значений нет, мы можем просто выйти из цикла и сэкономить время обработки VBA.

Ниже приведен код VBA, который это сделает:

 Sub HighlightNegativeCells()
Dim Cll как диапазон
Для каждой клетки в выборе
Если WorksheetFunction.Min(Selection) >= 0, то Exit For
Если Cll.Value < 0 Тогда
Cll.Interior.Color = vbRed
Конец, если
Следующий кл
End Sub 

Куда поместить код VBA

Хотите знать, где находится код VBA в вашей книге Excel?

Excel имеет серверную часть VBA, называемую редактором VBA. Вам необходимо скопировать и вставить код в окно кода модуля VB Editor.

Вот шаги для этого:

  1. Перейдите на вкладку Разработчик.
  2. Выберите параметр Visual Basic. Это откроет редактор VB в бэкэнде.
  3. В панели Project Explorer редактора VB щелкните правой кнопкой мыши любой объект книги, в которую вы хотите вставить код. Если вы не видите Project Explorer, перейдите на вкладку View и нажмите Project Explorer.
  4. Перейдите в раздел «Вставка» и нажмите «Модуль». Это вставит объект модуля для вашей книги.
  5. Скопируйте и вставьте код в окно модуля.

Вам также могут понравиться следующие учебники по Excel:

  • Как записать макрос в Excel.
  • Создание пользовательских функций в Excel.
  • Excel VBA Msgbox
  • Как запустить макрос в Excel.
  • Как создавать и использовать надстройки в Excel.
  • События Excel VBA — простое (и полное) руководство.
  • Как сортировать данные в Excel с помощью VBA (пошаговое руководство).
  • 24 полезных примера макросов Excel для начинающих VBA (готовы к использованию).
  • Как использовать функцию Excel VBA InStr (с практическими ПРИМЕРАМИ).
  • Персональная книга макросов Excel | Сохраняйте и используйте макросы во всех книгах.
  • Использование выбора регистра в Excel VBA.

Цикл For в Excel VBA (простые макросы)

Одиночный цикл | Двойная петля | тройная петля | Do While Loop

Цикл — один из самых мощных приемов программирования. петля в Excel VBA позволяет перебирать диапазон ячеек всего несколькими строками кода.

Одиночный цикл

Одиночный цикл можно использовать для прохода по одномерному диапазону ячеек.

Поместите командную кнопку на рабочий лист и добавьте следующие строки кода:

Dim i As Integer

Для i = от 1 до 6
Ячейки (i, 1). Значение = 100
Next i

Результат при нажатии командной кнопки на листе:

Объяснение: Строки кода между For и Next будут выполнены шесть раз. Для i = 1 Excel VBA вводит значение 100 в ячейку на пересечении строки 1 и столбца 1. Когда Excel VBA достигает Next i, он увеличивает i на 1 и переходит обратно к оператору For. Для i = 2 Excel VBA вводит значение 100 в ячейку на пересечении строки 2 и столбца 1 и т. д.

Примечание: рекомендуется всегда делать отступ (табуляцию) в коде между словами For и Next. Это облегчает чтение вашего кода.

Двойной цикл

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

Поместите командную кнопку на рабочий лист и добавьте следующие строки кода:

Dim i As Integer, j As Integer

Для i = от 1 до 6
Для j = от 1 до 2
Ячейки (i, j). Значение = 100
Следующий j
Далее i

Результат при нажатии командной кнопки на листе:

Объяснение: Для i = 1 и j = 1 Excel VBA вводит значение 100 в ячейку на пересечении строки 1 и столбца 1. Когда Excel VBA достигает Next j, увеличивает j на 1 и возвращается к оператору For j. Для i = 1 и j = 2 Excel VBA вводит значение 100 в ячейку на пересечении строки 1 и столбца 2. Затем Excel VBA игнорирует Next j, поскольку j выполняется только от 1 до 2. Когда Excel VBA достигает Next i , он увеличивает i на 1 и возвращается к оператору For i. Для i = 2 и j = 1 Excel VBA вводит значение 100 в ячейку на пересечении строки 2 и столбца 1 и т. д.

Тройной цикл

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

Поместите командную кнопку на рабочий лист и добавьте следующие строки кода:

Dim c как целое число, i как целое число, j как целое число

Для c = от 1 до 3
Для i = от 1 до 6
Для j = от 1 до 2
Рабочие листы (c). Ячейки (i, j). Значение = 100
Следующий j
Далее я
Далее с

Объяснение: Единственное изменение по сравнению с кодом для двойного цикла состоит в том, что мы добавили еще один цикл и добавили Рабочие листы (c). перед Cells, чтобы получить двумерный диапазон на первом листе для c = 1, втором листе для c = 2 и третьем листе для c = 3. Загрузите файл Excel, чтобы увидеть этот результат.

Цикл Do While

Помимо цикла For Next, в Excel VBA есть и другие циклы. Например, цикл Do While. Код, помещенный между Do While и Loop, будет повторяться до тех пор, пока часть после Do While является истинной.

1. Поместите командную кнопку на рабочий лист и добавьте следующие строки кода:

Dim i As Integer
i = 1

Делать, пока i < 6
Ячейки (i, 1). Значение = 20
я = я + 1
Цикл

Результат при нажатии командной кнопки на листе:

Объяснение: пока i меньше 6, Excel VBA вводит значение 20 в ячейку на пересечении строки i и столбца 1 и увеличивает i на 1. В Excel VBA (и в других языках программирования) символ '=' означает становится. Это не значит равный. Таким образом, i = i + 1 означает, что i становится i + 1. Другими словами: возьмите текущее значение i и добавьте к нему 1. Например, если i = 1, i становится 1 + 1 = 2. В результате значение 20 будет помещено в столбец A пять раз (а не шесть, поскольку Excel VBA останавливается, когда i становится равным 6).

2. Введите несколько чисел в столбец A.

3. Поместите командную кнопку на лист и добавьте следующие строки кода:

Dim i As Integer
i = 1

Делать пока ячейки(i, 1).Value <> ""
Ячейки(i, 2).Значение = Ячейки(i, 1).Значение + 10
я = я + 1
Цикл

Результат при нажатии кнопки команды на листе:

Объяснение: пока Cells(i, 1).Value не пусто (<> означает не равно), Excel VBA вводит значение в ячейка на пересечении строки i и столбца 2, что на 10 выше, чем значение в ячейке на пересечении строки i и столбца 1. Excel VBA останавливается, когда i равно 7, потому что Cells(7, 1).Value пусто. Это отличный способ просмотреть любое количество строк на листе.