Loop excel что это

A loop is an essential concept for any programming language, and VBA follows the same approach. You can use loops to repeat an action until a specified condition is reached, or move through objects in a group, e.g. all worksheets in a workbook. A loop is an essential concept for programming. In this guide, we’re going to show you how to create a VBA loop in Excel.

Download Workbook

VBA loops can be useful to automate tasks. For example, you may need to protect or unprotect every worksheet at once, iterate a calculation for a specific number of times, or loop cells and store their values into an array until you find an empty cell. The rest is up to your needs and imagination.

VBA has two main loop categories:

  • For…Next Loops
  • Do Loops

In generally, while For…Next loops are designed for specific amount of iterations, Do loops are good for iterating based on a condition. However, you can modify and configure both loop types by their individual keywords. Let’s see the loop types with examples.

For…Next VBA Loop

For…Next (also known as For) loops are where you start to create VBA loops in Excel. A For loop is a basic concept of a loop structure in all programming languages. A For…Next loop is good for if you want to iterate you code certain amount of times, and for when you need to use the counter. For example, if you want to check cells from A1 to A10, a counter clicks from 1 to 10 can work in that case. Let’s see its syntax and an example.

Syntax

For counter = start To end [ Step step ]
statements ]
Exit For ]
statements ]
Next [ counter ]

Part Description
counter Required. Numeric variable used as a loop counter. The variable can’t be a Boolean or an array element.
start Required. Initial value of counter.
end Required. Final value of counter.
step Optional. Amount counter is changed each time through the loop. If not specified, step defaults to one.
statements Optional. One or more statements between For and Next that are executed a specific number of times.

Example 1 – Basic Form

In the first example of For…Next loop, we attempt to write serial numbers into the cells in A1:A10. In this code, For…Next loop sets values from 1 to 10 into the variable i. After the variable gets its value, you can use it in the code. We used the variable to specify the row numbers and cell values. Finally, the Next row increases the variable’s row by 1, and cycle goes on until the variable is equal to 11.

Sub FillSerialNumbers()
    Dim i As Integer
    For i = 1 To 10
        ActiveSheet.Cells(i, 1) = i
    Next i
End Sub

How to create VBA loops in Excel - For Next

Example 2 – Step

By default, For…Next loop increases its counter variable by 1 for each loop. You can change this property by using the step argument. To specify a step argument, use the Step keyword after the end argument and enter a number. Step can be either a positive or negative.

The following code is a modified version of the first example. Step 2 argument is added to loop. In this loop, the variable i can only take «1, 3, 5, 7, 9» values.

Sub FillSerialNumbers_Step2()
    Dim i As Integer
    For i = 1 To 10 Step 2
        ActiveSheet.Cells(i, 1) = i
    Next i
End Sub

Remember to choose appropriate start and end arguments when you need to use a negative step value. For example, For I = 10 To 1 Step -1

Example 3 – Nested Loops

You can create loops within other loops. VBA executes all iterations in an inner loop, for each iteration of the outer loop. This type of structure can be helpful if you want add additional dimensions into your code. For example, while one loop is counting rows, other can count the columns. You need three loops to fill a three-dimensional data array.

The important point is using different counter variables for each loop. Otherwise, there will be leaps for the counter values. Let’s see an example for nested For…Next loops.

The following code contains 2 For…Next loops which is using variables named i and j. In the statement panel, i and j are used as row and column numbers respectively.

In the first run, i becomes 1 and j becomes 2. After code is executed in the j-loop, while i keeps its value (1), j becomes 3. This cycle goes on until j becomes 7. After this, i becomes 2 and j returns back to 2.

Sub FillSerialNumbers_Nested()
    Dim i As Integer, j As Integer
    For i = 1 To 10
        For j = 2 To 6
            ActiveSheet.Cells(i, j) = i * j
        Next j
    Next i
End Sub

Since j gets numbers between 2 and 6, only columns from B to F are filled.

Example 4 – Exit For

You may want to exit a loop when a certain condition is met. Let’s say we do not want to fill cells if i * j is more than 18. To achieve this, we can use Exit For statement.

The following code uses Exit For in the inner loop. Please note that, Exit For works for only the loop it’s in. Thus, when i * j > 18 condition is met, VBA continues to run the outer loop (i-loop).

Sub FillSerialNumbers_ExitFor()
    Dim i As Integer, j As Integer
    For i = 1 To 10
        For j = 2 To 6
            If i * j > 18 Then Exit For
            ActiveSheet.Cells(i, j) = i * j
        Next j
    Next i
End Sub

Example 5 — For Each

A For Each loop is a more specialized version of the For…Next loops. For Each loops can iterate for elements in a list. These elements can be values in an array, cells in a range, or worksheets in workbook. For Each loops doesn’t need a counter, each element is stored in a variable to be used in the code.

Let’s take another example. This time there isn’t a counter variable, but a range object c. For Each loop assigns each cell in the range «A1:C8» to element c, at each iteration. Also, since there is no counter value, we need to increase an integer by 1 in the code.

Sub FillSerialNumbers_ForEach()
    Dim c As Range, i As Integer
    i = 0
    For Each c In ActiveSheet.Range("A1:C8")
        i = i + 1
        c = i
    Next c
End Sub

How to create VBA loops in Excel - For Each

This is the last example for the For…Next loops of our how to create a VBA loop in Excel guide. Let’s now move on to the Do loops.

Do VBA Loop

A Do loop looks at whether a condition is met to continue cycling through, or stop a loop. Do loops are more flexible than For…Next loops. On the other hand, this flexibility comes with some complexities.

A Do loop starts with Do and finishes with Loop keywords. You can define a condition for one of these statements. If you specify a condition with Do, VBA looks at the condition first; otherwise, the code block in the loop is executed and the condition is evaluated at the end. This flexibility presents 2 syntaxes.

Also, Do loops can use While and Until keywords to specify the action when a condition is met. If you use the While keyword, the loop continues to work if condition is met. On the other hand, the Until keyword stops the loop.

Syntax

Do [{ While | Until } condition ]
statements ]
Exit Do ]
statements ]
Loop

Or, you can use this syntax:

Do
statements ]
Exit Do ]
statements ]
Loop [{ While | Until } condition ]

