Разное

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

Содержание

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

Автор Дмитрий Якушев На чтение 13 мин. Просмотров 12.3k.

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

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

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

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

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

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

Краткое руководство по 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.

VBA Excel. Цикл For… Next

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

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

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

Такие данные на активном листе 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 — Информационные технологии

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

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

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

Оператор цикла «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 Операторы цикла. Вложенные циклы

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

Работа с циклами в VBA:loop, for each, for next

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

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

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

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

for цикл

Цикл for — это структура управления повторением, которая позволяет разработчику эффективно писать цикл, который необходимо выполнить определенное количество раз.

Синтаксис

Ниже приведен синтаксис цикла for в VBA.

For counter = start To end [Step stepcount]
   [statement 1]
   [statement 2]
   ....
   [statement n]
   [Exit For]
   [statement 11]
   [statement 22]
   ....
   [statement n]
Next

Диаграмма потока

Ниже приведен поток управления в режиме Loop —

  • Первый шаг выполняется. Этот шаг позволяет инициализировать любые переменные управления контурами и увеличивать переменную счетчика шагов.
  • Во-вторых, условие оценивается. Если это правда, выполняется тело цикла. Если оно ложно, тело цикла не выполняется, и поток управления переходит к следующему оператору сразу после цикла For.
  • После выполнения цикла цикла For поток управления переходит к следующему оператору. Этот оператор позволяет вам обновлять любые переменные управления циклом. Он обновляется на основе значения счетчика шагов.
  • Условие теперь оценивается снова. Если это правда, цикл выполняется, и процесс повторяется (тело цикла, затем увеличивают шаг, а затем снова условие). После того, как условие становится ложным, цикл For заканчивается.

пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click()
   Dim a As Integer
   a = 10
   
   For i = 0 To a Step 2
      MsgBox "The value is i is : " & i
   Next
End Sub

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

The value is i is : 0
The value is i is : 2
The value is i is : 4
The value is i is : 6
The value is i is : 8
The value is i is : 10

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

for … loop

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

Для каждого цикла аналогичен For Loop; однако цикл выполняется для каждого элемента в массиве или группе. Следовательно, счетчик шагов не будет существовать в этом типе цикла. Он в основном используется с массивами или используется в контексте объектов файловой системы, чтобы работать рекурсивно.

Синтаксис

Ниже приведен синтаксис цикла For Each в VBA.

For Each element In Group
   [statement 1]
   [statement 2]
   ....
   [statement n]
   [Exit For]
   [statement 11]
   [statement 22]
Next

пример

Private Sub Constant_demo_Click()  
   'fruits is an array
   fruits = Array("apple", "orange", "cherries")
   Dim fruitnames As Variant
 
   'iterating using For each loop.
   For Each Item In fruits
      fruitnames = fruitnames & Item & Chr(10)
   Next
   
   MsgBox fruitnames
End Sub

Когда вышеуказанный код выполняется, он печатает все имена фруктов с одним элементом в каждой строке.

apple
orange
cherries

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

while..wend loop

В цикле While While … Wend , если условие равно True, все операторы выполняются до тех пор, пока не встретится ключевое слово Wend.

Если условие ложно, цикл завершается, и элемент управления переходит к следующему оператору после ключевого слова Wend .

Синтаксис

Ниже приведен синтаксис цикла While..Wend в VBA.

While condition(s)
   [statements 1]
   [statements 2]
   ...
   [statements n]
Wend

Диаграмма потока

пример

Private Sub Constant_demo_Click()
   Dim Counter :  Counter = 10   
   
   While Counter < 15     ' Test value of Counter.
      Counter = Counter + 1   ' Increment Counter.
      msgbox "The Current Value of the Counter is : " & Counter
   Wend   ' While loop exits if Counter Value becomes 15.
End Sub

Когда вышеуказанный код выполняется, он выводит следующее в поле сообщения.

The Current Value of the Counter is : 11
The Current Value of the Counter is : 12
The Current Value of the Counter is : 13
The Current Value of the Counter is : 14
The Current Value of the Counter is : 15

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

Цикл do..while

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

Синтаксис

Ниже приведен синтаксис цикла Do … While в VBA.

Do While condition
   [statement 1]
   [statement 2]
   ...
   [statement n]
   [Exit Do]
   [statement 1]
   [statement 2]
   ...
   [statement n]
Loop           

Диаграмма потока

пример

В следующем примере используется цикл Do … while для проверки состояния в начале цикла. Операторы внутри цикла выполняются, только если условие становится True.

Private Sub Constant_demo_Click()
   Do While i < 5
      i = i + 1
      msgbox "The value of i is : " & i
   Loop
End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The value of i is : 1
The value of i is : 2
The value of i is : 3
The value of i is : 4
The value of i is : 5

Альтернативный синтаксис

Существует также альтернативный синтаксис для Do … while loop, который проверяет состояние в конце цикла. Основное различие между этими двумя синтаксисами объясняется в следующем примере.

Do 
   [statement 1]
   [statement 2]
   ...
   [statement n]
   [Exit Do]
   [statement 1]
   [statement 2]
   ...
   [statement n]
Loop While condition

пример

В следующем примере используется цикл Do … while для проверки состояния в конце цикла. Заявления внутри цикла выполняются хотя бы один раз, даже если условие False.

Private Sub Constant_demo_Click() 
   i = 10
   Do
      i = i + 1
      MsgBox "The value of i is : " & i
   Loop While i < 3 'Condition is false.Hence loop is executed once.
End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The value of i is : 11

Операторы do..While будут выполняться до тех пор, пока условие равно True. (Т. Е.) Петля должна повторяться до тех пор, пока условие не будет False.

do..intil loop

Do … intil цикл не будет использован, когда мы хотим повторить набор операторов, пока условие ложно. Условие может быть проверено в начале цикла или в конце цикла.

Синтаксис

Ниже приведен синтаксис цикла Do..Until в VBA.

Do Until condition
   [statement 1]
   [statement 2]
   ...
   [statement n]
   [Exit Do]
   [statement 1]
   [statement 2]
   ...
   [statement n]
Loop    

Диаграмма потока

пример

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

Private Sub Constant_demo_Click() 
   i = 10
   Do Until i>15  'Condition is False.Hence loop will be executed
      i = i + 1
      msgbox ("The value of i is : " & i)
   Loop 
End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The value of i is : 11
The value of i is : 12
The value of i is : 13
The value of i is : 14
The value of i is : 15
The value of i is : 16

Альтернативный синтаксис

Существует также альтернативный синтаксис Do … До цикла, который проверяет условие в конце цикла. Основное различие между этими двумя синтаксисами объясняется следующим примером.

Do 
   [statement 1]
   [statement 2]
   ...
   [statement n]
   [Exit Do]
   [statement 1]
   [statement 2]
   ...
   [statement n]
Loop Until condition

Диаграмма потока

пример

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

Private Sub Constant_demo_Click()  
   i = 10
   Do 
      i = i + 1
      msgbox "The value of i is : " & i
   Loop Until i more15 'Condition is True.Hence loop is executed once.
End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The value of i is : 11

Операторы do..Until будут выполняться до тех пор, пока условие False. (Т. Е.) Петля должна повторяться до тех пор, пока условие не будет истинным.

Записи управления циклом

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

Контрольное заявление и описание

Выход для оператора

Выход for используется , когда мы хотим , чтобы выйти из For Loop на основе определенных критериев. Когда Exit For выполняется, управление переходит к следующему оператору сразу после цикла For Loop.

Синтаксис

Ниже приведен синтаксис Exit For Statement в VBA.

Диаграмма потока

пример

В следующем примере используется Exit For . Если значение счетчика достигает 4, цикл For Loop завершается, и управление переходит к следующему утверждению сразу после цикла For Loop.

Private Sub Constant_demo_Click()
   Dim a As Integer
   a = 10
   
   For i = 0 To a Step 2 'i is the counter variable and it is incremented by 2
      MsgBox ("The value is i is : " & i)
      If i = 4 Then
         i = i * 10 'This is executed only if i=4
         MsgBox ("The value is i is : " & i)
         Exit For 'Exited when i=4
      End If
   Next
End Sub

Когда вышеуказанный код выполняется, он печатает следующий вывод в окне сообщений.

The value is i is : 0
The value is i is : 2
The value is i is : 4
The value is i is : 40

Завершает оператор цикла For и передает выполнение в оператор сразу после цикла

Exit Do

Exit Do Заявление используется , когда мы хотим , чтобы выйти из Do Loops на основе определенных критериев. Он может использоваться как в Do Do … While, так и Do … До циклов.

Когда Exit Do выполняется, управление переходит к следующему оператору сразу после Do Loop.

Синтаксис

Ниже приведен синтаксис выражения Exit Do в VBA.

пример

В следующем примере используется Exit Do . Если значение счетчика достигает 10, выходная линия Do завершается, и управление переходит к следующему оператору сразу после цикла For Loop.

Private Sub Constant_demo_Click()
   i = 0
   Do While i <= 100
      If i > 10 Then
         Exit Do   ' Loop Exits if i>10
      End If
      MsgBox ("The Value of i is : " & i)
      i = i + 2
   Loop
End Sub

Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.

The Value of i is : 0
The Value of i is : 2
The Value of i is : 4
The Value of i is : 6
The Value of i is : 8
The Value of i is : 10

Завершает оператор Do While и передает выполнение в оператор сразу после цикла

 С уважением, авторы сайта Компьютерапия

Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

Циклы VBA: for, while и другие

Доброго времени суток! Данную статью я решил посвятить рубрике по основам программирования в Visual Basic for Application. И сегодня мы поговорим о циклах в VBA, разберём их синтаксис и рассмотрим несколько примеров, которые часто встречаются программисту.

Сначала напомню, что цикл — процесс повторения части кода, выполняемый, пока не будет выполнено или нарушено заданное нами условие.

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

Цикл For в VBA

Цикл for в VBA обычно используется при зацикливании фрагмента кода, если нам известно конечное значение counter — счетчика, при котором мы выйдем из цикла.
Возьмём для примера самый распространённый пример:

Сгенерировать массив из 5 целых значений

Dim mas(5) As Integer
For i% = 0 To 4
    mas(i) = Int((10 * Rnd) + 1)
Next i

Обратите ваше внимание, что в этом примере используется неявное объявление при работе с циклами в VBA. i% — означает неявное объявление переменной i в формате integer. Такая конструкция по сути заменяет следующую: dim i as integer. Это используется для сокращения кода и для удобства написания и чтения. В старых версиях VBA необходимо указывать знак формата после каждого использования неявной переменной. В более поздних версиях достаточно всего один раз.

VBA для цикла for даёт возможность использовать функцию Step. Как ясно из перевода, это шаг, с которым мы будем проходить наш интервал. По умолчанию, он равен 1. Популярный вариант использования встречается в случаях, когда counter связан с переменной, используемой внутри цикла. Например, при написании программ, связанных с функциями.

Найти пересечение графика функции y = 5*x + 5 с осью ординат

Function expr(x As Integer) As Integer
    expr = 5 * x + 5
End Function
Sub CodeTown()
    Dim i As Integer
    For i = -10 To 10 Step 1
        If expr(i) = 0 Then MsgBox "При Y = 0, Х = "+ CStr(i)
    Next i
End Sub

Теперь представим, что у нас достаточно большой диапазон и мы не хотим заставлять компьютер считать лишние итерации. На этот случай существует команда Exit For. Перепишем наш последний пример с новой командой.

Function expr(x As Integer) As Integer
    expr = 5 * x + 5
End Function
Sub CodeTown()
    Dim i As Integer
    For i = -10 To 10 Step 1
        If expr(i) = 0 Then
            MsgBox "При Y = 0, Х = "+ CStr(i)
            Exit For
        End If
    Next i
End Sub

C помощью команды Exit можно закончить выполнение любого цикла в VBA. Достаточно указать после Exit название используемого цикла. Также им возможно завершить работу любой процедуры или функции.

Цикл For Each в VBA

For Each в VBA основан на переборе всех элементов, указанного типа в массиве, объекте или группе.
Самый популярный вариант его использования — перебор страниц в рабочей книге.

Вывести названия всех листов в рабочей книге

For Each ws In ThisWorkbook.Worksheets
    MsgBox ws.Name
Next ws

И ещё один интересный пример:

Изменить размер шрифта и выравнить по центру текст в label

For Each element In UserForm1.Controls
    If InStr(1, UserForm1.Controls.Item(i%).Name, "Label") > 0 Then
        UserForm1.Controls.Item(i%).TextAlign = fmTextAlignCenter
        UserForm1.Controls.Item(i%).Font.Size = 20
        i% = i% + 1
    End If
Next element

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

Цикл While в VBA

Циклы в VBA, которые используют структуру Do..Loop (это while и until циклы) можно записывать с разным расположением фрагмента условия. Как видите на картинке выше, условие может проверяться после выполнения одной итерации, а может перед запуском цикла.
Самый популярный пример:

Отсортируйте по возрастанию сгенерированный массив методом пузырька

Dim mas(5) As Integer
For i% = 0 To 4
    mas(i%) = Int((10 * Rnd) + 1)
Next i
Dim count As Integer, temp As Integer
count = 1
Do While count > 0
    count = 0
    For i% = 0 To 3
        If mas(i) > mas(i + 1) Then
            temp = mas(i)
            mas(i) = mas(i + 1)
            mas(i + 1) = temp
            count = count + 1
        End If
    Next i%
Loop

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

Цикл Until в VBA

Как видите, отличия от while крайне несущественные. Цикл Until в VBA можно реализовать с помощью конструкции while NOT (condition). Тем не менее, приведу пример:

Заставить пользователя ввести число

Dim temp As Variant
Do
    temp = InputBox("Введите число")
Loop Until IsNumeric(temp)

Почему заставить? Потому, что если пользователь закроет окно ввода, это его не спасёт, оно будет появляться вновь и вновь пока он не введёт любое число.

На этом мы закончим. Сегодня мы рассмотрели важную тему циклов в VBA, разобрали основные примеры. Конечно все примеры по этой обширной теме сложно разобрать, но, тем не менее, основы вы должны понять. Оставляйте ваши комментарии, если у вас возникли вопросы.
Скачать исходник

Поделиться ссылкой:

Похожее

Использование Do… Операторы Loop (VBA)



  • Чтение занимает 2 мин

В этой статье