Part Description
condition Optional. Numeric expression or string expression that is True or False. If condition is Null, condition is treated as False.
statements One or more statements that are repeated while, or until, condition is True.

Example 1 – Do While

Do While loop iterates its statements as long as the specified conditions are valid. We can modify our first example to work with a Do loop.

In the following example, the Do loop works as many iterations as the variable i is equal or less than 10.

Sub FillSerialNumbers_DoWhile()
    Dim i As Integer
    i = 1
    Do While i <= 10
        ActiveSheet.Cells(i, 1) = i
        i = i + 1
    Loop
End Sub

Caution: If you use a loop like this, remember to add a code to change the value of the variable. Otherwise, the code will be stuck in an infinite loop because the variable i will always remain less than 10.

How to create VBA loops in Excel - Do Loop

Example 2 — Do Until

This time the loop continues «until» the condition is met. Once it does, the loop ends.

Sub FillSerialNumbers_DoUntil()
    Dim i As Integer
    i = 1
    Do Until i > 10
        ActiveSheet.Cells(i, 1) = i
        i = i + 1
    Loop
End Sub

Example 3 – Loop While

You can use conditions after Loop as well. In this scenario, you ensure that the statements are executed at least once before condition validation.

Loop While iterates the loop if the supplied condition is met.

Sub FillSerialNumbers_DoLoopWhile()
    Dim i As Integer
    i = 1
    Do
        ActiveSheet.Cells(i, 1) = i
        i = i + 1
    Loop While i <= 10
End Sub

Example 4 – Loop Until

Use Loop Until statement when you need to check the condition after the statements, and want to continue the loop «until» the condition is met.

Sub FillSerialNumbers_DoLoopUntil()
    Dim i As Integer
    i = 1
    Do
        ActiveSheet.Cells(i, 1) = i
        i = i + 1
    Loop Until i > 10
End Sub

That’s all! You can now create your own VBA loop to automate your Excel tasks in no time.

Содержание

  1. Сделать. Оператор Loop
  2. Синтаксис
  3. Замечания
  4. Пример
  5. См. также
  6. Поддержка и обратная связь
  7. Do. Loop statement
  8. Syntax
  9. Remarks
  10. Example
  11. See also
  12. Support and feedback
  13. Использование Do. Операторы цикла
  14. Повторяющиеся инструкции, когда условие имеет значение True
  15. Повторяющиеся инструкции до тех пор, пока условие не станет true
  16. Выход из do. Оператор Loop из цикла
  17. См. также
  18. Поддержка и обратная связь
  19. Оператор Do. Loop (Visual Basic)
  20. Синтаксис
  21. Компоненты
  22. Комментарии
  23. Выход из Do
  24. Пример 1
  25. Пример 2
  26. Пример 3
  27. Пример 4
  28. VBA Excel. Цикл Do Until… Loop
  29. Синтаксис цикла Do Until… Loop
  30. Компоненты цикла Do Until… Loop
  31. Примеры циклов Do Until… Loop
  32. Простейшие циклы
  33. Проход по строкам листа

Сделать. Оператор Loop

Повторяет блок операторов, пока условие имеет значение True или пока условие не примет значение True.

Синтаксис

Do [< While | Until > condition ] [ statements ] [ Exit Do ] [ statements ] Loop

Также можно использовать следующий синтаксис.

Do [ инструкции ] [ Exit Do ] [ операторы ] Loop [< While | Until > condition ]

Синтаксис оператора Do Loop состоит из следующих элементов.

Part Описание
Состояние Необязательный параметр. Числовое выражение или строковое выражение, разрешаемое в значение True или False. Если выражение condition разрешается в значение Null, его значением считается False.
Операторы Один или несколько операторов, которые повторяются, пока условие condition имеет значение True или пока условие не примет это значение.

Замечания

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

При использовании во вложенных циклах Do…Loop оператор Exit Do передает управление циклу, который находится на один уровень выше цикла оператора Exit Do.

Пример

В этом примере показано использование операторов Do. Loop. Внутреннее . Оператор Loop выполняет цикл 10 раз, запрашивает у пользователя, следует ли продолжать работу, устанавливает для флага значение False при выборе параметра Нет, а затем преждевременно завершает работу с помощью инструкции Exit Do . Выход из внешнего цикла происходит сразу после проверки значения флага.

См. также

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

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Do. Loop statement

Repeats a block of statements while a condition is True or until a condition becomes True.

Syntax

Do [< While | Until > condition ] [ statements ] [ Exit Do ] [ statements ] Loop

Or, you can use this syntax:

Do [ statements ] [ Exit Do ] [ statements ] Loop [< While | Until > condition ]

The Do Loop statement syntax has these parts:

Part Description
condition Optional. Numeric expression or string expression that is True or False. If condition is Null, condition is treated as False.
statements One or more statements that are repeated while, or until, condition is True.

Any number of Exit Do statements may be placed anywhere in the Do…Loop as an alternate way to exit a Do…Loop. Exit Do is often used after evaluating some condition, for example, If…Then, in which case the Exit Do statement transfers control to the statement immediately following the Loop.

When used within nested Do…Loop statements, Exit Do transfers control to the loop that is one nested level above the loop where Exit Do occurs.

Example

This example shows how Do. Loop statements can be used. The inner Do. Loop statement loops 10 times, asks the user if it should keep going, sets the value of the flag to False when they select No, and exits prematurely by using the Exit Do statement. The outer loop exits immediately upon checking the value of the flag.

See also

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Использование Do. Операторы цикла

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

Повторяющиеся инструкции, когда условие имеет значение True

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

В следующей ChkFirstWhile процедуре необходимо проверить условие перед вводом цикла. Если myNum задано значение 9, а не 20, операторы внутри цикла никогда не будут выполняться. В процедуре ChkLastWhile инструкции в цикле выполняются только один раз, прежде чем условие станет False.

Повторяющиеся инструкции до тех пор, пока условие не станет true

Существует два способа использования ключевого слова Until для проверки условия в операторе Do. Loop. Вы можете проверить условие перед вводом цикла (как показано в ChkFirstUntil процедуре) или проверить его после выполнения цикла хотя бы один раз (как показано в процедуре ChkLastUntil ). Повторение циклов продолжается, пока сохраняется условие False.

Выход из do. Оператор Loop из цикла

Вы можете выйти из do. Выполните цикл с помощью инструкции Exit Do . Например, чтобы выйти из бесконечного цикла, используйте инструкцию Exit Do в блоке инструкции True либо if. Затем. Оператор Else или оператор Select Case . Если условие будет False, цикл запустится обычным образом.

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

Чтобы остановить бесконечный цикл, нажмите клавиши ESC или CTRL+BREAK.

См. также

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

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Оператор Do. Loop (Visual Basic)

Повторяет блок инструкций, пока Boolean условие не станет True или не станет True .

Синтаксис

Компоненты

Термин Определение
Do Обязательный. Запускает определение Do цикла.
While Невозможно при Until использовании. Повторяйте цикл до тех пор, пока condition не будет False .
Until Невозможно при While использовании. Повторяйте цикл до тех пор, пока condition не будет True .
condition Необязательный элемент. Выражение Boolean . Если condition это так Nothing , Visual Basic обрабатывает его как False .
statements Необязательный элемент. Один или несколько операторов, повторяющихся в то время или до тех пор, condition является True .
Continue Do Необязательный элемент. Передает управление в следующую итерацию Do цикла.
Exit Do Необязательный элемент. Передает элемент управления из Do цикла.
Loop Обязательный. Завершает определение Do цикла.

Комментарии

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

Можно использовать While один или несколько Until вариантов condition , но не оба. Если вы не предоставите ни разу, цикл продолжается до тех пор, пока Exit не будет передан элемент управления из цикла.

Вы можете проверить condition только один раз в начале или в конце цикла. Если тестироваться condition в начале цикла (в инструкции Do ), цикл может не выполняться даже один раз. При тестировании в конце цикла (в инструкции Loop ) цикл всегда выполняется по крайней мере один раз.

Условие обычно приводит к сравнению двух значений, но это может быть любое выражение, результатом которого является логическое значение типа данных ( True или False ). Сюда входят значения других типов данных, таких как числовые типы, преобразованные в Boolean .

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

Структура Do. Loop обеспечивает большую гибкость, чем while. Оператор End While , так как он позволяет решить, следует ли завершать цикл, когда condition он перестает быть True или когда он сначала становится True . Он также позволяет тестировать condition в начале или в конце цикла.

Выход из Do

Оператор Exit Do может предоставить альтернативный способ выхода Do…Loop из . Exit Do передает управление непосредственно оператору, следующему за оператором Loop .

Exit Do часто используется после оценки некоторых условий If. Then. Else , например в структуре. Может потребоваться выйти из цикла, если обнаруживается условие, которое делает его ненужным или невозможным продолжать итерацию, например ошибочное значение или запрос на завершение. Одним из способов Exit Do является проверка на условие, которое может вызвать бесконечный цикл, который является циклом, который может выполняться большое или даже бесконечное количество раз. Можно использовать для Exit Do экранирования цикла.

Вы можете включить любое количество Exit Do операторов в любом месте. Do…Loop

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

Пример 1

В следующем примере операторы в цикле продолжают выполняться до тех пор, пока index переменная не будет больше 10. Предложение Until находится в конце цикла.

Пример 2

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

Пример 3

В следующем примере цикл останавливается, condition если index переменная больше 100. Однако оператор If в цикле приводит Exit Do к остановке цикла, если переменная индекса больше 10.

Пример 4

В следующем примере считываются все строки в текстовом файле. Метод OpenText открывает файл и возвращает StreamReader объект, который считывает символы. В условии Do. Loop метод StreamReader определяет наличие Peek дополнительных символов.

Источник

VBA Excel. Цикл Do Until… Loop

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

Цикл Do Until… Loop в VBA Excel предназначен для повторения блока операторов пока не выполняется заданное условие (возвращается значение False). Синтаксис этого цикла аналогичен синтаксису цикла Do While… Loop, который повторяется до тех пор, пока условие выполняется (возвращается значение True).

Синтаксис цикла Do Until… Loop

Синтаксис цикла Do Until… Loop существует в двух вариантах, определяющих, когда проверяется условие.

Условие проверяется до выполнения операторов:

Условие проверяется после выполнения операторов:

В квадратных скобках указаны необязательные атрибуты цикла Do Until… Loop.

Компоненты цикла Do Until… Loop

Компонент Описание
condition Обязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean.
statements Необязательный* атрибут. Операторы вашего кода.
Exit Do Необязательный атрибут. Оператор выхода** из цикла до его окончания.

*Если не использовать в цикле свой код VBA, смысл применения цикла теряется.

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

Примеры циклов Do Until… Loop

Простейшие циклы

Цикл Do Until… Loop с условием до исполняемых операторов:

Цикл Do Until… Loop с условием после исполняемых операторов:

В обоих случаях окно MsgBox выведет число 10. Когда значение переменной a будет равно 10, проверяемое условие выдаст значение True, и цикл будет остановлен.

Проход по строкам листа

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

Дни Игрок Брошено Попало в цель
1 день Белка 1 15 6
1 день Белка 2 12 7
2 день Белка 1 14 8
2 день Белка 2 16 7
3 день Белка 1 20 9
3 день Белка 2 14 6
4 день Белка 1 26 10
4 день Белка 2 13 5
5 день Белка 1 17 4
5 день Белка 2 21 7

Исходя из этих данных необходимо узнать, сколько шишек осталось у Белки 1 в дупле. Для этого необходимо вычесть из 100 шишек количество выброшенных Белкой 1 и прибавить шишки, заброшенные в ее дупло Белкой 2. Вычисления начинаем со второй строки (в первой заголовки) и в условии для цикла Do Until… Loop указываем «первая ячейка текущей строки является пустой». Таблица должна начинаться с первой ячейки рабочего листа «A1», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.

Источник

При выполнении VBA программы (VBA, Visual Basic for Applications) может потребоваться повторить какой-то фрагмент кода несколько раз. Для выполнения этой задачи существуют циклы.

Синтаксис языка Visual Basic предусматривает следующие их типы:

  1. For.
  2. Do While.
  3. Do Until.

Давайте проанализируем отличия между ними во всех подробностях.

Содержание

  1. Цикл типа For
  2. For … Next
  3. Цикл For Each
  4. Конструкция Exit For
  5. Цикл Do While
  6. Цикл Do Until

Цикл типа For

Выделяют несколько отдельных типов цикла For. Существует тип For … Next и For Each.

For … Next

Цикл For … Next опирается на переменную, которая увеличивается по окончании каждой итерации в определенном диапазоне. И каждый раз происходит выполнение определенного кода. Проще всего изобразить принцип работы цикла этого типа на легком фрагменте кода.

For i = 1 To 10

    Total = Total + iArray(i)

Next i

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

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

For d = 0 To 10 Step 0.1

    dTotal = dTotal + d

Next d

В описанном варианте цикла определенный размер шага – 0,1, поэтому значение переменной d изменяется по числовому ряду 0.0, 0.1, 0,2 и так далее, пока значение переменной не достигнет 10.

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

For i = 10 To 1 Step -1

    iArray(i) = i

Next i

В данном примере кода указан размер шага -1. Следовательно, числовой ряд соответствующей переменной будет следующим: 10, 9, 8 — вплоть до единицы.

Цикл For Each

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

Dim wSheet As Worksheet

For Each wSheet in Worksheets

    MsgBox «Found Worksheet: » & wSheet.Name

Next wSheet

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

Конструкция Exit For

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

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

Рассмотрим еще один пример, который хорошо отображает работу оператора Exit For. Здесь цикл анализирует 100 объектов, интерпретатор сравнивает каждый из них со значением переменной dValue1s. Если оно равно dVal1, то цикл завершается.

For i = 1 To 100

If dValues1(i) = dVal1 Then

indexVal = i

Exit For

End If

Next i

Цикл Do While

Характерная особенность цикла Do While – выполнение содержащегося в нем кода осуществляется до того момента, пока истинно определенное условие. Это хорошо демонстрирует следующий пример функции Sub, где этот цикл используется, чтобы напечатать числа, входящие в последовательность Фибоначчи, пока число в переменной больше 1000.

‘ Sub procedure to list the Fibonacci series for all values below 1,000

Sub Fibonacci()

Dim i As Integer   ‘ counter for the position in the series

Dim iFib As Integer   ‘ stores the current value in the series

Dim iFib_Next As Integer   ‘ stores the next value in the series

Dim iStep As Integer   ‘ stores the next step size

‘ Initialise the variables i and iFib_Next

i = 1

iFib_Next = 0

‘ Do While loop to be executed as long as the value of the

‘ current Fibonacci number exceeds 1000

Do While iFib_Next < 1000

If i = 1 Then

‘ Special case for the first entry of the series

iStep = 1

iFib = 0

Else

‘ Store the next step size, before overwriting the

‘ current entry of the series

iStep = iFib

iFib = iFib_Next

End If

‘ Print the current Fibonacci value to column A of the

‘ current Worksheet

Cells(i, 1).Value = iFib

‘ Calculate the next value in the series and increment

‘ the position marker by 1

iFib_Next = iFib + iStep

i = i + 1

Loop

End Sub

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

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

Do

Loop While iFib_Next < 1000

Цикл Do Until

Этот тип напоминает Do While, но здесь код выполняется до тех пор, когда условие не становится правдивым. То есть, в прошлом варианте изначально условие истинное, пока в ходе выполнения действий оно не станет ложным. Здесь – наоборот. Это хорошо демонстрирует такой пример:

iRow = 1

Do Until IsEmpty(Cells(iRow, 1))

‘ Store the current cell value in the dCellValues array

dCellValues(iRow) = Cells(iRow, 1).Value

iRow = iRow + 1

Loop

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

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

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

Do

.

.

.

Loop Until IsEmpty(Cells(iRow, 1))

Циклы – это эффективный инструмент, позволяющий автоматизировать повторяющиеся действия. Он может использоваться для программирования самых разнообразных задач. Это значительно облегчает работу с большими объемами данных.

Если коротко подвести итоги, цикл For используется, если нужно повторить определенный фрагмент кода какое-то количество раз. Do While и Do Until используются для похожих задач. В первом случае, пока условие истинно, код будет повторяться. Во втором же — повтор будет производиться, пока оно не станет истинным.

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

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

Содержание:

  • for цикл
  • Синтаксис
  • Диаграмма потока
  • пример
  • for … loop
  • Синтаксис
  • пример
  • while..wend loop
  • Синтаксис
  • Диаграмма потока
  • пример
  • Цикл do..while
  • Синтаксис
  • Диаграмма потока
  • пример
  • Альтернативный синтаксис
  • пример
  • do..intil loop
  • Синтаксис
  • Диаграмма потока
  • пример
  • Альтернативный синтаксис
  • Диаграмма потока
  • пример
  • Записи управления циклом
  • Контрольное заявление и описание
  • Выход для оператора
  • Синтаксис
  • Диаграмма потока
  • пример
  • Exit Do
  • Синтаксис
  • пример

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

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

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

Цикл 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

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

Работа с циклами в VBA:loop, for each, for 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

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

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

пример

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           

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

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

пример

В следующем примере используется цикл 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    

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

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

пример

В следующем примере используется 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

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

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

пример

В следующем примере используется 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.

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

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

пример

В следующем примере используется 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 и передает выполнение в оператор сразу после цикла

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

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

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Добрый день.
Подскажите, что может Do…Loop такого, что нельзя сделать при помощи For…Next или If,  или иного оператора?
Никогда на ум не приходит использовать Do…Loop.
Может я неправ?

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Во-первых, сравнивать Do…Loop и If — неправильно. Одна является конструкцией цикла, а вторая условия.
В отличии от For Next — Do … Loop может быть использован для вычисления неизвестных величин, если цикл должен продолжаться не по жестко заданным элементам, а до тех пор, пока условие не будет выполнено.
Например, если необходимо изменять значения указанных ячеек до тех пор, пока их сумма не станет равна определенному указанному значению(или приближенной к нему). For … Next здесь явно не справится.

Так же Do … Loop применяется вместе с Find для определения всех найденных значений(пример есть в офф.справке по методу Find-FindNext). Применить иной цикл не представляется возможным именно с Find, т.к. неизвестно заранее сколько значений будет найдено. При этом часто такой подход применяется для одновременной замены или удаления найденного, что дополнительно усложняет выполнение задачи иными средствами.

Правда, в Do .. Loop надо очень аккуратно относится к условиям, дабы не завесить ПК. Поэтому часто в этот цикл вставляется DoEvents, чтобы можно было прервать цикл, если он «ушел в бесконечность»(условие недостижимо вследствие ошибки программиста).

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

в Do Loop не всегда будет первый проход, в For Next — всегда.

Неизлечимых болезней нет, есть неизлечимые люди.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#4

23.04.2015 12:36:35

Цитата
TheBestOfTheBest написал: For Next — всегда.

:-)

Код
For 1 to 0

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Hugo

Пользователь

Сообщений: 23250
Регистрация: 22.12.2012

#5

23.04.2015 12:45:24

Практически никогда не использую Do…Loop.
Но есть случай когда очень годится — например нужен цикл в цикле, и из которых всех нужно выйти, если во внутреннем выполнилось условие.
Тогда внешний ставим Do…Loop, внутренний For…Next, а в нём когда нужно выполняем Exit Do

Код
Do
  for i=1 to 3
    for j=5 to 8
      for each x in MyArray
        if SomeCondition then exit do
      next
    next
  next
Loop until true

Ну или можно сделать наоборот.

 

Hugo

Пользователь

Сообщений: 23250
Регистрация: 22.12.2012

#6

23.04.2015 12:49:55

Или вот что где-то говорил Казанский:

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

1. Цикл For Each можно использовать не только для перебора элементов коллекции (например, коллекции ячеек в диапазоне), но и для перебора элементов массива. Причем массив может формироваться «тут же» функцией Array или Split. Этот фрагмент перевернет названия перечисленных листов:

Код
Dim s
For Each s In Array("Лист1", "Лист3")
Sheets(s).Name = StrReverse(Sheets(s).Name)
Next

или

Код
Dim s
For Each s In Split("Лист1,Лист3", ",")
Sheets(s).Name = StrReverse(Sheets(s).Name)
Next

2. Цикл Do…Loop вполне может использоваться без While или Until, если предусмотрен выход из цикла с помощью Exit Do. Этот фрагмент будет выдавать сообщение, пока пользователь не нажмет «Отмена» или «крестик»:

Код
Do
If MsgBox(IIf(Rnd() < 0.5, "Орел", "Решка"), vbOKCancel) = vbCancel Then Exit Do
Loop

3. После «нормального» выхода из цикла For Each, переменная цикла содержит Nothing. Это можно использовать для определения того, как произошел выход из цикла — после перебора последнего элемента или по Exit For. Этот фрагмент определяет, содержится ли в книге лист с заданным именем:

Код
Dim sh As Worksheet
For Each sh In Worksheets
If sh.Name = "Лист2" Then Exit For
Next
If sh Is Nothing Then MsgBox "Лист не найден": Exit Sub
 

Do loop использую, когда точно не знаю рамок применения цикла, а использовать дополнительную переменную не представляется возможным (примерно как в ответе The Priest про find). Если все же возникает необходимость использовать Do loop, надо быть осторожным в том смысле, что нужно обновлять условие, которое идет для сравнения в while, until. Если обновление сравниваемой переменной задано некорректно, мы можем попасть в бесконечный цикл (infinite loop). Именно по этой причине в любых циклах (в том числе и в for loop, если рамки слишком большие) желательно использовать DoEvents, как уже сказано выше. For loop обычно имеет конечные рамки, которые задаются жесткими цифрами (hardcoded values) либо переменными, значения которых мы как-то изначально получаем. Типичный пример — прогон массивов.

Вообще надо, где удобно, уходить от циклов, используя при этом блок on error resume next — on error goto 0. Например алгоритм перебора файлов, который имеет линейную комплексность, может стать по комплексности константой, но это уже совсем другая история.

С уважением,
Федор/Все_просто

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#8

23.04.2015 13:15:21

Цитата
Все_просто написал:
Вообще надо, где удобно, уходить от циклов, используя при этом блок on error resume next

здесь не соглашусь. Обходы ошибок это не совсем правильный вариант. Если есть вариант без этого — лучше использовать его. Почему нет, если все используют и горя не знают? Все просто: по умолчанию в настройках VBE установлено: Tools-Options-вкладка General-Breack on unhandled Errors. Но если кто-то сменит и установит: Breack on All Errors — то On Error Resume Next будет бесполезен.
Поэкспериментируйте с этими настройками и с кодом:

Код
Sub test()Dim wsSh As Worksheet
On Error Resume Next
Set wsSh = Sheets("Лист5")
If wsSh Is Nothing Then
    MsgBox "Нет такого листа"
End If
End Sub

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#9

23.04.2015 13:24:17

Цитата
The_Prist написал: For 1 to 0

попробуйте, гы, первый проход все равно будет, т.к. условие цикла проверяется по строке Next

Перепутал с Do…until


Изменено: TheBestOfTheBest23.04.2015 18:52:10

Неизлечимых болезней нет, есть неизлечимые люди.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#10

23.04.2015 13:30:32

Цитата
TheBestOfTheBest написал: попробуйте, гы, первый проход все равно будет

8-0

Код
Sub test()
Dim li As Long
For li = 1 To 0
MsgBox "А был ли проход?"
Next
End Sub

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#11

23.04.2015 13:34:09

Цитата
The_Prist написал: Любой цикл сначала оценивает условия и входные данные

Тогда и вы учите матчасть :)

Код
Do
MsgBox "А был ли проход?"
Loop Until True

Неизлечимых болезней нет, есть неизлечимые люди.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#12

23.04.2015 13:36:31

Цитата
TheBestOfTheBest написал:
в Do Loop не всегда будет первый проход, в For Next — всегда

а это кто писал?

Цитата
TheBestOfTheBest написал:
Тогда и вы учите матчасть

Уверены, что это я должен сделать?
Я даже в Вашем утверждении выделил жирным указание на некорректность.

И в Вашем последнем примере кода лишь подтверждение моих слов. В приведенном примере Do сначала оценивает входные данные и условия. Т.к. в Вашем примере условия идут после прохода и отсутствуют в начале(специфика конструкции) — идет первый проход цикла и после сопоставление условия. For … Next лишен такой возможности и обязан всегда определять для начала входные условия(границы итераций) и только после этого принять решение — делать проход или нет.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

Прочтите пост #9

Неизлечимых болезней нет, есть неизлечимые люди.

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

Хватит ругаться, ребята.
—————————————————
Вообщем, с примерами стало чуть понятнее. Видно с такими ситуациями я ещё пока не сталкивался.
Спасибо.
Всего доброго.

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#15

23.04.2015 13:53:05

Скрытый текст

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#16

23.04.2015 14:05:52

Скрытый текст

Неизлечимых болезней нет, есть неизлечимые люди.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#17

23.04.2015 14:24:03

Ну давайте разбираться. Вы изначально писали про Next. На это и была львиная доля ответов. Которые Вы читали вскользь, не пытаясь понять, что помимо непосредственно условий истинности(i<> и т.п.) есть входные данные. Чтобы Вы ни думали, но перед выполнением цикла сначала оцениваются входные данные:
-для For … Next — границы цикла(начальная итерация и конечная)
-для Do — наличие условий проверки и тип проверки: While,Until и их месторасположение относительно исполняющей конструкции.

И именно исходя из этих данных VBE определяет — надо делать первый проход или нет.  В случае с Do вообще неверно утверждать ни наличие прохода ни его отсутствие не приводя конкретный тип конструкции Do.
Ниже несколько разных циклов с Do. test3 и test 4 будут делать первый проход в любом случае, т.к. условие истинности расположено после прохода. test1 и test2 — могут отработать без единого прохода, в зависимости от истинности указанного условия.

Код
Sub test()
    Dim i
    i = 0
    Do While i <> 1
        MsgBox "А был ли проход?"
        i = 1
    Loop
End Sub
Sub test2()
    Dim i
    i = 0
    Do Until i <> 1
        MsgBox "А был ли проход?"
        i = 1
    Loop
End Sub
Sub test3()
    Dim i
    i = 0
    Do
        MsgBox "А был ли проход?"
        i = 1
    Loop While i <> 1
End Sub
Sub test4()
    Dim i
    i = 1
    Do
        MsgBox "А был ли проход?"
    Loop Until i = 1
End Sub

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

И чтобы не было недопонимания: проходом лично я считаю в данном случае инструкции, расположенные между Do и Loop и между For и Next.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#18

23.04.2015 14:34:38

Тогда к вам такой вопрос, конструкция test5() имеет цикл?

Код
Sub test5()
Dim i
    i = 0
    Do
        MsgBox "А был ли проход?"
    Loop Until i = 1
End sub 

Имеет.
Хотя бы один проход будет в любом случае (кроме ошибки выполнения кончно).
Поэтому, я утверждаю что Do…Loop может организовать цикл с первым обязательным проходом не зависимо от условия цикла. For … Next такого не может, придется изменять его счетчик.
Я не прав?

Изменено: TheBestOfTheBest23.04.2015 14:39:24

Неизлечимых болезней нет, есть неизлечимые люди.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#19

23.04.2015 14:46:39

Цитата
TheBestOfTheBest написал: я утверждаю что Do…Loop может организовать

Во-первых все началось с того, что утверждали-то Вы обратное. Нет?
Во-вторых:

Цитата
The_Prist написал: В случае с Do вообще неверно утверждать ни наличие прохода ни его отсутствие не приводя конкретный тип конструкции Do

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

Да, в приведенном Вами последнем примере будет в любом случае один проход. Но как это опровергает мои утверждения? Я вот этого не пойму. Еще раз написать? СНАЧАЛА ПРОВЕРЯЮТСЯ ВСЕ ВХОДНЫЕ ДАННЫЕ для определения цикла в принципе. Вводные данные, если угодно. Do имеет несколько реализаций и VBE должен сначала понять какая перед ним в данный момент. Если сразу после Do нет условия — значит сначала будет выполнен проход в любому случае. Если условие есть — то будет проверено это условие и после этого принято решение — делать проход или нет.
Поэтому я и написал: нельзя утверждать, что у Do .. Loop всегда есть один проход, не приводя конкретную конструкцию. Все зависит именно от конструкции в случае с Do и обобщать тут нельзя. Это все равно, что утверждать, что у машины всегда 4 колеса.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#20

23.04.2015 14:48:49

Цитата
Владимир написал: Хватит ругаться, ребята

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Вот же как хорошо получается! Двое спорят, а истину, которая рождается, все на ус мотают :)
Копирну-ка я эту тему себе с справку.

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#22

23.04.2015 14:58:11

Цитата
The_Prist написал: Но как это опровергает мои утверждения?

Мне показалось, что формулировка «Любой цикл сначала оценивает условия и входные данные» некорректна, т.к. в test5() условие оценивается в конце цикла. Вы сами об этом пишите. Про входные данные не знаю, таких в коде я не вижу, есть оператор/конструкция Do…Loop и условие, приставленное к Do или к Loop. Как написано, так VBA и исполняет. Может вы дадите ссылку где написано про «Любой цикл сначала оценивает условия и входные данные», я поизучаю матчасть.

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

Изменено: TheBestOfTheBest23.04.2015 15:19:02

Неизлечимых болезней нет, есть неизлечимые люди.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#23

23.04.2015 15:18:47

Я уж и не знаю как написать-то, чтобы Вы поняли…

Цитата
The_Prist написал: Do имеет несколько реализаций и VBE должен сначала понять какая перед ним в данный момент

ни на какие мысли не наводит? :-) Вы чуть передохните, обдумайте и заново перечитайте тему. Под входными данными в данном случае я понимаю конкретизацию цикла: это For … Next, Do … Loop, Do While … Loop и т.д.
Т.е. VBE должен в любом случае понять, что за цикл перед ним. Нет для него понятия: любой Do сначала делает проход. Как видно — их несколько реализаций, этих Do. И нельзя утверждать, что «Do всегда делает один проход». Я выше выкладывал 4 цикла — два из них сделают проход в любом случае, два — только в зависимости от условия. И все они относятся к семейству Do.

Цитата
Я отвечал в противовес Вашему утверждению:
TheBestOfTheBest написал: первый проход все равно будет

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

А ссылку на матчасть не дам, т.к. это на MSDN все расписано, но не в таком явном виде и не для VBA конкретно…

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#24

23.04.2015 15:38:02

Цитата
The_Prist написал: а отнесли все реализации циклов Do в одну свалку(а-ля они все имеют по-любому один проход). Это же неверно

Разве утверждение ниже не верно?

Цитата
TheBestOfTheBest написал: Поэтому, я утверждаю что Do…Loop может организовать цикл с первым обязательным проходом не зависимо от условия цикла

Написано «может организовать», а не «должен организовать» — я это поправил и извинился за прежний ляп. Конкретику дал в коде.

Я бы очень хотел увидеть официальный источник, где есть такие формулировки «Под

входными данными

в данном случае …

конкретизацию цикла

: это For … Next, Do … Loop, Do While … Loop и т.д.» или «Любой цикл сначала оценивает условия и входные данные…». Жду ссылку.

Неизлечимых болезней нет, есть неизлечимые люди.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#25

23.04.2015 16:14:07

Цитата
TheBestOfTheBest написал: Жду ссылку.

Ждите. Я Вам ничего не должен и не собираюсь при таком подходе вообще Вам что-то давать или разъяснять. Я уже писал, что именно я имел под входными данными: наличие условия или его отсутствие. Т.е. признак, указывающий на тип цикла. Раз читать и вдумываться не хотите — есть MSDN — лопатьте сами, упрямства Вам не занимать. Расценивать это можете тоже как хотите. Мне уже отсюда видно, что бесполезно до Вас пытаться что-то донести. Поэтому лопатьте офф.источники и ищите там все, что душе угодно.

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

Цитата
TheBestOfTheBest написал: Организация For Next всегда требует счетчика, с соответствующими заморочками (объявление переменных, присвоение значений TO и STEP), Do же этого не требует

Вы уверены?

Код
Sub test5()
For Each x In Range("A1:A10").Value
    MsgBox x
Next
End Sub

нет счетчика, нет To. Так же нет Step — он по умолчанию указан как 1. При этом директиву Option Explicit я убрал из модуля. И все работает без объявления. По-Вашему, Next всегда требует объявления переменных, а Do нет? А что отвечает за обязательное объявление переменных не напомните? Может имелось ввиду наличие некоей переменной цикла все же?

Может все же чуть отдохнете и вдумаетесь в тему в целом? Может тогда поймете о чем я вообще тут писал. Циклы бывают разные и нельзя мерить единым мерилом и единые утверждения для них лепить. Равно как и сравнить какой лучше — всякий хорошо по своему в зависимости от задачи.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Максим Зеленский

Пользователь

Сообщений: 4646
Регистрация: 11.06.2014

Microsoft MVP

#26

23.04.2015 16:18:30

Не пойму предмет спора…

вот справка VBA

Я думаю, компилятор всяко должен понять, какая конструкция использована — с условиями в начале и/или в конце, затем проверить их — либо в начале, либо в конце. Он же не построчно компилирует (как буквальный перевод), а по смыслу (литературно), нет?

F1 творит чудеса

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#27

23.04.2015 16:23:11

Цитата
The_Prist написал: имелось ввиду наличие некоей переменной цикла

Да счетчик цикла. Без переменной x конструкция работать не будет. Или x не переменная? ;)

Хорошо, хорошо, я сдаюсь. Ваше эго круче.

PS Кстати «директиву Option Explicit я убрал из модуля. И все работает без объявления.» —  у меня не работает, говорит переменная не определена :cry:

Изменено: TheBestOfTheBest23.04.2015 17:11:42

Неизлечимых болезней нет, есть неизлечимые люди.

 

MCH

Пользователь

Сообщений: 3875
Регистрация: 22.12.2012

Прикольная дискуссия здесь.

По существу вопроса Владимира:
Do Loop и For Next — это разные типы циклов, и их необходимо использовать в разных ситуациях.

Для себя использую
For i=a to b:Next i — в качестве счетчика или перебора элементов массива по индексу
For Each x in collection:next x — для перебора элементов коллекция или массивов.
Do Loop/While Wend — для циклов по условию

обычно конструкцию Do While условие:Loop заменяю на While условие:Wend, если это возможно (привычка экономии двух символов обусловленна решением олимпиадных задач по программированию)
но Do Loop, как правило, удобнее использовать(вместо While Wend): можно использовать различные условия выхода While или Until, условия ставить в начале или в конце цикла, а также есть возможность использования Exit Do при необходимости выйти по условию в теле цикла, или при вложенности нескольких циклов, как писал Игорь в 5 посте.

Изменено: MCH23.04.2015 17:08:36

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#29

23.04.2015 18:47:59

Цитата
Максим Зеленский написал:
Я думаю, компилятор всяко должен понять, какая конструкция использована — с условиями в начале и/или в конце, затем проверить их — либо в начале, либо в конце

Началось с поста 3, где прозвучало утверждение, что For … Next в отличие от Do .. Loop всегда будет делать минимум один проход. Я подумал, что скорее всего опечатка — но после первого примера был как бы…Отправлен проверять свое опровержение. После того, как TheBestOfTheBest понял ошибку я уже пытался рассказать, что каждый цикл — разный. И нельзя однозначно сказать ни про Do … Loop, ни про For … Next, если не указать конкретную конструкцию.
VBE когда встречает DO начинает искать дальше условие сразу после Do(While,Untill). Если не находит — идет на следующую строку и выполняет конструкцию внутри цикла после чего ищет Loop(как замыкающее звено цикла) и после этого уже ищет опять условие, чтобы понять — завершать цикл или вернуться в петлю. Т.е. это процесс изнутри так происходит. В принципе, как и If … Then и любая другая встроенная «конструкция».

Цитата
TheBestOfTheBest написал:
Ваше эго круче

А я тут ничем не мерялся и в мыслях этого не держал. Я уже пояснил причину своих сообщений Вам — Вы выкладываете утверждения, которые не всегда верны(по крайней мере в преподнесенном Вами изложении). Почитайте со стороны — не скажешь ведь, не зная, что имелось ввиду не отсутствие шага и наличие счетчика, а наличие переменной цикла(без которой For … Next немыслим). И тем более не скажешь, что имелось ввиду наоборот Do … Loop, а не For … Next.
А ведь Вы на форуме грамотные решения выкладываете. Как следствие — люди будут читать Ваш подобный ответ и принимать за чистую монету.

Если Option Explicit закомментирована или вообще отсутствует(что, собственно говоря для проекта равнозначно) — VBE не станет ругаться на необъявленную переменную, а просто применит к переменной с необъявленным типом директиву DefVar(т.е. тип Variant). И это справедливо для всех версий офиса и для VB(.NET не берем). Попробуйте скомпилировать проект после изменений. Вероятно некоторый глюк имеется в файле или в офисе в целом.

Цитата
TheBestOfTheBest написал:
Или x не переменная?

Переменная. Но, мне кажется, что это не Ваши слова, а мои. Ваши слова звучали иначе:

Цитата
TheBestOfTheBest написал:
Организация For Next всегда требует счетчика, с соответствующими заморочками (объявление переменных, присвоение значений TO и STEP)

Разница налицо. И опять же — утверждение Ваше безаппеляционное и без каких-либо оговорок. И как следствие неверное в этом преподнесении. Если брать

For i = n To k

— то-таки да. Но не в целом для For … Next. О чем я опять же и написал.

В общем: я на этом откланиваюсь, для меня тема исчерпана(в части циклов, по крайней мере). Торжество эго оставлю Вам.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#30

23.04.2015 19:30:16

Какjе-то недопонимание The_Prist.
Да пост 3 моя ошибка, я поправился, вы же меня и поправили.

Вы в коде test5() переменную х использовали? Использовали. Я об этом же написал: «Организация For Next всегда требует счетчика,…»  У вас в цикле он неявный и как следствие необъявленный, да еще и не число, а объект. Ну и что? Функция счетчика не пропала, система сама её реализовала, как впрочем и TO и STEP.
Вы не можете предъявить конструкцию где For Next не содержит такой переменной по которой идет «счет». Ведь так? Значит счетчик в цикле есть.

Да, если не ставить Option Explicit ругаться не будет (у меня заругался на другое), но счетчик при этом не исчез, переменная не исчезла.

Повторюсь:
«Организация For Next всегда требует счетчика, с соответствующими заморочками (объявление переменных, присвоение значений TO и STEP
*счетчик — см. объяснение выше
**заморочки — возможные дополнительные строки кода (но не обязательные)

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

Неизлечимых болезней нет, есть неизлечимые люди.

И так, мы уже познакомились с циклами for next и for each next, а в этой статье рассмотрим цикл do loop vba языка. Данный цикл vba в отличии от двух предыдущих работает не по принципу перебора, а по принципу условия, то есть… Вы задаете условие выхода или выполнения цикла, а не количество итераций. Фактически, цикл do loop это гибрид цикла for next с выражением exit for.

В зависимости от синтаксиса можно задавать условие как в начале, так и в конце…

Содержание

  1. Do while Loop VBA
  2. Do Loop While
  3. Do Until … Loop
  4. Do Loop Until

Do while Loop VBA

Общий синтаксис:

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

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

Do Loop While

Общий синтаксис:

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

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

Do Until … Loop

Общий синтаксис:

Do Until условие

Операторы

Loop

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

Do Loop Until

Общий синтаксис:

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

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

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

Хорошо, теперь давайте напишем небольшой пример. В редакторе VBA создайте новую форму (меню Insert пункт UserForm), на ее поверхность добавьте четыре текстовые метки (класс Label) и одну кнопку (класс CommandButton). Теперь в редакторе кода для формы пропишите:

Private Sub GetSumm()
Dim summ As Integer
    Do While summ <= 1000
        summ = summ + 1
    Loop
    Label1.Caption = summ & " - do while loop vba"
 
    summ = 0
    Do
        summ = summ + 1
    Loop While summ <= 1000
    Label2.Caption = summ & " - do loop while vba"
 
    summ = 0
    Do Until summ >= 1000
        summ = summ + 1
    Loop
    Label3.Caption = summ & " - do until loop vba"
 
    summ = 0
    Do
        summ = summ + 1
    Loop Until summ >= 1000
    Label4.Caption = summ & " - do loop until vba"
 
End Sub
Private Sub CommandButton1_Click()
    'Вызываем процедуру
    Call GetSumm
End Sub
 
Private Sub UserForm_Initialize()
    Label1.Caption = ""
    Label1.FontSize = 15
    Label1.ForeColor = vbBlue
 
    Label2.Caption = ""
    Label2.FontSize = 15
    Label2.ForeColor = vbGreen
 
    Label3.Caption = ""
    Label3.FontSize = 15
    Label3.ForeColor = vbRed
 
    Label4.Caption = ""
    Label4.FontSize = 15
    Label4.ForeColor = vbYellow
 
    CommandButton1.Caption = "Сумма"
End Sub

do while loop vba

Процедура GetSumm отвечает за выполнение операторов цикла VBA, в которых происходит процесс суммирования чисел. Как видим, мы не задаем начального значения, а просто прибавляем число 1. Первые два цикла задают условие выполнения – значение переменной summ должно быть меньше или ровно 1000. Во вторых двух циклах мы задали условие выхода – значение переменной sum должно быть больше или равно 1000. Как видим, в первых двух случаях нам вывело число 1001, а во вторых – 1000. Фактически, при использовании ключевого слова while, количество выполнений оператора в блоке цикла было на один раз больше, чем при использовании ключевого слова Until.

И так, в этой статье мы рассмотрели использование цикла do while loop vba и do until loop vba, который может использоваться на ряду с циклами for next и for each. Однако, тут можно задавать или условие выполнения или условие завершения работы цикла. Также, для выхода из блока применяется выражение exit for. Цикл VBA do loop часто используется для создания зацикливания, например – прослушивание системы на запуск заданной программы.

Для общего развития, можете посмотреть примеры использования цикла Do Loop в языке VBScript сервера сценариев Windows Script Host, который, как уже упоминалось, является сородичем языка Visual Basic for Applications.

Понравилась статья? Поделить с друзьями:
  • Look at the table then choose the correct word in sentences 1 and 2
  • Loop excel rows vba
  • Lookups in excel 2007
  • Look at the table then choose the correct word in sentences 1 3 below
  • Lookup как пользоваться excel