Вы можете использовать Операторы Loop для выполнения блока операторов неограниченное число раз.You can use Do…Loop statements to run a block of statements an indefinite number of times. Операторы повторяются до тех пор, пока сохраняется условие True, или пока условие не станет True.The statements are repeated either while a condition is True or until a condition becomes True.

Повторяющиеся операторы, пока условие имеет значение trueRepeating statements while a condition is True

Существует два способа использования ключевого слова while для проверки условия в методе Do… Оператор Loop .There are two ways to use the While keyword to check a condition in a Do…Loop statement. Перед входом в цикл можно проверить условие или проверить его после запуска цикла хотя бы один раз.You can check the condition before you enter the loop, or you can check it after the loop has run at least once.

В следующей ChkFirstWhile процедуре перед входом в цикл проверяется условие.In the following ChkFirstWhile procedure, you check the condition before you enter the loop. Если myNum задано значение 9, а не 20, операторы в цикле никогда не будут выполняться.If myNum is set to 9 instead of 20, the statements inside the loop will never run. В ChkLastWhile процедуре операторы в цикле выполняются только один раз до того, как условие станет ложным.In the ChkLastWhile procedure, the statements inside the loop run only once before the condition becomes False.

Sub ChkFirstWhile() 
    counter = 0 
    myNum = 20 
    Do While myNum > 10 
        myNum = myNum - 1 
        counter = counter + 1 
    Loop 
    MsgBox "The loop made " & counter & " repetitions." 
End Sub 
 
Sub ChkLastWhile() 
    counter = 0 
    myNum = 9 
    Do 
        myNum = myNum - 1 
        counter = counter + 1 
    Loop While myNum > 10 
    MsgBox "The loop made " & counter & " repetitions." 
End Sub

Повторяющиеся операторы до тех пор, пока условие не станет истиннымRepeating statements until a condition becomes True

Существует два способа использования ключевого слова Until для проверки условия в операторе Do…Loop.There are two ways to use the Until keyword to check a condition in a Do…Loop statement. Перед входом в цикл (как показано в ChkFirstUntil процедуре) можно проверить условие (как показано в процедуре) или проверить его после выполнения цикла по крайней мере один раз (как показано в ChkLastUntil процедуре).You can check the condition before you enter the loop (as shown in the ChkFirstUntil procedure), or you can check it after the loop has run at least once (as shown in the ChkLastUntil procedure). Повторение циклов продолжается, пока сохраняется условие False.Looping continues while the condition remains False.

Sub ChkFirstUntil() 
    counter = 0 
    myNum = 20 
    Do Until myNum = 10 
        myNum = myNum - 1 
        counter = counter + 1 
    Loop 
    MsgBox "The loop made " & counter & " repetitions." 
End Sub 
 
Sub ChkLastUntil() 
    counter = 0 
    myNum = 1 
    Do 
        myNum = myNum + 1 
        counter = counter + 1 
    Loop Until myNum = 10 
    MsgBox "The loop made " & counter & " repetitions." 
End Sub

Выход из команды Do… Оператор Loop в циклеExiting a Do…Loop statement from inside the loop

Вы можете выйти из команды Do… Выполните цикл с помощью оператора Exit Do .You can exit a Do…Loop by using the Exit Do statement. Например, чтобы выйти из бесконечного цикла, используйте оператор Exit Do в блоке истинного оператора If… Then… Оператор else или оператор Select Case .For example, to exit an endless loop, use the Exit Do statement in the True statement block of either an If…Then…Else statement or a Select Case statement. Если условие будет False, цикл запустится обычным образом.If the condition is False, the loop will run as usual.

В следующем примере myNum присваивается значение, которое создает бесконечный цикл.In the following example myNum is assigned a value that creates an endless loop. Оператор If…Then…Else проверяет это условие, а затем выходит из бесконечного цикла.The If…Then…Else statement checks for this condition, and then exits, preventing endless looping.

Sub ExitExample() 
    counter = 0 
    myNum = 9 
    Do Until myNum = 10 
        myNum = myNum - 1 
        counter = counter + 1 
        If myNum < 10 Then Exit Do 
    Loop 
    MsgBox "The loop made " & counter & " repetitions." 
End Sub

Примечание

Чтобы остановить бесконечный цикл, нажмите клавиши ESC или CTRL+BREAK.To stop an endless loop, press ESC or CTRL+BREAK.

См. такжеSee also

Поддержка и обратная связьSupport and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи?Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.



For Next, Do While, Do until, For Each (с примерами)

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

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

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

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

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

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

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

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

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

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

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

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

Для следующего цикла

Цикл «Для следующего» позволяет вам пройти блок кода указанное количество раз.

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

Не правда ли?

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

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

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

 For Counter = Start To End [Step Value]
[Блок кода для выполнения]
Next [counter] 

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

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

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

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

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

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

 Дополнительные номера ()
Тусклый итог как целое число
Тусклый счет как целое число
Итого = 0
Для количества = от 1 до 10
Итого = Итого + Количество
Следующий счет
MsgBox Итого
End Sub 

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

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

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

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

Пример 2 — Добавление первых 5 четных положительных целых чисел

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

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

 Sub AddEvenNumbers ()
Тусклый итог как целое число
Тусклый счет как целое число
Итого = 0
Для Count = от 2 до 10 Шаг 2
Итого = Итого + Количество
Следующий счет
MsgBox Итого
End Sub 

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

Когда вы используете «Step 2» , он сообщает коду увеличивать значение «Count» на 2 при каждом запуске цикла.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В каждом случае он обращается к I-й книге (с использованием рабочих листов (i)) и защищает ее.

Этот же код можно использовать и для снятия защиты с листов. Просто измените строку Worksheets (i) .Protect to Worksheets (i) .UnProtect .

Вложенные циклы «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 To Workbooks (i) .Worksheets.Count
Рабочие тетради (i). Рабочие листы (j) .Protect
Следующий j
Далее я
End Sub 

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

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

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

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

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

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

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

 Sub HghlightNegative ()
Dim Rng As Range
Установить Rng = Range ("A1", Range ("A1"). End (xlDown))
Counter = 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 есть два типа синтаксиса.

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

и

 Do
[Блок кода для выполнения]
Цикл [условие while] 

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

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

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

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

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

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

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

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

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

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

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

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

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

 Sub EnterCurrentMonthDates ()
Затемнить CMDate как дату
Dim i как целое число
я = 0
CMDate = DateSerial (Год (Дата), Месяц (Дата), 1)
Месяц (CMDate) = Месяц (Дата)
Диапазон («А1»).Смещение (i, 0) = CMDate
я = я + 1
CMDate = CMDate + 1
Петля
End Sub 

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

Оператор Exit Do

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

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

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

 Sub EnterCurrentMonthDates ()
Затемнить CMDate как дату
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 While» цикл выполняется до тех пор, пока не будет выполнено заданное условие, а в «Do While» - до тех пор, пока не будет выполнено заданное условие.

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

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

и

 Do
[Блок кода для выполнения]
Цикл [условие до] 

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

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

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

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

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

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

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

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

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

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

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

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

Вы можете сделать это, используя следующий код цикла «До тех пор, пока»:

 Sub EnterCurrentMonthDates ()
Затемнить CMDate как дату
Dim i как целое число
я = 0
CMDate = DateSerial (Год (Дата), Месяц (Дата), 1)
Сделать до месяца (CMDate) <> Month (Date)
Диапазон («А1»).Смещение (i, 0) = CMDate
я = я + 1
CMDate = CMDate + 1
Петля
End Sub 

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

Оператор Exit Do

Вы можете использовать оператор Exit Do, чтобы выйти из цикла.

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

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

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

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

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

For Each

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

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

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

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

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

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

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

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

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

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

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

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

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

 Sub ProtectSheets ()
Dim ws как рабочий лист
Для каждого ws в ActiveWorkbook.Рабочие листы
ws.Protect
Следующий ws
End Sub 

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

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

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

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

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

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

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

 Sub SaveAllWorkbooks ()
Dim wb As Workbook
Для каждого ББ в книгах
wb.Save
Следующий wb
End Sub 

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

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

Пример 3 - Перебрать все ячейки в выделенном фрагменте (выделить отрицательные значения)

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

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

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

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

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

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

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

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

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

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

«Exit For» Statment

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

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

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

 Sub HighlightNegativeCells ()
Dim Cll As Range
Для каждого выбранного вызова
Если WorksheetFunction.Мин (Выбор)> = 0 Затем выйти для
Если Cll.Value <0, то
Cll.Interior.Color = vbRed
Конец, если
Следующая Cll
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 VBA Loop - Easy Excel Macros

Одинарный контур | Двойная петля | Тройная петля | Сделай, пока цикл

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

Одноконтурный

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

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

Dim i как целое число

Для i = от 1 до 6
Ячейки (i, 1). Value = 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 как целое число, j как целое число

Для 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) .Cells (i, j) .Value = 100
Далее j
Далее i
Далее c

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

Цикл выполнения цикла

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

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

Dim i как целое число
i = 1

Делать, пока i <6
Ячейки (i, 1).Значение = 20
i = i + 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 как целое число
i = 1

Do While Cells (i, 1) .Value <> ""
Cells (i, 2) .Value = Cells (i, 1) .Value + 10
i = i + 1
Петля

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

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

циклов Excel VBA - для каждого, для следующего, для выполнения, вложенных и др.

Для эффективной работы в VBA вы должны понимать циклы.

Циклы

позволяют повторять блок кода заданное количество раз или повторять блок кода для каждого объекта в наборе объектов.

Сначала мы покажем вам несколько примеров, чтобы показать, на что способны петли. Затем мы научим вас всему, что касается петель.

Быстрые примеры цикла VBA

для каждой петли

For Each Loops выполняет цикл по каждому объекту в коллекции, например по каждому листу в книге или каждой ячейке в диапазоне.

Цикл по всем листам в книге

Этот код будет перебирать все листы в книге, показывая каждый лист:

Sub LoopThroughSheets ()

Dim ws As Worksheet

Для каждого ws в рабочих таблицах

WS.Visible = True

Next

End Sub

Цикл по всем ячейкам в диапазоне

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

Sub If_Loop ()

Dim Cell as Range

Для каждой ячейки в диапазоне ("A2: A6")

Если Cell.Value> 0, то

Cell.Offset (0, 1) .Value = "Положительный "

ElseIf Cell.Значение <0 Тогда

Cell.Offset (0, 1) .Value = "Negative"

Else

Cell.Offset (0, 1) .Value = "Zero"

End If

Next Cell

End Sub

AutoMacro - Генератор кода VBA

для следующих циклов

Другой тип цикла «For» - это цикл For Next. Цикл For Next Loop позволяет вам перебирать целые числа.

Этот код будет перебирать целые числа от 1 до 10, отображая каждое с окном сообщения:

Sub ForLoop ()

Dim i As Integer

For i = 1 To 10

MsgBox i

Next i

End Sub

Циклы выполнения цикла "Пока"

Do While Loops будет зацикливаться, пока выполняется условие.Этот код также будет перебирать целые числа от 1 до 10, отображая каждое с окном сообщения.

Sub DoWhileLoop ()

Dim n As Integer

n = 1

Do While n <11

MsgBox n

n = n + 1

Loop

End Sub

До циклов

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

Sub DoUntilLoop ()

Dim n As Integer

n = 1

До n> = 10

MsgBox n

n = n + 1

Loop

End Sub

Мы обсудим это ниже, но вам нужно быть предельно осторожным при создании циклов Do While или Do Not, чтобы не создать бесконечный цикл.

Построитель циклов VBA

Это снимок экрана «Loop Builder» из нашей надстройки Premium VBA: AutoMacro. Конструктор циклов позволяет быстро и легко создавать циклы для обхода различных объектов или чисел. Вы можете выполнять действия с каждым объектом и / или выбирать только те объекты, которые соответствуют определенным критериям.

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

Теперь мы подробно рассмотрим различные типы петель.

VBA для следующего цикла

Синтаксис цикла

Цикл For Next Loop позволяет вам повторять блок кода определенное количество раз. Синтаксис:

[Dim Counter as Integer]

For Counter = Start to End [Step Value]

[Do Something]

Next [Counter]

Где элементы в скобках не обязательны.

  • [Dim Counter as Long] - Объявляет переменную счетчика. Требуется, если Option Explicit объявлен в верхней части вашего модуля.
  • Счетчик - Целочисленная переменная, используемая для подсчета
  • Start - Начальное значение (Пример 1)
  • Конец - Конечное значение (Пример 10)
  • [Значение шага] - Позволяет считать каждые n целых чисел вместо каждого 1 целого числа. Вы также можете пойти в обратном направлении с отрицательным значением (например,Шаг -1)
  • [Сделайте что-нибудь] - Код, который будет повторяться
  • Next [Counter] - Оператор закрытия цикла For Next. Вы можете включить счетчик или нет. Однако я настоятельно рекомендую включить счетчик, так как он облегчает чтение кода.

Если это сбивает с толку, не волнуйтесь. Рассмотрим несколько примеров:

Считайте до 10

Этот код будет считать до 10 с использованием цикла For-Next:

Sub ForEach_CountTo10 ()

Dim n As Integer

For n = 1 To 10

MsgBox n

Next n

End Sub

Для шага цикла

Считай до 10 - только четные числа

Этот код будет считать до 10, считая только четные числа:

Sub ForEach_CountTo10_Even ()

Dim n As Integer

For n = 2 To 10 Step 2

MsgBox n

Next n

End Sub

Обратите внимание, что мы добавили «Шаг 2».Это указывает циклу For «пройти» через счетчик на 2. Мы также можем использовать отрицательное значение шага для перехода в обратном направлении:

для шага цикла - обратный

Обратный отсчет от 10

Этот код будет отсчет времени с 10:

Sub ForEach_Countdown_Inverse ()

Dim n As Integer

For n = 10 To 1 Step -1

MsgBox n

Next n

MsgBox «Lift Off»

End Sub11

Удалить строки, если ячейка пуста

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

В этом примере будут удалены строки с пустыми ячейками (начиная с нижней строки):

Sub ForEach_DeleteRows_BlankCells ()

Dim n As Integer

For n = 10 To 1 Step -1

If Range ("a" & n) .Value = "" Тогда

Range ("a" & n) .EntireRow.Delete

End If

Next n

End Sub

Вложенный для цикла

Вы можете «вложить» один цикл For в другой цикл For.Мы будем использовать Nested For Loops для создания таблицы умножения:

Sub Nested_ForEach_MultiplicationTable ()

Тусклая строка как целое число, столбец как целое число

Для строки = от 1 до 9

Для столбца = от 1 до 9

Ячейки (строка + 1, столбец + 1) .Value = строка * столбец

Следующий столбец

Следующая строка

End Sub

Выход для

Оператор Exit For позволяет немедленно выйти из цикла For Next.

Обычно вы используете Exit For вместе с оператором If, выходя из цикла For Next Loop, если выполняется определенное условие.

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

Этот код будет перебирать строки с 1 по 1000, ища «ошибку» в столбце A. Если она найдена, код выберет ячейку, предупредит вас о найденной ошибке и выйдет из цикла:

Sub ExitFor_Loop ()

Dim i As Integer

For i = 1 To 1000

If Range ("A" & i).Значение = "ошибка" Тогда

Диапазон ("A" & i). Выберите

MsgBox "Обнаружена ошибка"

Выход для

Конец Если

Далее i

Конец подпрограммы

Важно: В случае вложенных циклов For, Exit For завершает только текущий цикл For, а не все активные циклы.

Продолжить для

VBA не имеет команды «Продолжить», которая есть в Visual Basic. Вместо этого вам нужно будет использовать «Выход».

VBA для каждого цикла

VBA For Each Loop будет перебирать все объекты в коллекции:

  • Все ячейки в диапазоне
  • Все листы в книге
  • Все формы на листе
  • Все открытые книги

Вы также можете использовать Nested For Each Loops для:

  • Все ячейки в диапазоне на всех листах
  • Все формы на всех листах
  • Все листы во всех открытых книгах
  • и так далее…

Синтаксис:

Для каждого объекта в коллекции

[Сделайте что-нибудь]

Далее [Объект]

Где:

  • Объект - переменная, представляющая диапазон, рабочий лист, рабочую книгу, форму и т. Д.(например, RNG)
  • Коллекция - Коллекция объектов (например, Range («a1: a10»)
  • [Сделайте что-нибудь] - Блок кода для запуска на каждом объекте
  • След. [Объект] - Заключение. [Объект] не является обязательным, но настоятельно рекомендуется.

для каждой ячейки в диапазоне

Этот код будет перебирать каждую ячейку в диапазоне:

Sub ForEachCell_inRange ()

Тусклая ячейка как диапазон

Для каждой ячейки в диапазоне ("a1: a10")

ячейка.Value = cell.Offset (0,1) .Value

Следующая ячейка

End Sub

для каждого рабочего листа в рабочей тетради

Этот код будет перебирать все листы в книге, снимая защиту с каждого листа:

Sub ForEachSheet_inWorkbook ()

Dim ws As Worksheet

For Each ws In Worksheets

ws.Unprotect "password"

Next ws

End Sub

для каждой открытой книги

Этот код сохранит и закроет все открытые книги:

Sub ForEachWB_inWorkbooks ()

Dim wb As Workbook

Для каждого wb в книгах

wb.Закрыть SaveChanges: = True

Next wb

End Sub

для каждой формы на листе

Этот код удалит все фигуры на активном листе.

Sub ForEachShape ()

Dim shp As Shape

Для каждого shp в ActiveSheet.Shapes

shp.Delete

Next shp

End Sub

для каждой формы на каждом листе в книге

Вы также можете вкладывать For Each Loops.Здесь мы пройдемся по всем фигурам на всех листах активной книги:

Sub ForEachShape_inAllWorksheets ()

Dim shp As Shape, ws As Worksheet

For Each ws In Worksheets

For each shp In ws.Shapes

Концевой переходник

для каждого - IF Loop

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

Этот код скроет все пустые строки в диапазоне:

Sub ForEachCell_inRange ()

Тусклая ячейка как диапазон

Для каждой ячейки в диапазоне ("a1: a10")

Если cell.Value = "" Тогда _

cell.EntireRow.Hidden = True

Следующая ячейка

End Sub

Цикл выполнения цикла в VBA

Команды VBA Do While и Do While (см. Следующий раздел) очень похожи.Они будут повторять цикл, пока (или до тех пор, пока) не будет выполнено условие.

Цикл Do While Loop будет повторять цикл, пока выполняется условие.

Вот синтаксис Do while:

Выполнить условие

[Сделать что-нибудь]

Цикл

Где:

  • Условие - Условие для проверки
  • [Сделайте что-нибудь] - Повторяемый блок кода

Вы также можете настроить цикл Do While с условием в конце цикла:

Сделать

[Сделать что-нибудь]

Зациклить, пока Условие

Мы продемонстрируем каждый из них и покажем, чем они отличаются:

Делай, пока

Вот пример цикла Do While, который мы продемонстрировали ранее:

Sub DoWhileLoop ()

Dim n As Integer

n = 1

Do While n <11

MsgBox n

n = n + 1

Loop

End Sub

Цикл в то время как

Теперь давайте запустим ту же процедуру, за исключением того, что мы переместим условие в конец цикла:

Sub DoLoopWhile ()

Dim n As Integer

n = 1

Do

MsgBox n

n = n + 1

Loop While n <11

End Sub

VBA До цикла

Do until Loops будет повторять цикл до тех пор, пока не будет выполнено определенное условие.Синтаксис по существу такой же, как у циклов Do While:

Выполнить до условия

[Сделать что-нибудь]

Цикл

и аналогичным образом условие может идти в начале или в конце цикла:

Do

[Do Something]

Цикл до состояния

До

Этот цикл do until будет считать до 10, как и в наших предыдущих примерах

Sub DoUntilLoop ()

Dim n As Integer

n = 1

До n> 10

MsgBox n

n = n + 1

Loop

End Sub

Цикл до

Этот цикл до цикла будет считать до 10:

Sub DoLoopUntil ()

Dim n As Integer

n = 1

Do

MsgBox n

n = n + 1

Цикл до n> 10

End Sub

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

Подобно использованию Exit For для выхода из цикла For, вы используете команду Exit Do для немедленного выхода из цикла Do

Вот пример Exit Do:

Sub ExitDo_Loop ()

Dim i As Integer

i = 1

Do until i> 1000

If Range ("A" & i).Значение = "ошибка" Затем

Диапазон ("A" & i). Выберите

MsgBox "Обнаружена ошибка"

Exit Do

End If

i = i + 1

Loop

End Sub

Конечная или разрывная петля

Как мы упоминали выше, вы можете использовать Exit For или Exit Do для выхода из циклов:

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

Если вы пытаетесь «разорвать» текущий цикл, вы можете попробовать нажать на клавиатуре ESC или CTRL + Pause Break .Однако это может не сработать. Если это не сработает, вам нужно дождаться завершения цикла или, в случае бесконечного цикла, использовать CTRL + ALT + Delete , чтобы принудительно закрыть Excel.

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

Другие примеры циклов

Сквозные строки

Это будет перебирать все строки в столбце:

Public Sub LoopThroughRows ()

Dim cell As Range

For each cell In Range ("A: A")

Ff cell.значение <> "" затем MsgBox cell.address & ":" & cell.value

Следующая ячейка

End Sub

Проходные колонны

Это будет циклически перебирать все столбцы в строке:

Public Sub LoopThroughColumns ()

Dim cell As Range

For Each cell In Range ("1: 1")

If cell.Value <> "" Затем MsgBox cell.Address & ":" & клетка.Значение

Следующая ячейка

End Sub

Просмотр файлов в папке

Этот код будет перебирать все файлы в папке, создавая список:

1

2

3

4

5

6

7

8

9

10

11

12

13

140002

18

19

Sub LoopThroughFiles ()

Dim oFSO As Object

Dim oFolder As Object

Dim oFile As Object

Dim i As Integer

Установить oFSO = CreateObject. ("FileSystemObject ")

Установить oFolder = oFSO.GetFolder (" C: \ Demo)

i = 2

Для каждого oFile In oFolder.Files

Диапазон ("Aue" & i) Диапазон ("Aue" & i) = oFile.Name

i = i + 1

Следующий oFile

End Sub

Массив сквозного прохода

Этот код будет перебирать массив «arrList»:

Для i = LBound (arrList) To UBound (arrList)

MsgBox arrList (i)

Next i

Функция LBound получает «нижнюю границу» массива, а UBound - «верхнюю границу».

Петли в доступе VBA

Большинство приведенных выше примеров также будут работать в Access VBA. Однако в Access мы перебираем объект Recordset, а не объект Range.

1

2

3

4

5

6

7

8

9

10

11

12

13

140002

18

Sub LoopThroughRecords ()

При ошибке Возобновить следующий

Dim dbs As Database

Dim rst As Recordset

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)

С первым

.MoveLast

.MoveFirst

До .EOF = True

MsgBox (rst.Fields ("ClientName"

0002000

0003 End With

rst.Close

Set rst = Nothing

Set dbs = Nothing

End Sub

VBA Do Loop - Руководство, примеры, как создать Do Loop

Do Loop в VBA

Do Loop VBA - это подраздел внутри макроса VBA Macros Установка макросов в Excel VBA довольно проста.Структура макросов Excel VBA включает начало со строки sub () перед началом кода макроса. это будет «зацикливаться» или повторяться до тех пор, пока не будут выполнены определенные критерии. Кодировщик может настроить цикл на повторение заданного числа раз, пока определенная переменная не превысит пороговое значение или пока определенная ячейка не будет активирована. Фактически, циклы довольно надежны в том смысле, что пользователь может проявить творческий подход к критериям, завершающим цикл, до тех пор, пока он или она понимает, как работают циклы VBA. Это может стать очень полезным при создании финансовой модели. Что такое финансовое моделирование? Финансовое моделирование выполняется в Excel для прогнозирования финансовых показателей компании.Обзор того, что такое финансовое моделирование, как и зачем его создавать. более эффективным.

Оператор Do Loop будет иметь начальный оператор и конечный оператор, а код для выполнения содержится в этих двух операторах. Это похоже на структуру макроса, где весь код макроса содержится внутри оператора Sub, который запускает макрос, и оператора End Sub, который его завершает. Макросы могут содержать несколько отдельных циклов, а циклы могут содержать циклы внутри себя до бесконечности.

Чтобы узнать больше, запустите наш онлайн-курс финансового моделирования Excel VBA!

Различные типы циклов

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

  • Цикл «До тех пор»
  • Цикл «Пока»
  • Для цикла VBA для цикла В цикле «For» VBA процесс будет повторяться определенное количество раз, пока не будут выполнены критерии. VBA For Loops менее динамичны, чем Do Loops.

Цикл «До тех пор»

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

Dim n как целое число

N = 0

До n = 10

n = n + 1

Loop

В этом примере мы установили известную целочисленную переменную как «n». Макрос изначально сохраняет значение 0 в n.Когда он попадает в цикл Do until, критерий n = 10 неверен, поэтому процесс внутри цикла выполняется. Первая итерация добавляет 1 к n, превращая значение в 1. Поскольку n по-прежнему не равно 10, процесс будет повторяться 10 раз, пока n не станет 10. Как только n = 10, макрос пройдет цикл и продолжит выполнение оставшейся части. макрос.

Этот тип цикла с использованием целого числа полезен для выполнения процесса определенное количество раз. Например, вы можете заполнить первые десять строк в столбце A текстом «Компания n».Это делается следующим образом:

Dim n как целое число

N = 0

До n = 10

n = n + 1

Диапазон («A» и n). = «Компания» & n

Цикл

Запуск этого макроса заполнит ячейку A1 компанией 1, ячейку A2 - компанией 2 и так далее, пока ячейка A10 не будет заполнена компанией 10. В ячейке A10 действие do до критерии n = 10 будут выполнены, поэтому макрос завершит цикл и продолжит работу.

Чтобы узнать больше, запустите наш онлайн-курс по финансовому моделированию Excel VBA!

Цикл Do While

В отличие от цикла do while, цикл Do While будет выполнять цикл до тех пор, пока критерий не станет ложным. Другими словами, цикл Do Loop будет выполняться, пока выполняются критерии. Это выглядит полной противоположностью цикла do until. Если бы мы использовали точно такой же пример макроса, приведенный выше, но заменили do до тех пор, пока на do while, макрос просто пропустил цикл.Это связано с тем, что n равно 0 в начале процесса, а цикл будет выполняться только при n = 10. Поскольку n может достичь только 10 в процессе цикла, оно никогда не может достичь 10, и поэтому цикл будет пропущен.

Вместо этого, чтобы выполнить тот же процесс в цикле do while, мы должны использовать неравенство.

Dim n как целое число

N = 0

Do while n <11

n = n + 1

Диапазон («A» и n).Значение = «Компания» & n

Цикл

Обратите внимание, что неравенство использует 11 вместо 10. Это связано с тем, что макрос должен выполняться до тех пор, пока он не достигнет компании 10. Если критерий цикла был установлен на n <10, цикл закончится в компании 9, поскольку он будет работать только тогда, когда n меньше 10. Поскольку 10 не меньше 10, он закончится прямо перед тем, как достигнет компании 10.

Несколько критериев с использованием И и ИЛИ с Do Loop

С помощью этих циклов вы также можете включить несколько критериев, включив два выражения, разделенных оператором AND или OR.Эти операторы говорят сами за себя.

Цикл do until с двумя критериями, разделенными AND, будет выполняться до тех пор, пока оба критерия не будут выполнены. Цикл do until с двумя критериями, разделенными OR, будет выполняться до тех пор, пока не будет выполнен любой из критериев.

Цикл do while с двумя критериями AND будет выполняться, пока выполняются оба критерия.

Цикл do while с двумя критериями ИЛИ будет выполняться, пока выполняется хотя бы один из критериев.

Использование нескольких критериев может стать очень важным в финансовом моделировании.Например, пользователь может потребовать, чтобы два коэффициента левериджа Коэффициенты левериджа Коэффициент левериджа указывал на уровень долга, понесенного хозяйствующим субъектом по нескольким другим счетам в его балансе, отчете о прибылях и убытках или отчете о движении денежных средств. Шаблон Excel находится выше определенных значений перед запуском определенного макроса.

Нечисловые критерии в цикле Do

В цикле For описанный выше процесс можно упростить. Цикл for VBA В цикле For VBA процесс будет повторяться определенное количество раз, пока не будут выполнены критерии.VBA For Loops менее динамичны, чем Do Loops. имеет преимущество перед циклами do, потому что он автоматически создает переменную вместо n за один простой шаг. Однако циклы do имеют определенные преимущества по сравнению с циклами for.

В то время как циклы for обычно могут использоваться только с числовыми переменными, циклы do могут иметь критерии, которые используют другие типы данных, такие как строки и даты. Цикл do можно настроить на выполнение только до тех пор, пока не будут получены определенные данные. Например, возможно, пользователь хочет, чтобы макрос запускался только в 2017 году и не запускался по прошествии года.Этого можно добиться с помощью переменной даты и установки критерия «Сделать до [DateVariable]» = 01.01.2018.

Возможно, вместо этого пользователь хотел бы, чтобы макрос запускался только тогда, когда определенная ячейка пуста, а не запускался, когда эта ячейка была заполнена. Это может быть выполнено с помощью таких критериев, как «До диапазона» («A5»). Значение = «». Знак «» означает пустую ячейку. Примечание. Ячейка, содержащая пробел, может казаться пустой, но VBAExcel не считает ее пустой. VBAVBA означает Visual Basic для приложений.Excel VBA - это язык программирования Microsoft для Excel и всех других программ Microsoft Office, таких как Word и PowerPoint. Все программы пакета Office используют общий язык программирования.

Чтобы узнать больше, запустите наш онлайн-курс финансового моделирования Excel VBA!

Дополнительные ресурсы

Благодарим вас за чтение этого руководства CFI о том, как создать цикл Do в VBA. Чтобы продолжить совершенствовать свои навыки финансового моделирования, вам будут полезны следующие дополнительные ресурсы CFI:

  • VBA Excel ExampleExcel VBA examplesExcel VBA позволяет пользователю создавать макросы, которые автоматизируют процессы в Excel.В этом руководстве будут использоваться примеры Excel VBA, чтобы показать, как записывать макрос, настраивая макрос, как объявлять переменные и как ссылаться на данные.
  • VBA If Else VBA If Else Построение оператора VBA If Else очень похоже на построение вложенной формулы if внутри Excel. Преимущество использования VBA вместо этого заключается в том, что за ним гораздо легче следить, поскольку вложенные IF обычно усложняются заключением нескольких скобок. В операторе if на языке VBA каждое предложение IF отделено от другого и вместо этого расположено в порядке приоритета
  • Методы VBA Методы VBA Метод VBA - это фрагмент кода, прикрепленный к объекту VBA, переменной или ссылке на данные, который сообщает Excel, что действие, которое нужно выполнить по отношению к этому объекту.
  • Расширенные формулы Excel Расширенные формулы Excel, которые необходимо знатьЭти расширенные формулы Excel очень важно знать и выведут ваши навыки финансового анализа на новый уровень. Расширенные функции Excel

Циклы VBA - циклы для, для каждого, «пока» и «до тех пор»

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

  • For Loop
  • For Each Loop
  • Do While Loop
  • Do until Loop
  • Wend Loop (устарело)

В этом посте я объясню все эти VBA Loop с примерами . Но прежде чем перейти к теме, давайте разберемся, что такое цикл и для чего он используется.

Что такое петля и как она используется?

Цикл - это инструкция, которая может непрерывно повторять набор операторов, пока не будет достигнуто определенное условие.

Циклы могут служить следующим целям:

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

VBA FOR LOOP

Цикл For является одним из наиболее важных и часто используемых циклов в VBA. For Loop иногда также называют «For Next Loop».

Циклы For позволяют выполнять итерацию набора операторов указанное количество раз.

Синтаксис VBA For Loop

Базовый синтаксис цикла For VBA или структура For Loop выглядит следующим образом:

 For loop_ctr = start_num To end_num [step_increment] 
'Операторы, которые должны выполняться внутри цикла
Next loop_ctr

Здесь loop_ctr обозначает счетчик цикла. Это основа цикла «For Next Loop», поэтому его еще называют «хронометристом цикла». Эта переменная увеличивается после каждой итерации, пока цикл не закончится.

«start_num» - это номер, с которого должен начинаться цикл.

«end_num» - это номер, до которого цикл должен продолжаться.

step_increment - необязательный параметр. Он обозначает, на сколько значение loop_ctr должно увеличиваться после каждой итерации. По умолчанию значение step_increment равно 1. Это означает, что с каждой итерацией значение loop_ctr увеличивается на 1.

Как работает цикл VBA For Loop?

Допустим, у нас есть простой цикл For в VBA, как показано ниже:

 For loop_ctr = 1 To 100 
'Операторы, которые должны выполняться внутри цикла
Next loop_ctr
  • Когда программный элемент управления достигает оператора' For loop_ctr = От 1 до 100, он резервирует место для переменной loop_ctr в памяти и инициализирует ее значением 1.
  • После этого он последовательно выполняет операторы внутри цикла For.
  • Наконец, программный элемент управления достигает оператора «Next loop_ctr», здесь он увеличивает переменную «loop_ctr» на 1. И элемент управления снова переходит к оператору «For loop_ctr = 1 до 100», где он проверяет, имеет ли значение 'loop_ctr' достигло 100 или нет. Если значение меньше 100, то следующая итерация продолжается; в противном случае цикл останавливается.

Все еще не ясно, как работает цикл For Loop? Не волнуйтесь.Попробуем разобраться в этом с помощью блок-схемы.

VBA For Next Loop Flow Diagram

Давайте попробуем понять поток управления, изображенный на приведенной выше блок-схеме:

  1. Прежде всего, выполняется оператор FOR. Этот шаг позволяет инициализировать значения loop_ctr и step_increment.
  2. После этого условие оценивается. Если условие ИСТИНА, все операторы внутри цикла «Блок кода» выполняются. Однако, если условие оценивается как ЛОЖЬ, поток управления переходит к следующему оператору вне цикла For.
  3. Когда выполняется «блок кода» внутри цикла For, цикл начинает готовиться к следующей итерации и увеличивает значение «loop_ctr» на единицу.
  4. Наконец, условие снова оценивается с увеличенным значением 'loop_ctr', и процесс повторяется.

Несколько простых примеров цикла For в VBA

Давайте посмотрим на несколько простых примеров цикла For в VBA.

Пример 1: Используйте VBA For Loop для печати чисел от 1 до 10 в Excel.

В этом примере у нас есть диапазон «A1: A10», и мы должны заполнить этот диапазон числами от 1 до 10.
Для этого мы можем использовать следующий код:

 Sub ForLoopPrintNumbers () 
Dim loop_ctr As Integer
For loop_ctr = 1 To 10
ActiveSheet.Range ("A1"). Offset (loop_ctr - 1, 0) .Value = loop_ctr
Далее loop_ctr
MsgBox "Для цикла завершено!"
End Sub

Пояснение:

В приведенном выше коде, прежде всего, мы объявили счетчик цикла loop_ctr для нашего цикла For. Затем, вместе с оператором For, мы инициализировали loop_ctr равным 1 и установили end_num равным 10.

Внутри тела цикла For мы написали код для записи значения loop_ctr на листе Excel в столбец A. После этого идет оператор, увеличивающий loop_ctr для следующей итерации.

Обратите внимание, что, поскольку мы не указали явное значение 'step_increment', поэтому на каждой итерации 'loop_ctr' будет увеличиваться на 1. Цикл For в приведенном выше коде повторяется 10 раз и заполняет ячейки в диапазоне A1: A10 с номерами от 1-10 поочередно.

Пример 2: Используйте цикл For в VBA, чтобы найти сумму всех чисел от 1 до 10.

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

Для этого мы можем использовать следующий код:

 Sub ForLoopSumNumbers () 
Dim loop_ctr As Integer
Dim result As Integer
result = 0
For loop_ctr = 1 To 10
result = result + loop_ctr
Next loop_ctr
MsgBox «Сумма чисел от 1 до 10 равна:» & result
End Sub

Объяснение:

В приведенном выше коде, прежде всего, мы объявили счетчик цикла 'loop_ctr' для нашего цикла For.Затем мы объявили другую целочисленную переменную как «результат» для хранения суммы чисел от 1 до 10.

После этого, вместе с оператором For, мы инициализировали «loop_ctr» равным 1 и установили «end_num» как 10.

Внутри тела цикла For мы добавили значение loop_ctr вместе с результатом. Это означает, что на первой итерации результат будет: 1, а на второй итерации: (1 + 2) = 3. Точно так же на третьей итерации значение будет: (3 + 3) = 6 и так далее.

После тела цикла For находится оператор, увеличивающий значение 'loop_ctr' для следующей итерации.

Обратите внимание, что, поскольку мы не указали явное значение 'step_increment', следовательно, с каждой итерацией 'loop_ctr' будет увеличиваться на 1.

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

Пример 3: Используйте VBA For Loop для печати чисел, всех четных чисел от 1 до 10.

В этом примере мы заполним все четные числа от 1 до 10 в ячейки от A1 до A5.

Для этого мы можем использовать следующий код:

 Sub ForLoopToPrintEvenNumbers () 
Dim loop_ctr As Integer
Dim cell As Integer
cell = 1

For loop_ctr = 1 To 10
If loop_ctr Mod 2 = 0 Then
ActiveSheet .Range ("A1"). Смещение (ячейка - 1, 0) .Value = loop_ctr
cell = cell + 1
End If
Next loop_ctr

MsgBox "For Loop Completed!"
End Sub

Пояснение:

В приведенном выше коде мы прежде всего объявили счетчик цикла loop_ctr для нашего цикла For.После этого мы объявили еще одну переменную cell. Эта переменная инициализируется значением 1.

Далее, вместе с оператором For, мы инициализировали 'loop_ctr' равным 1 и установили 'end_num' равным 10.

Внутри тела цикла For мы использовали Оператор IF для проверки четности значения 'loop_ctr'.

Если значение 'loop_ctr' равно Even, то мы написали оператор для вывода значения в электронную таблицу в столбце A.

После этого мы увеличиваем переменную ячейки на 1.Мы использовали переменную ячейки в нашем цикле, чтобы напечатать значения в соответствующей ячейке столбца A.

Далее идет оператор, увеличивающий 'loop_ctr' для следующей итерации.

Обратите внимание, что, поскольку мы не указали явное значение 'step_increment', после каждой итерации 'loop_ctr' будет увеличиваться на 1.

Цикл For в приведенном выше коде повторяется 10 раз и заполняет ячейки в диапазоне A1 : A5 с четными числами от 2 до 10.

Альтернативная логика

Есть еще один лучший способ сделать то же самое, давайте посмотрим, как это сделать.

 Sub ForLoopToPrintEvenNumbers () 
Dim loop_ctr As Integer
Dim cell as Integer
cell = 1

For loop_ctr = 2 To 10 Step 2
ActiveSheet.Range ("A1"). Offset (cell - 1, 0) .Value = loop_ctr
cell = cell + 1
Next loop_ctr

MsgBox «Для цикла завершено!»
End Sub

Объяснение:

В приведенном выше коде мы перебрали все числа от 2 до 10. Вместо «step_increment» по умолчанию, равного 1, мы используем явное «step_increment», равное 2.

В первой итерации цикла for значение 'loop_ctr' равно 2, что и печатается в ячейке A1. Во второй итерации значение «loop_ctr» становится 4 (более раннее значение: 2 + step_increment: 2), и это число печатается в ячейке A2.

Аналогично, на третьей итерации значение 'loop_ctr' равно 6 (предыдущее значение: 4 + step_increment: 2), и оно печатается в ячейке A3 и так далее.

Написание вложенного цикла For

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

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

Пример 4: Распечатайте числа от 1 до 10 на всех листах в электронной таблице Excel с помощью цикла For Loop.

В этом примере нам нужно напечатать числа от 1 до 10 на всех листах в книге Excel.

Для этого мы можем использовать следующий код:

 Sub ForLoopPrintNumbers () 
Dim loop_ctr As Integer
Dim sheet As Integer

For sheet = 1 To Worksheets.Count
For loop_ctr = 1 To 10
Worksheets (sheet) .Range ("A1"). Offset (loop_ctr - 1, 0) .Value = loop_ctr
Next loop_ctr
Next sheet

MsgBox "Для цикла завершено!"
End Sub

Пояснение:

В этом примере есть два цикла For Loops, один внутри другого. Внешний цикл For выполняет итерацию по переменной «sheet», а внутренний цикл For выполняет итерацию по переменной loop_ctr, которая определяет положение ячейки.

Внутри тела внутреннего цикла For у нас есть оператор, который печатает числа от 1 до 10 на каждом листе (согласно внешнему циклу).

Внешний цикл перебирает все доступные листы в электронной таблице, тогда как внутренний цикл перебирает от A1 до A10 для текущего листа. Это позволяет печатать числа от 1 до 10 на всех доступных листах.

Обратный цикл For в VBA

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

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

Пример 5: Используйте обратный цикл For для печати чисел от 1 до 10 в порядке убывания.

 Sub ReverseForLoop () 
Dim loop_ctr As Integer
Dim cell As Integer
cell = 1

For loop_ctr = 10 To 1 Step -1
ActiveSheet.Range ("A1"). Offset (cell - 1, 0). Значение = loop_ctr
cell = cell + 1
Next loop_ctr

MsgBox «Для цикла завершено!»
End Sub

Пояснение:

В этом примере цикл начинается со значением 'loop_ctr' как 10.И затем, с каждой итерацией, значение счетчика цикла уменьшается на 1 (поскольку «step_increment» равен -1).

Внутри тела цикла For мы печатаем значение переменной счетчика цикла в активном листе из A1: A10.

Бесконечный цикл с использованием цикла For

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

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

Ниже приведен пример бесконечного цикла for:

 'Не запускайте этот код 
Sub InfiniteForLoop ()
Dim loop_ctr As Integer
Dim cell As Integer

For loop_ctr = 1 To 10
ActiveSheet.Диапазон ("A1"). Смещение (loop_ctr - 1, 0) .Value = loop_ctr
loop_ctr = loop_ctr - 1
Next loop_ctr

MsgBox "For Loop Completed!"
End Sub

Оператор 'loop_ctr = loop_ctr - 1' делает вышеупомянутый цикл VBA бесконечным, поскольку он сбрасывает значение loop_ctr при каждой итерации, и, следовательно, условие завершения никогда не достигается.

Совет: Всегда хорошо не вносить никаких изменений в значение переменной счетчика цикла внутри тела цикла.

Как прервать цикл For или выйти из него

Я думаю, многие из вас зададутся вопросом: «Зачем нам нужно разрывать цикл во время выполнения»? Ответ прост: прерывание цикла или выход из него иногда может оптимизировать код и уменьшить накладные расходы на ресурсы.

Чтобы разорвать цикл For, мы можем использовать оператор ‘Exit For’ .

Давайте попробуем увидеть это в действии на примере:

Пример 6: Используйте цикл FOR в VBA, чтобы найти сумму первых 20 нечетных чисел от 1 до 100.

В этом примере мы должны найдите первые 20 нечетных чисел от 1 до 100 и затем вычислите их сумму. Ниже приведен код для этого:

 Sub SumFirst20OddNumbers () 
Dim loop_ctr As Integer
Dim odd_number_counter As Integer
Dim sum As Integer

For loop_ctr = 1 To 100
If (loop_ctr Mod 2 <> 0) Then
sum = sum + loop_ctr
odd_number_counter = odd_number_counter + 1
End If

If (odd_number_counter = 20) Then
Exit For
End If
Next loop_ctr

MsgBox "Сумма верхних 20 конечных суб-9000 и нечетных чисел равна:"

Объяснение:

В этом примере у нас есть три переменные - loop_ctr, odd_number_counter и sum.Переменная loop_ctr используется как счетчик цикла, переменная odd_number_counter содержит количество суммированных нечетных чисел (потому что нам нужно суммировать только первые 20 нечетных чисел), а переменная sum содержит сумму из первых 20 нечетных чисел.

Внутри цикла мы перебираем все числа от 1 до 100, одно за другим (step_increment по умолчанию равен 1), и проверяем, нечетное ли число. Если число нечетное, мы суммируем его и увеличиваем «odd_number_counter» на 1.

После первого блока IF другое условие IF проверяет, равно ли значение переменной «odd_number_counter» 20.Если значение odd_number_counter равно 20, то с помощью оператора Exit For мы выходим из цикла, поскольку нет смысла продолжать цикл дальше.

Несколько практических примеров VBA For Loop

Теперь давайте посмотрим на некоторые практические примеры, где можно использовать For Loop:

Пример 7: Выделите альтернативные строки в электронной таблице с помощью VBA For Loop.

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

 Sub HighlightAlternateRows () 
Dim loop_ctr As Integer
Dim Max As Integer
Dim clm As Integer
Max = ActiveSheet.UsedRange.Rows.Count
clm = ActiveSheet.UsedRange.Columns. Count

For loop_ctr = 1 To Max
If loop_ctr Mod 2 = 0 Then
ActiveSheet.Range (Cells (loop_ctr, 1), Cells (loop_ctr, clm)). Interior.ColorIndex = 28
End If
Next loop_ctr

MsgBox "Для завершения цикла!"
End Sub

Объяснение:

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

Пример 8: Использование VBA For Loop Защита всех листов в книге.

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

Ниже приведен код для этого:

 Sub ProtectWorksheets () 
Dim loop_ctr As Integer
For loop_ctr = 1 To ActiveWorkbook.Worksheets.Count
Worksheets (loop_ctr).Защитить
Next loop_ctr
End Sub

Explanation:

В приведенном выше коде мы используем цикл for VBA и перебираем все листы в открытой книге. Внутри цикла For мы пытаемся защитить текущий экземпляр рабочего листа.

Приведенный выше код также можно использовать для снятия защиты с листов. Просто замените «Рабочие листы (loop_ctr) .Protect» на «Рабочие листы (loop_ctr) .UnProtect».

Пример 9: Цикл по массиву чисел и поиск наибольшего и наименьшего числа из массива.

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

 Sub ForLoopWithArrays () 
Dim arr () As Variant
arr = Array (10, 12, 8, 19, 21, 5, 16)

Dim min_number As Integer
Dim max_number As Integer

min_number = arr (0)
max_number = arr (0)

Dim loop_ctr As Integer
For loop_ctr = LBound (arr) To UBound (arr)
If arr (loop_ctr)> max_number Then
max_number = arr)
End If

If arr (loop_ctr) min_number = arr (loop_ctr)
End If

Next loop_ctr
MsgBox "Наибольшее число:" & max_number _
& "Наименьшее число:" & min End_number

6 

Объяснение:

В приведенном выше коде у нас есть массив чисел, объявленный как переменная arr.В дополнение к этому у нас есть две переменные, min_number и max_number, которые используются для хранения минимального и максимального чисел из массива.

Мы инициализируем переменные min_number и max_number первым элементом массива. Затем внутри цикла For мы перебираем все элементы массива и проверяем -

Если текущее число больше, чем max_number, то устанавливаем значение max_number равным текущему числу. Следующее условие, которое мы проверяем: если текущее число меньше, чем min_number, то установите значение min_number равным текущему числу.

Наконец, мы показываем наибольшее и наименьшее числа внутри массива с помощью msgbox.

VBA For Each Loop

For each - это более сложный тип цикла For Loop. Его можно использовать для итерации коллекции объектов.

Здесь вам не нужно беспокоиться о счетчике цикла, ваша задача - просто передать коллекцию объектов, а сам цикл идентифицирует объекты и выполняет их итерацию.

Синтаксис VBA For Each Loop

Синтаксис For Each Loop очень похож на For Loop.Ниже приведен синтаксис:

 Для каждого элемента В collection_of_items 
'Операторы, которые будут выполняться внутри цикла
Следующий элемент

Здесь' collection_of_items 'относится к группе объектов, которые необходимо перебрать. Если вы укажете один объект для этого параметра, он выдаст «ошибку времени выполнения 438».

«item» определяет объекты внутри «collection_of_items». В любой конкретный момент внутри цикла «item» содержит единственный объект из «collection_of_items».

Как работает цикл For Each

Допустим, у нас есть цикл For Each как:

 For Each cl в ActiveSheet.Range ("A1: A10") 
'Операторы, которые будут выполняться внутри цикла
Next cl
  • Когда программный элемент управления достигает оператора' For Each cl In ActiveSheet.Range ("A1: A10") ', он оценивает объект collection, а затем инициализирует переменную cl первым объектом в коллекции, то есть ячейкой $ A $ 1.
  • После этого он выполняет инструкции внутри цикла.
  • Затем он выбирает второй объект из коллекции и выгружает его в переменную cl. И процесс продолжается до тех пор, пока не будут извлечены все объекты из коллекции.

Блок-схема для каждого цикла в VBA

Давайте попробуем понять поток управления, изображенный на приведенной выше блок-схеме:

  1. Прежде всего, выполняется инструкция FOR EACH и проверяется, есть ли какие-либо элементы в коллекции.
  2. Если в коллекции присутствуют какие-либо элементы, переменная «item» инициализируется первым элементом коллекции, и выполняются операторы внутри цикла «Блок кода». Однако, если условие оценивается как FALSE, поток управления переходит к следующему оператору вне цикла For Each.
  3. Когда выполняется «кодовый блок» внутри цикла For Each, цикл начинает готовиться к следующей итерации. Переменная 'item' повторно инициализируется следующим элементом в коллекции, и цикл продолжается.

Несколько простых примеров VBA для каждого цикла

Теперь перейдем к некоторым простым примерам цикла For Each.

Пример 1. Использование VBA для каждого цикла для отображения имен всех активных рабочих листов.

В этом примере мы будем использовать цикл For Each для итерации по всем рабочим листам в ActiveWorkbook и отображения имен всех листов с помощью поля msg.

 Sub ForEachDisplaySheetNames () 
Dim sheetNames As String
For each sht In ActiveWorkbook.Sheets
sheetNames = sheetNames & vbNewLine & sht.Name
Next sht

MsgBox «Имена листов:" & vbNames

1957 & sheet

Explanation:

В этом примере цикл For Each берет набор листов из ActiveWorkbook.Sheets, затем выполняет итерацию листов один за другим и инициализирует переменную sht текущим экземпляром листа.

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

Пример 2. Использование VBA для каждого цикла для суммирования всех элементов массива.

В этом примере с помощью цикла VBA For Each мы будем повторять массив чисел и находить сумму всех его элементов. Ниже приведен код для этого:

 Sub ForEachSumArrayElements () 
Dim arr As Variant
Dim sum as Integer
arr = Array (1, 10, 15, 17, 19, 21, 23, 27)

для каждого элемента в arr
sum = sum + element
Next element

MsgBox "The Sum is:" & sum
End Sub

Explanation:

В приведенном выше коде мы объявили две переменные, 'arr' и 'sum '.Переменная arr используется для хранения массива чисел, а переменная sum представляет сумму элементов массива.

Внутри цикла For Each мы повторяем элементы массива один за другим, суммируем их и сохраняем итоговую сумму в переменной sum.

Наконец, вне цикла For Each мы показываем сумму элементов массива с помощью окна сообщения.

Пример 3. Использование VBA для каждого цикла для отображения имен всех открытых рабочих книг.

В этом примере, используя цикл For Each, мы переберем все открытые книги и отобразим их имена в окне сообщения.

Ниже приведен код для этого:

 Sub ForEachDisplayWorkbookNames () 
Тусклые имена workBookNames как строка

Для каждой книги в книгах
workBookNames = workBookNames & vbNewLine & wrkbook.Name
Next wrkbook

are & vbNewLine & workBookNames
End Sub

Explanation:

В этом примере цикл For Each берет набор книг, затем выполняет итерацию книг одну за другой и инициализирует переменную wrkbook текущим экземпляром книги.

Внутри блока For Each имя книги для каждой книги добавляется к строке, и, наконец, вне цикла все имена книг отображаются в окне сообщения.

Вложенный VBA для каждого цикла

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

Пример 4: Отображение имен всех открытых книг вместе с соответствующими им листами.

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

Ниже приведен код для этого:

 Sub ForEachLoopNesting () 
Тусклый результат в виде строки
Для каждой книги в рабочих книгах
Для каждого файла в рабочих книгах
result = result & vbNewLine & "Workbook:" & wrkbook.Name & "Рабочий лист:" & sht.Name
Next sht
Next wrkbook

MsgBox result
End Sub

Explanation:

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

Внутри внутреннего блока For Each оператор объединяет имена книг и рабочих листов и сохраняет их в переменной с именем «результат».

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

Как выйти из цикла For Each или выйти из него

Чтобы выйти из цикла For Each, мы можем использовать оператор Exit For. Итак, оператор «Exit For» может прервать как цикл For, так и цикл For Each.

Давайте посмотрим на это на примере:

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

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

 Sub ForEachDisplayFirstThreeSheetNames () 
Dim sheetNames As String
Dim sheetCounter As Integer

For Each sht In ActiveWorkbook.Sheets
sheetNames = sheetNames & vbNewLine & sht.Имя
sheetCounter = sheetCounter + 1

Если sheetCounter> = 3, то
Exit For
End If
Next sht

MsgBox "Имена листов:" & vbNewLine & sheetNames
End Sub

Объяснение: В приведенном выше коде у нас есть цикл For Each, который выполняет итерацию по листам внутри активной книги. Внутри цикла мы добавляем и сохраняем имена листов в переменной sheetNames. Кроме того, у нас есть переменная sheetCounter, которая увеличивается на каждой итерации.

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

Если значение переменной sheetCounter достигло 3, мы выходим из цикла с помощью оператора Exit For. Наконец, мы отображаем значение переменной sheetNames с помощью msgbox.

Цикл «Выполнить во время» VBA

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

Синтаксис цикла Do while в VBA

Цикл Do while имеет два синтаксиса в VBA, а именно:

Синтаксис 1:

 Условие Do While 
'Операторы, которые должны выполняться внутри цикла
Loop

Или

Синтаксис 2:

 Do 
'Операторы, которые должны выполняться внутри цикла
Loop While condition

В обоих синтаксисах «условие» используется в качестве основы цикла.На каждой итерации оператор «Пока» проверяет, оценивается ли «условие» как «Истина» или «Ложь». Если «условие» истинно, цикл продолжается; в противном случае цикл завершается.

Прежде всего, давайте попробуем понять разницу между этими двумя синтаксисами.

Разница между двумя синтаксисами Do while

Как мы видим в первом синтаксисе цикла do-while, «условие» проверяется как первая инструкция. Это означает, что если условие ложно, цикл do-while в синтаксисе 1 не будет выполнять никаких итераций.

Тогда как во втором синтаксисе «условие» проверяется как последний оператор внутри цикла. Это означает, что даже если условие ложно, цикл do-while в синтаксисе 2 выполнит как минимум 1 итерацию. Только после этого условие будет оценено, и следующей итерации не будет.

Итак, синтаксис 2 гарантирует наличие как минимум одной итерации независимо от того, истинно или ложно условие.

Теперь давайте попробуем понять, как работает цикл do-while.

Как работает цикл Do While

Синтаксис 1-

Допустим, у нас есть цикл Do While следующим образом:

 Dim loop_ctr as Integer 
loop_ctr = 1
Do While loop_ctr <10
' выполняется внутри цикла
loop_ctr = loop_ctr + 1
Цикл
  • В первых двух операторах переменная loop_ctr объявляется и инициализируется как 1.
  • Когда программный элемент управления достигает оператора «Do While loop_ctr <10», он проверяет, меньше ли значение «loop_ctr» 10.
  • Если значение «loop_ctr» меньше 10, операторы внутри тела цикла выполняются последовательно, и, наконец, 'loop_ctr' увеличивается на 1.
  • После этого управление снова переходит к циклу «Do While loop_ctr <10», и цикл продолжается до значения 'loop_ctr' становится равным 10.
  • Когда значение 'loop_ctr' становится равным 10, тогда условие do while не выполняется, и управление переходит к следующему оператору после цикла do-while.

Синтаксис 2 -

Допустим, у нас есть цикл Do While следующим образом:

 Dim loop_ctr as Integer 
loop_ctr = 1
Do
'Операторы, которые должны выполняться внутри цикла
loop_ctr = loop_ctr + 1
Loop While loop_ctr <10
  • В первых двух операторах переменная 'loop_ctr' объявляется и инициализируется как 1.
  • Когда программный элемент управления достигает оператора "Do", поскольку нет никаких проверок (например, синтаксис 1), он просто входит в цикл и начинает выполнять операторы внутри цикла один за другим и увеличивает 'loop_ctr' на 1.
  • После выполнения операторов внутри тела цикла он проверяет, меньше ли 'loop_ctr' 10. Если значение 'loop_ctr' меньше 10, начинается другая итерация.
  • Если значение 'loop_ctr' становится равным 10, то условие do while не выполняется, и управление переходит к следующему оператору после цикла do-while.

Примечание: Во втором синтаксисе цикл Do-While Loop всегда повторяется как минимум один раз, поскольку проверяемое условие помещается в конец цикла.

Блок-схема цикла Do While в VBA:

Давайте попробуем понять поток управления, изображенный на приведенной выше блок-схеме:

Синтаксис 1 -

  1. В этом синтаксисе Do-While цикл Условие проверяется вместе с оператором Do.
  2. Если условие истинно, то выполняется «блок кода» внутри цикла do-while, и начинается следующая итерация. Каждая итерация перед началом проверяет условие цикла, а «блок кода» внутри цикла do-while выполняется только тогда, когда условие оценивается как истинное.
  3. Когда условие цикла становится ложным, больше не происходит итераций цикла, и поток управления переходит к следующему оператору вне цикла Do While.

Синтаксис 2 -

  1. В этом синтаксисе Do-While условие цикла не проверяется вместе с оператором Do.
  2. Так как для первой итерации условие не проверяется. Следовательно, выполняется блок кода внутри тела do-while.
  3. После первой итерации каждая последующая итерация перед началом проверяет условие цикла, и «блок кода» внутри цикла do-while выполняется только тогда, когда условие оценивается как истинное.
  4. Когда условие цикла становится ложным, больше не происходит итераций цикла, и поток управления переходит к следующему оператору вне цикла Do While.

Несколько простых примеров цикла «Выполнить во время» в VBA

Пример 1. Использование цикла «Выполнить во время» в VBA для печати чисел от 1 до 10 в Excel.

В этом примере у нас есть диапазон «A1: A10», и мы должны заполнить этот диапазон числами от 1 до 10. Для этого мы можем использовать следующий код:

 Sub DoWhileLoopPrintNumbers () 
Dim loop_ctr As Integer
loop_ctr = 1

Do While loop_ctr <= 10
ActiveSheet.Диапазон ("A1"). Смещение (loop_ctr - 1, 0) .Value = loop_ctr
loop_ctr = loop_ctr + 1
Loop

MsgBox ("Loop Ends")
End Sub

Пояснение:

In the В приведенном выше коде мы объявили и инициализировали переменную loop_ctr для нашего цикла Do While. Затем, наряду с оператором Do while, у нас есть условие для запуска цикла до тех пор, пока значение 'loop_ctr' не станет меньше или равно 10.

Внутри тела цикла Do While мы написали код для записи 'loop_ctr 'значение на листе Excel в столбце A.

После этого идет оператор, увеличивающий «loop_ctr» для следующей итерации.

Пример 2: Используйте цикл Do While в VBA, чтобы найти сумму всех чисел от 1 до 20.

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

Для этого мы можем использовать следующий код:

 Sub WhileLoopSumNumbers () 
Dim loop_ctr As Integer
Dim result As Integer
loop_ctr = 1
result = 0

Do While loop_ctr <= 20
result = result + loop_ctr
loop_ctr = loop_ctr + 1
Loop

MsgBox "Сумма чисел от 1 до 20 равна:" & result
End Sub

Explanation:

В приведенном выше коде мы объявили счетчик цикла loop_ctr для наш цикл Do While.Затем мы объявили другую целочисленную переменную как «результат» для хранения суммы чисел от 1 до 20.

После этого, вместе с оператором Do while, у нас есть условие для запуска цикла до тех пор, пока значение «loop_ctr» не станет равным. меньше или равно 20.

Внутри тела цикла Do While Loop мы добавили значение loop_ctr вместе с результатом. Это означает, что на первой итерации значение результата будет: 1, а на второй итерации будет: (1 + 2) = 3. Точно так же на третьей итерации значение будет: (3 + 3 ) = 6 и так далее.

После этого идет оператор, увеличивающий «loop_ctr» для следующей итерации.

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

Пример 3: Показать уникальное поведение цикла Do While Loop (в синтаксисе 2) для выполнения хотя бы один раз, даже если проверяемое условие - False.

 Sub DoWhileLoopTest () 
Dim loop_ctr As Integer
loop_ctr = 100

Do
MsgBox "Счетчик циклов:" & loop_ctr
loop_ctr = loop_ctr + 1
Loop While loop_ctr <= 10

0003 92 End Subplanation

В приведенном выше примере мы инициализировали 'loop_ctr' как 100 и внутри условия цикла мы проверяем 'loop_ctr <10'.Это означает, что цикл предназначен только для итерации, когда значение «loop_ctr» меньше 10. Но вы заметите, что, несмотря на условие, этот цикл do-while выполняется один раз.

Причина этого: согласно синтаксису 2 цикла Do While нет возможности проверить условия в начале цикла. Вы можете проверить условия только в конце цикла.

Примечание: Мы можем решить эту проблему, просто используя цикл DoWhile в синтаксисе 1, как показано:

 Sub DoWhileLoopTest () 
Dim loop_ctr As Integer
loop_ctr = 100

Do While loop_ctr <= 10
MsgBox "Loop Counter: "& loop_ctr
loop_ctr = loop_ctr + 1
Loop

End Sub

Написание вложенного цикла Do While

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

Пример 4: Распечатайте числа от 1 до 10 на всех листах в электронной таблице Excel с помощью цикла «Выполнить пока».

В этом примере нам нужно напечатать числа от 1 до 10 на всех листах в книге Excel, используя цикл do-while. Для этого мы можем использовать следующий код:

 Sub NestedDoWhileLoop () 
Dim loop_ctr As Integer
Dim sheet As Integer
sheet = 1

Do While sheet <= Worksheets.Count
loop_ctr = 1
Do While loop_ctr <= 10
Рабочие листы (лист) .Range ("A1"). Offset (loop_ctr - 1, 0). Value = loop_ctr
loop_ctr = loop_ctr + 1
Loop
sheet = sheet + 1
Loop

MsgBox «Вложенный цикл, пока цикл завершен!»
End Sub

Пояснение:

В этом примере есть два цикла Do While, один внутри другого. Внешний цикл Do While Loop выполняет итерацию по переменной «лист» и повторяется до тех пор, пока значение переменной «лист» не станет меньше или равно значению «Рабочие листы.Count '(то есть общее количество листов в книге).

Внутренний цикл Do While Loop выполняет итерацию по переменной loop_ctr и повторяется до тех пор, пока значение loop_ctr не станет меньше или равно 10. Это помогает нам печатать числа в последовательности.

Внутри тела внутреннего цикла Do While у нас есть оператор, который печатает числа от 1 до 10 на каждом листе (согласно внешнему циклу).

Внешний цикл перебирает все доступные листы рабочих листов в электронной таблице, тогда как внутренний цикл перебирает числа от 1 до 10 для текущего листа.

Это позволяет печатать числа от 1 до 10 на всех доступных листах.

Бесконечный цикл с использованием цикла Do While

В отличие от цикла For, цикл Do While Loop не имеет четких «start», «end» или «step_increments», поэтому очень легко допустить логические ошибки, приводящие к бесконечному или бесконечный цикл. Ниже приведен пример бесконечного цикла Do While:

 'Не запускайте этот код 
Sub InfiniteDoWhileLoop ()
Dim loop_ctr As Integer
loop_ctr = 1

Do While loop_ctr <= 10
ActiveSheet.Диапазон ("A1"). Смещение (loop_ctr - 1, 0) .Value = loop_ctr
Loop

MsgBox ("Loop Ends")
End Sub

В приведенном выше коде мы просто пропустили строку для увеличения счетчик цикла, то есть 'loop_ctr = loop_ctr + 1', и это сделало цикл бесконечным, потому что значение 'loop_ctr' всегда будет 1 (поскольку оно никогда не увеличивается) и, следовательно, условие цикла 'While loop_ctr <= 10' всегда будет оценивать к истине.

Подсказка: Всегда рекомендуется использовать цикл For Each или For Next вместо цикла Do While или Do until (когда это возможно).

Как выйти из цикла Do While или выйти из него

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

Давайте посмотрим на это на примере:

Пример 5: Используйте цикл Do While в VBA, чтобы найти сумму первых 15 нечетных чисел от 1 до 100.

В этом примере мы должны найти первое 15 нечетных чисел от 1 до 100, а затем вычислить их сумму.Ниже приведен код для этого:

 Sub SumFirst15OddNumbers () 
Dim loop_ctr As Integer
Dim odd_number_counter As Integer
Dim sum As Integer

loop_ctr = 1

Do While loop_ctr <= 100
If (loop_ctr ) Тогда
sum = sum + loop_ctr
odd_number_counter = odd_number_counter + 1
End If

If (odd_number_counter = 15) Then
Exit Do
End If

loop_ctr = loop_ctr Sum + 1
Loop2 числа: "& sum
End Sub

Объяснение:

" В этом примере у нас есть три переменные - 'loop_ctr', 'odd_number_counter' и 'sum'.loop_ctr - это переменная счетчика цикла, переменная odd_number_counter содержит счетчик нечетных чисел, которые были суммированы, а переменная sum содержит сумму первых 15 нечетных чисел.

Внутри цикла Do While мы перебираем все числа от 1 до 100, одно за другим, и проверяем, нечетное ли число. Если число нечетное, мы суммируем его и увеличиваем «odd_number_counter» на 1.

После первого блока IF другое условие IF проверяет, равно ли значение переменной «odd_number_counter» 15.Если значение odd_number_counter равно 15, то при использовании оператора Exit Do мы прерываем цикл, поскольку нет смысла продолжать цикл дальше.

Наконец, мы отображаем значение переменной 'sum' с помощью msgbox.

VBA Цикл «До тех пор, пока»

Цикл «До тех пор» очень похож на цикл «Выполнить пока»; единственное различие между ними состоит в том, что -

  • Цикл do-while повторяется, пока выполняется определенное условие.
  • С другой стороны, цикл «do-until» повторяется до тех пор, пока условие не перестанет быть истинным.

Давайте попробуем понять эту разницу простыми словами:

Для экземпляра: если мы хотим написать цикл Do Loop с итерацией от 1 до 10, с ключевым словом while, условием будет 'Do While loop_ctr <= 10' и с ключевым словом until, то же условие можно записать как «До тех пор, пока loop_ctr> 10».

Что означает:

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

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

Теперь давайте посмотрим на синтаксис Do until Loop.

Синтаксис цикла Do до цикла в VBA

Подобно циклу Do While, метод Do until также имеет два синтаксиса:

Синтаксис 1 -

 Условие Do до 
'Операторы, которые должны выполняться внутри цикла
Loop

Или

Синтаксис 2 -

 Do 
'Операторы, которые должны выполняться внутри цикла
Цикл до состояния

Здесь «условие» используется как основа цикла, так же, как в случае цикла Do While Loop.На каждой итерации оператор «Пока» проверяет, оценивается ли «условие» как «Истина» или «Ложь». Если «условие» равно False, цикл продолжается. В противном случае цикл заканчивается.

Теперь давайте попробуем понять разницу между этими двумя синтаксисами.

Разница между двумя синтаксисами Do until

Как мы видим в первом синтаксисе цикла do until, «условие» проверяется как первая инструкция. Это означает, что если условие истинно, цикл do-until в синтаксисе 1 не будет выполнять никаких итераций.

Тогда как во втором синтаксисе «условие» проверяется как последний оператор внутри цикла. Это означает, что даже если условие истинно, цикл do-until в синтаксисе 2 выполнит как минимум 1 итерацию. Только после этого условие будет оценено, и следующей итерации не будет.

Итак, синтаксис 2 гарантирует наличие как минимум одной итерации независимо от того, истинно или ложно условие.

Как работает цикл «До тех пор»

Синтаксис 1 -

Допустим, у нас есть цикл «До тех пор», как показано ниже:

 Dim loop_ctr As Integer 
loop_ctr = 1
Do until loop_ctr> 10
'Выполняемые операторы внутри цикла
loop_ctr = loop_ctr + 1
Цикл
  • В первых двух операторах переменная loop_ctr объявляется и инициализируется как 1.
  • Когда программный элемент управления достигает оператора «Do until loop_ctr> 10», он проверяет, больше ли значение «loop_ctr» 10.
  • Если значение «loop_ctr» меньше или равно 10, операторы внутри тела цикла выполняются последовательно, и, наконец, 'loop_ctr' увеличивается на 1.
  • После этого элемент управления снова перемещается, чтобы проверить условие «До тех пор, пока loop_ctr> 10», и цикл продолжается до значения of 'loop_ctr' меньше или равно 10.

Синтаксис 2 -

 Dim loop_ctr As Integer 
loop_ctr = 1
Do
'Операторы, которые должны выполняться внутри цикла
loop_ctr = loop_ctr + 1
Loop until loop_ctr> 10
  • В первых двух операторах, переменная 'loop_ctr' объявляется и инициализируется как 1.
  • Когда программный элемент управления достигает оператора Do, он просто переходит к следующему оператору, поскольку оператор Do не заставляет программу проверять какое-либо условие.
  • После этого в следующем операторе переменная loop_ctr увеличивается на 1.
  • Затем оператор «Цикл до loop_ctr> 10» проверяет, больше ли значение «loop_ctr» 10 или нет. Если оно меньше или равно 10, то управление программой снова переходит к оператору Do, но если значение 'loop_ctr' больше 10, цикл завершается, и управление программой переходит к следующему оператору.

Примечание. Синтаксис 2 цикла Do until Loop всегда повторяется как минимум один раз, поскольку условие, которое необходимо проверить, помещается в конец цикла.

Блок-схема цикла Do-until в VBA

Давайте попробуем понять поток управления, изображенный на приведенной выше блок-схеме:

Синтаксис 1 -

  1. В этом синтаксисе Do-until проверяется условие цикла вместе с оператором Do.
  2. Если условие ложно, то выполняется «блок кода» внутри цикла do-until, и начинается следующая итерация. Каждая итерация перед началом проверяет условие цикла, и «блок кода» внутри цикла do-until выполняется только тогда, когда условие оценивается как ложное.
  3. Когда условие цикла становится истинным, итераций цикла больше не происходит, и поток управления переходит к следующему оператору вне цикла Do until.

Синтаксис 2 -

  1. В этом синтаксисе Do-until условие цикла - не проверено вместе с оператором Do.
  2. Так как для первой итерации условие не проверяется. Следовательно, блок кода внутри тела do-until будет выполнен.
  3. После первой итерации каждая последующая итерация перед началом проверяет условие цикла, и «блок кода» внутри цикла do-until выполняется только тогда, когда условие оценивается как ложное.
  4. Когда условие цикла становится истинным, итераций цикла больше не происходит, и поток управления переходит к следующему оператору вне цикла Do until.

Несколько простых примеров цикла «До тех пор, пока» в VBA

Пример 1. Распечатайте числа от 1 до 10 в Excel с помощью цикла «Выполнить до» в VBA.

В этом примере у нас есть диапазон «A1: A10», и мы должны заполнить этот диапазон числами от 1 до 10. Для этого мы можем использовать следующий код:

 Sub DoUntilLoopPrintNumbers () 
Dim loop_ctr As Integer
loop_ctr = 1

Do until loop_ctr <10
ActiveSheet.Диапазон ("A1"). Смещение (loop_ctr - 1, 0) .Value = loop_ctr
loop_ctr = loop_ctr + 1
Loop

MsgBox ("Loop Ends")
End Sub

Пояснение:

In the Приведенный выше код, прежде всего, мы объявили и инициализировали переменную loop_ctr для нашего цикла Do until. Затем, наряду с оператором Do until, у нас есть условие для запуска цикла до тех пор, пока значение loop_ctr не станет больше 10.

Внутри тела цикла Do till мы написали код для записи значения loop_ctr в Excel в столбце A.

После этого идет оператор, увеличивающий «loop_ctr» для следующей итерации. Как только значение переменной loop_ctr станет больше 10, цикл завершится.

Пример 2: Используйте цикл Do до тех пор в VBA, чтобы найти сумму всех чисел от 1 до 20.

В этом примере, используя цикл do until, мы переберем все числа от 1 до 20 и суммируем их. Наконец, мы будем отображать на экране сумму чисел от 1 до 20.Для этого мы можем использовать следующий код:

 Sub DoUntilLoopSumNumbers () 
Dim loop_ctr As Integer
Dim result As Integer
loop_ctr = 1
result = 0

Do until loop_ctr> 20
result = result + loop_ctr
loop_rctr = loop_ctr = loop_ctr + 1
Loop

MsgBox "Сумма чисел от 1 до 20 равна:" & result
End Sub

Explanation:

В приведенном выше коде мы объявили счетчик цикла 'loop_ctr' для нашего действия до петля.Затем мы объявили другую целочисленную переменную как «результат» для хранения суммы чисел от 1 до 20.

После этого, наряду с оператором «До тех пор», у нас есть условие для запуска цикла до тех пор, пока «loop_ctr» не станет больше. чем 20.

Внутри тела цикла Do until Loop мы добавили значение loop_ctr вместе с результатом. Это означает, что на первой итерации значение результата будет: 1, а на второй итерации: (1 + 2) = 3; аналогично, на третьей итерации значение будет: (3 + 3) = 6 и так далее.

После этого идет оператор, увеличивающий «loop_ctr» для следующей итерации.

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

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

 Sub DoUntilLoopTest () 
Dim loop_ctr As Integer
loop_ctr = 100

Do
MsgBox «Счетчик циклов:» & loop_ctr
loop_ctr = loop_ctr + 1
Цикл до loop_ctr> 10 91


End Sub

В приведенном выше примере мы инициализировали 'loop_ctr' как 100 и внутри условия цикла мы проверяем 'loop_ctr> 10'.Это означает, что цикл предназначен только для итерации, когда значение «loop_ctr» меньше 10. Но вы заметите, что, несмотря на условие, этот цикл do-until выполняется один раз.

Причина этого заключается в следующем: согласно синтаксису 2 цикла Do until, нет возможности проверить условия в начале цикла. Условие можно проверить только в конце цикла.

Примечание: Мы можем решить эту проблему, просто используя цикл Do until в синтаксисе 1, как показано:

 Sub DoUntilLoopTest () 
Dim loop_ctr As Integer
loop_ctr = 100

Do until loop_ctr> 10
MsgBox "Счетчик циклов : "& loop_ctr
loop_ctr = loop_ctr + 1
Loop
End Sub

Написание вложенного цикла Do до Loop

Подобно другим циклам вложение очень возможно в цикле Do Until Loop.Давайте посмотрим, как написать вложенный цикл «До тех пор»:

Пример 4: Распечатайте числа от 1 до 5 на всех листах в электронной таблице Excel, используя цикл «До тех пор».

В этом примере нам нужно напечатать числа от 1 до 5 на всех листах в книге Excel, используя цикл do until. Для этого мы можем использовать следующий код:

 Sub NestedDoUntilLoop () 
Dim loop_ctr As Integer
Dim sheet As Integer
sheet = 1

Do until sheet> Worksheets.Счетчик
loop_ctr = 1
До тех пор, пока loop_ctr> 5
Рабочие листы (лист). Диапазон ("A1"). Смещение (loop_ctr - 1, 0). Value = loop_ctr
loop_ctr = loop_ctr + 1
Loop
sheet = sheet + 1
Loop

MsgBox «Вложенная операция до завершения цикла!»
End Sub

Пояснение:

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

Inner Do until Loop выполняет итерацию по переменной loop_ctr и повторяется до тех пор, пока значение loop_ctr не станет больше 5. Это помогает нам печатать числа в последовательности.

Внутри тела цикла Inner Do until у нас есть оператор, который печатает числа от 1 до 5 на каждом листе (согласно внешнему циклу).

Внешний цикл перебирает все доступные рабочие листы в электронной таблице, тогда как внутренний цикл перебирает числа от 1 до 5 для текущего листа.

Это позволяет печатать числа от 1 до 5 на всех доступных листах.

Бесконечный цикл с использованием цикла «До тех пор, пока»

Синтаксически цикл «До тех пор, пока не будет» сильно отличается от цикла «Для», поскольку он не обеспечивает четких значений «start», «end» или «step_increments», поэтому его очень легко сделать логическим. ошибки, приводящие к бесконечному или бесконечному циклу.

Ниже приведен пример бесконечного цикла «До тех пор»:

 'Не запускайте этот код 
Sub InfiniteDoUntilLoop ()
Dim loop_ctr As Integer
loop_ctr = 1

Do until loop_ctr> 10
ActiveSheet.Диапазон ("A1"). Смещение (loop_ctr - 1, 0) .Value = loop_ctr
Loop

MsgBox ("Loop Ends")
End Sub

В приведенном выше коде мы просто пропустили строку для увеличения счетчик цикла, то есть 'loop_ctr = loop_ctr + 1', и это сделало цикл бесконечным, потому что значение 'loop_ctr' всегда будет 1 (поскольку оно никогда не увеличивается), и, следовательно, условие цикла 'Пока loop_ctr> 10' всегда будет оцениваться как ложный.

Подсказка: Всегда рекомендуется использовать цикл For Each или For Next вместо цикла Do While или Do until (когда это возможно).

Как прервать или выйти из цикла «До тех пор»

Подобно циклу «До тех пор», из цикла «До тех пор» можно выйти с помощью оператора Exit Do . Как только механизм VBA выполняет оператор Exit Do, он выходит из цикла и переходит к следующему оператору после цикла Do until.

Давайте посмотрим на это на примере:

Пример 5: Используйте цикл Do until в VBA, чтобы найти сумму первых 20 четных чисел от 1 до 100.

В этом примере мы должны найти первые 20 четные числа от 1 до 100, а затем вычислить их сумму.

Ниже приведен код для этого:

 Sub SumFirst20EvenNumbers () 
Dim loop_ctr As Integer
Dim even_number_counter As Integer
Dim sum As Integer

loop_ctr = 1

Do loop_ctr <100
Mod 2 (loop ) Тогда
сумма = сумма + loop_ctr
even_number_counter = even_number_counter + 1
End If

If (even_number_counter = 20) Then
Exit Do
End If

loop_ctr = loop_ctr + 1
Loop 9000g3 Top 9000g3 числа: "& sum
End Sub

Объяснение:

" В этом примере у нас есть три переменные - 'loop_ctr', 'even_number_counter' и 'sum'.'loop_ctr' - это переменная счетчика цикла, переменная 'even_number_counter' содержит количество суммированных четных чисел (потому что нам нужно только суммировать первые 20 четных чисел), а переменная sum содержит сумму первых 20 четных чисел. .

Внутри цикла «До тех пор» мы перебираем все числа от 1 до 100, одно за другим, и проверяем, четное ли число. Если число четное, мы суммируем его и увеличиваем счетчик четных_числов на 1.

После первого блока ЕСЛИ другое условие ЕСЛИ проверяет, равно ли значение переменной «четное_число_счетчик» 20.Если значение «even_number_counter» равно 20, то, используя оператор «Exit Do», мы прерываем цикл, поскольку нет смысла запускать цикл дальше.

В то время как цикл Wend в VBA (устаревший)

Хотя цикл Wend был добавлен в VBA только для обеспечения обратной совместимости, Microsoft рекомендует использовать цикл Do While Loop вместо цикла While Wend Loop.

Хотя цикл Wend Loop не так структурирован и гибок, как цикл Do While Loop, он также не поддерживает идею преждевременного выхода из цикла.

Совет: Если вы изучаете циклы в VBA, вы можете пропустить эту тему. Однако, если вы имеете дело с устаревшим кодом с операторами While Wend, я бы порекомендовал вам изменить их и вместо этого начать использовать циклы Do while.

Синтаксис цикла While Wend

Синтаксис цикла While Wend Loop выглядит следующим образом:

 Условие 
«Операторы, которые должны выполняться внутри цикла»
Wend

«условие» используется в качестве основы цикла. На каждой итерации оператор While проверяет, оценивается ли «условие» как «Истина» или «Ложь».Если «условие» истинно, цикл продолжается; в противном случае цикл завершается.

Пример: напишите цикл While Wend для печати чисел от 1 до 10.

Для этого мы можем написать следующий код:

 Sub WhileWendExample () 
Dim loop_ctr As Integer
loop_ctr = 1

While loop_ctr <= 10
ActiveSheet.Range ("A1"). Смещение (loop_ctr - 1, 0) .Value = loop_ctr
loop_ctr = loop_ctr + 1
Wend

MsgBox "Loop Ends!"
End Sub

Объяснение:

В приведенном выше коде, прежде всего, мы объявляем и инициализируем переменную счетчика цикла 'loop_ctr' как 1.Далее идет оператор While вместе с условием «While loop_ctr <= 10».

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

Цикл в приведенном выше примере повторяется 10 раз, после чего значение 'loop_ctr' становится 11, и, следовательно, условие цикла становится ложным, и управление переходит к оператору после цикла while when.

Наконец, сообщение "Loop Ends!" отображается на экране, чтобы уведомить пользователя о завершении цикла.

Как написать код VBA в Excel

Код VBA можно добавить в электронную таблицу с помощью редактора Visual Basic. Чтобы открыть редактор Visual Basic в Excel, выполните следующие действия:

  • Если вы работаете в Windows, нажмите клавиши (ALT + F11). Если вы используете MAC, нажмите клавиши ( Opt + F11). Откроется редактор Visual Basic .
  • После открытия редактора Visual Basic. Перейдите в «Вставить» и нажмите «Модуль», как показано на изображении. Это вставит объект модуля для вашей книги.
  • Теперь вы можете скопировать и вставить приведенные выше коды в модуль и запустить их с помощью кнопки выполнения, как показано.

Советы по отладке

  • Используйте клавишу F5 для запуска кода.
  • Используйте клавишу F9, чтобы вставить или удалить точку останова.
  • Используйте клавишу F8, чтобы «перейти» или запустить код построчно.Его можно использовать для отладки кода и выполнения его построчно.

Итак, это все о циклах VBA. Сообщите нам, если у вас возникнут какие-либо вопросы, связанные с этой темой.

Рекомендуемая литература

Do ... Оператор цикла (VBA) | Документы Microsoft

  • 2 минуты на чтение

В этой статье

Повторяет блок операторов, пока условие не станет True или пока условие не станет True .

Синтаксис

До [{ В то время как | До } условие ]
[ операторов ]
[ Exit Do ]
[ операторов ]
Цикл

Или вы можете использовать этот синтаксис:

Do
[ операторов ]
[ Exit Do ]
[ операторов ]
Цикл [{ While | до } состояние ]

Синтаксис оператора Do Loop состоит из следующих частей:

Часть Описание
состояние Необязательно.Числовое выражение или строковое выражение, которое имеет значение True или False . Если условие имеет значение Null, условие обрабатывается как False .
ведомости Одно или несколько операторов, которые повторяются пока или до тех пор, пока условие не будет Истинно .

Примечания

Любое количество операторов Exit Do может быть размещено в любом месте цикла Do… Loop в качестве альтернативного способа выхода из цикла Do… Loop . Exit Do часто используется после оценки некоторого условия, например If… Then , и в этом случае оператор Exit Do передает управление оператору, следующему сразу за циклом Loop .

При использовании во вложенных операторах Do… Loop , Exit Do передает управление циклу, который находится на один уровень вложенности выше цикла, в котором происходит Exit Do .

Пример

В этом примере показано, как Do.Можно использовать операторы ..Loop . Внутренний оператор Do ... Loop повторяется 10 раз, спрашивает пользователя, следует ли ему продолжать работу, устанавливает значение флага False , когда они выбирают Нет , и преждевременно завершает работу с помощью Exit Do утверждение. Внешний цикл завершается сразу после проверки значения флага.

  Public Sub LoopExample ()
    Проверка тусклости как логическое значение, счетчик до длины, всего до длины
    Check = True: Counter = 0: Total = 0 'Инициализировать переменные.Сделайте внешнюю петлю.
        Счетчик Do while <20 футов внутренней петли
            Счетчик = Счетчик + 1 'Счетчик приращения.
            Если Counter Mod 10 = 0, то 'Проверяйте пользователя каждые 10.
                Check = (MsgBox ("Продолжить?", VbYesNo) = vbYes) 'Остановить, когда пользователь нажмет на "Нет"
                If Not Check Then Exit Do 'Выход из внутреннего цикла.
            Конец, если
        Петля
        Total = Total + Counter 'Exit Do Lands here.
        Счетчик = 0
    Loop until Check = False 'Немедленный выход из внешнего цикла.MsgBox «Подсчитано до:» & Всего
Конец подписки
  

См. Также

Поддержка и отзывы

У вас есть вопросы или отзывы об Office VBA или этой документации? См. Раздел Поддержка и отзывы Office VBA, чтобы узнать, как получить поддержку и оставить отзыв.

Циклы For Next и For each Next для VBA в Excel

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

Уровень квалификации: Средний

Возможности циклов VBA

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

Можете ли вы вспомнить несколько задач, в которых вам приходилось повторять один и тот же процесс снова и снова?

Эти задачи могут быть чрезвычайно трудоемкими и НАПОМИНАТЕЛЬНЫМИ!

К счастью, выход есть. Мы можем использовать циклы в наших макросах VBA, чтобы очень быстро повторяли действия . Задачи, выполнение которых вручную может занять несколько часов, можно выполнить за считанные секунды с помощью цикла.

Цикл For Next Loop - это наиболее распространенный тип цикла, который помогает нам выполнять эти повторяющиеся задания.В этой статье мы рассмотрим два типа циклов For Next Loops.

Загрузить файл примера

Загрузите бесплатный файл Excel, содержащий примеры макросов с циклом For Next Loop.

для макроса VBA следующего цикла Examples.xlsm (79,0 КБ)

Загрузите PDF-версию статьи для печати.

Описание цикла For Next и каждого цикла для VBA Excel - Excel Campus.pdf (490,5 КБ)

Как работает цикл For Next?

Цикл For Next Loop позволяет нам просматривать коллекцию элементов в Excel.Коллекция может быть набором объектов или списком чисел.

Примеры коллекций объектов включают:

  • Ячейки в ассортименте.
  • Рабочие листы в рабочей тетради.
  • Откройте книги на компьютере.
  • Сводные таблицы на листе.
  • Сводные поля в сводной таблице.
  • Фигуры на листе.
  • И любой другой объект, с которым вы взаимодействуете в Excel.

Задача цикла For Next Loop - выполнять одни и те же действия (строки кода) над каждым элементом в коллекции.

Пример ниже содержит цикл For Next Loop, который просматривает каждый рабочий лист в книге и отображает каждый лист. Цикл начинается с первого элемента в коллекции (первый лист в книге) и выполняет строку (строки) кода между строками For и Next для каждого элемента в коллекции (каждого листа в книге).

 Sub Unhide_Multiple_Sheets ()

Dim ws как рабочий лист

Для каждой страницы в ActiveWorkbook.Worksheets
ws.Visible = xlSheetVisible
Следующий ws

Концевой переводник 

Конечно, мы можем использовать логические операторы, такие как операторы If, для проверки свойств и условий перед выполнением действий. Следующий макрос отображает только те листы, на которых есть фраза «ABC Global Co.». в ячейке A1 каждого листа и скрывает все остальные листы.

 Sub Unhide_Report_Sheets ()

Dim ws как рабочий лист

Для каждой страницы в ActiveWorkbook.Worksheets
Если ws.Range ("A1"). Value = "ABC Global Co." Потом
ws.Visible = xlSheetVisible
Еще
ws.Visible = xlSheetHidden
Конец, если
Следующий ws

Концевой переводник 

Два типа циклов For Next

На самом деле существует два типа циклов For Next Loops.

  1. Для каждого следующего цикла перебирает коллекцию элементов.
  2. For Next Loops перебирает набор чисел.

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

Цикл для каждого следующего цикла: цикл по коллекции элементов

Как мы видели выше, цикл For Each Next позволяет нам перебирать коллекцию элементов или объектов.Это, вероятно, самый распространенный цикл, который мы используем в Excel, потому что мы работаем с коллекциями объектов. Опять же, эти коллекции представляют собой ячейки в диапазоне, листы в книге, сводные таблицы в листе и т. Д.

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

Есть 4 основных шага для написания цикла For Each Next в VBA:

  1. Объявить переменную для объекта.
  2. Напишите для каждой строки ссылки на переменные и коллекции.
  3. Добавить строку (и) кода для повторения для каждого элемента в коллекции.
  4. Напишите следующую строку, чтобы замкнуть цикл.

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

Шаг 1. Объявление переменной для объекта

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

Строка Dim в верхней части макроса объявляет переменную как объект.В этом случае объект представляет собой рабочий лист. Мы можем создать любое имя переменной, какое захотим, если оно не совпадает с другой ссылкой в ​​VBA. «Ws» - это наиболее распространенное имя переменной для объекта рабочего листа, но вы можете это изменить.

 Dim ws как рабочий лист 
Шаг 2 - Для каждой строки

Затем мы напишем оператор For Each. Это первая строка кода в цикле.

 для каждой страницы в ActiveWorkbook.Worksheets 

Первые два слова - для каждого .Затем мы вводим имя переменной, за которым следует слово In Наконец, мы указываем, где существует коллекция. В этом случае мы хотим просмотреть все рабочие листы в ActiveWorkbook. Итак, набираем ActiveWorkbook.Worksheets . Эта строка ссылается на все рабочие листы в ActiveWorkbook.

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

 для каждого ws в книгах ("Book2.xlsx "). Листы 

Просто помните, что книга, на которую вы ссылаетесь, должна быть открыта перед запуском строки кода For Next. Конечно, мы также можем использовать метод Workbooks.Open, чтобы открыть книгу.

Шаг 3 - Добавление кода для повторения для каждой итерации

После строки For Each мы добавляем строку (и) кода, который будет выполняться на каждом листе. В этом примере у нас есть только одна строка кода, которая показывает лист.

 ws.Visible = xlSheetVisible 

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

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

 Set ws = Рабочие листы (1) 

Однако, нам НЕ нужна эта строка с For Each Next Loop . Цикл заботится об установке переменной для нас для каждой итерации в цикле.

Для первой итерации цикла ws устанавливается равным Worksheets (1).На следующей итерации ws устанавливается на Worksheets (2). Это продолжается, пока цикл проходит по всем листам в книге. Это очень мощно, потому что мы можем повторно использовать переменную для ссылки на рабочий лист несколько раз в цикле.

Шаг 4 - Следующая строка возвращается назад

Последняя строка кода в цикле - это строка Next .

 Далее ws 

Когда макрос попадает в эту строку кода, он делает две вещи:

  1. Сначала он изменяет ссылку на переменную на следующий элемент в коллекции.В этом примере переменная ws изменена для ссылки на следующий лист в книге.
  2. Во-вторых, он возвращается к строке выполнения кода непосредственно под строкой For Each. Затем он запускает все строки кода между строками For Each и Next в порядке сверху вниз.

Когда достигается последний элемент в коллекции (рабочий лист в книге), цикл останавливается, и макрос переходит к следующей строке кода ниже следующей строки.

В каком порядке выполняется цикл для каждого цикла?

Цикл For Each Loop всегда начинается с первого элемента в коллекции и переходит к последнему элементу в том порядке, в котором они появляются в Excel.Это основано на порядковом номере элементов в коллекции. Вот несколько примеров порядка выполнения цикла для общих объектов.

  • Рабочие листы: Начинается с вкладки первого листа в книге и переходит к последней в том порядке, в котором вкладки отображаются в книге.
  • Рабочие книги: Начинается с первой открытой книги и зацикливается в том порядке, в котором были открыты книги. Рабочим книгам присваивается порядковый номер по мере их открытия.
  • Ячейки: Циклы слева направо, затем вниз. Начинается с первой ячейки диапазона и переходит к следующему столбцу в той же строке, а затем переходит к следующей строке.
  • Таблицы и сводные таблицы: Начинается с первого объекта, который был создан на листе, и повторяется в порядке создания объектов. Тот же принцип справедлив и для других объектов, которые вы создаете на листах, таких как фигуры, диаграммы, срезы и т. Д.

Элементы / объекты НЕ выбираются в цикле

Важно отметить, что, когда мы перебираем коллекцию объектов, каждый объект НЕ выбирается в Excel.

Цикл создает ссылку на элемент / объект с переменной. Переменная временно устанавливается на ссылку на объект. Объект НЕ выбирается и НЕ обязательно становится активным объектом. Для выбора объекта мы можем использовать методы Select или Activate. Вы также должны сначала убедиться, что родительский объект (ы) объекта (ы) выбран первым. Ознакомьтесь с моей статьей об объектной модели Excel и иерархии объектов в VBA, чтобы узнать больше об этом.

Следующий цикл: цикл по набору чисел

Мы также можем использовать цикл For Next Loop для перебора набора чисел.Это может быть полезно, когда мы перебираем элементы управления пользовательской формы, массивы или если мы хотим перебрать коллекцию в обратном направлении.

Основная операция цикла For Next такая же, как и у цикла For Each. Разница в формате строки For.

Шаг 1. Объявление переменной для числа

Чтобы перебрать набор чисел, нам сначала нужно объявить переменную с целочисленным типом данных. Мы можем использовать целое или длинное целое число.

 Тусклый и длинный 

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

Примечание к Long: Тип данных Long (целое число) содержит большее число, чем Integer. Он занимает больше памяти, но у современных компьютеров так много памяти, что это больше не проблема. Мы можем использовать переменные типа Long постоянно. Буква L выглядит как цифра 1 в VBA, поэтому теперь я использую i в качестве имени переменной, хотя в качестве типа данных я использую Long. Это все вопрос личных предпочтений, и вы можете назвать переменную как хотите.

Шаг 2 - Напишите Заявление For

Затем мы пишем оператор For.Базовая конструкция - это ключевое слово Для , за которым следует имя переменной (счетчик) , затем равно знаку , начальное значение По конечное значение .

 Для i = от 1 до 10 

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

 Для i = iStart To iEnd 

Мы также можем использовать свойства объектов, возвращающих число.

 Для i = 1 В ActiveWorkbook.Рабочие листы.Счет 

Эта строка кода вернет количество листов в активной книге. Однако он НЕ проходит через каждый рабочий лист. Цикл просто перебирает набор чисел. Мы должны создать ссылку на рабочий лист с переменной счетчика (i) в качестве порядкового номера свойства Worksheets. Шаг 3 показывает эту ссылку.

Шаг 3. Добавление кода, повторяющегося для каждой итерации

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

 Рабочие листы (i) .Visible = True 
Шаг 4 - Следующая строка увеличивает число и повторяет цикл назад

Наконец, мы добавляем следующую строку внизу.

 следующий я 

Когда макрос запускается, он устанавливает значение переменной, равное первому числу в строке For. Когда макрос попадает в строку Next, он прибавляет 1 к значению переменной или подсчитывает.Итак, на второй итерации цикла i = 2. Он продолжает цикл до тех пор, пока не будет достигнут последний номер в цикле.

По умолчанию, 1 добавляется к счетчику переменных для каждой итерации в цикле. Это называется Step Value , и мы можем контролировать значение каждого шага в счетчике. Значение Step добавляется в конец строки For. Следующая строка добавит 2 к счетчику для каждой итерации цикла.

 Для i = от 2 до 20 Шаг 2 

Если вы хотите заштриховать каждую вторую строку на листе, вы можете использовать такую ​​петлю.

Зацикливание назад

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

 Для i = от 100 до 1, шаг -1 

Обратите внимание, что начальное значение теперь является большим числом, а конечное значение - меньшим числом . Цикл начинается с 100 (начальное значение) и вычитает 1 из переменной счетчика (шаг -1) для каждой итерации в цикле, пока не дойдет до 1 (конечное значение).

Ключевое слово Step - необязательно .Если вы не укажете его, VBA принимает значение Step, равное 1.

.

Обратный цикл отлично подходит, если вы удаляете элементы. Я напишу об этом отдельный пост, но общая идея заключается в том, что, когда мы перебираем коллекцию и удаляем элементы, размер коллекции становится меньше по мере удаления элементов. Цикл обычно вызывает ошибку, когда достигает 10-го элемента, когда в коллекции всего 9 элементов. Зацикливание в обратном направлении предотвращает эту потенциальную ошибку.

Ранний выход из цикла

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

 Выход для 

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

 Sub Unhide_First_Sheet_Exit_For ()
'Показывает первый лист, содержащий определенную фразу
'в имени листа, затем выходит из цикла.

Dim ws как рабочий лист

Для каждой страницы в ActiveWorkbook.Worksheets

'Найдите лист, который начинается со слова "Отчет"
Если влево (ws.Name, 6) = "Report" Тогда

ws.Visible = xlSheetVisible

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

Конец, если
Следующий ws

Концевой переводник 

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

Переменная не требуется после следующего ключевого слова

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

 Далее ws 
 следующий я 

Это НЕ требуется, и вы можете не увидеть этого в других примерах, которые найдете в Интернете. Однако мне нравится включать переменную после Next по двум причинам.

  1. Мы можем использовать его при отладке кода, чтобы увидеть значение переменной, наведя указатель мыши на переменную, когда код остановлен.
  2. Это упрощает понимание, к какой строке For подключена следующая строка. Это особенно верно, когда у вас есть несколько циклов или вложенных циклов в ваших макросах.

Поэтому я рекомендую добавить переменную после ключевого слова Next в качестве наилучшей практики. Небольшая дополнительная работа заранее сэкономит время и сэкономит головную боль в будущем. Поверьте мне! 😉

Примеры макрокода VBA для циклов

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

3 способа показать несколько листов в Excel + VBA Tutorial

Автоматическое форматирование чисел по умолчанию в сводных таблицах Excel

3 совета по сохранению и закрытию всех открытых файлов книги Excel + макрос

Макрос промежуточных показателей - создание сводной таблицы всех типов функций

Как добавить таблицу содержания изображений в файлы Excel

Скрыть и отобразить (фильтровать) столбцы с помощью раскрывающегося меню слайсера или фильтра

Фильтрация сводной таблицы или среза по самой последней дате или периоду

Как изменить размер информационных панелей Excel для разных размеров экрана

Преобразование сводной таблицы в формулы СУММЕСЛИМН + бесплатный макрос VBA

Макрос VBA для скрытия всех столбцов, содержащих значение в ячейке

Как повторять задачи с кодом VBA - Цикл - Отличная статья с множеством примеров от моего друга Криса Ньюмана из The Spreadsheet Guru.

Какую задачу вы хотите зациклить?

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

Циклы

- определенно промежуточный метод кодирования, который заставляет нас выходить за рамки средства записи макросов. К сожалению, записанный макрос не может создавать петли. Однако это навык, который вы сможете использовать снова и снова на протяжении всей своей карьеры для автоматизации простых и сложных задач. Понимание того, как использовать циклы, придаст вам магические силы в Excel.

Пожалуйста, оставьте комментарий ниже с задачей, которую вы хотите автоматизировать с помощью цикла. Спасибо! 🙂

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *