Visual basic цикл с шагом

Цикл 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 относятся:
- Цикл For
- Цикл Do While
- Цикл Do Until
Далее мы подробно рассмотрим каждый из этих циклов.
Оператор цикла «For» в Visual Basic
Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.
Цикл «For … Next»
Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:
Total = Total + iArray(i)
Next i
В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.
В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1. Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.
dTotal = dTotal + d
Next d
Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.
Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:
iArray(i) = i
Next i
Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.
Цикл «For Each»
Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:
For Each wSheet in Worksheets
MsgBox “Найден лист: ” & wSheet.Name
Next wSheet
Оператор прерывания цикла «Exit For»
Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.
Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:
If dValues(i) = dVal Then
IndexVal = i
Exit For
End If
Next i
Цикл «Do While» в Visual Basic
Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 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 с проверяемым условием в конце будет выглядеть вот так:
…
Loop While iFib_Next < 1000
Цикл «Do Until» в Visual Basic
Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:
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, в некоторых ситуациях нужно, чтобы цикл был выполнен хотя бы один раз, не зависимо от первоначального результата условного выражения. В таком случае условное выражение нужно поместить в конце цикла, вот так:
Оцените качество статьи. Нам важно ваше мнение:
Источник
Доброго времени суток! Данную статью я решил посвятить рубрике по основам программирования в Visual Basic for Application. И сегодня мы поговорим о циклах в VBA, разберём их синтаксис и рассмотрим несколько примеров, которые часто встречаются программисту.
Сначала напомню, что цикл — процесс повторения части кода, выполняемый, пока не будет выполнено или нарушено заданное нами условие.
В данной статье мы разберём синтаксис и примеры следующих циклов в VBA:
- For
- For each
- While
- Until
Цикл 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, разобрали основные примеры. Конечно все примеры по этой обширной теме сложно разобрать, но, тем не менее, основы вы должны понять. Оставляйте ваши комментарии, если у вас возникли вопросы.
Скачать исходник
Источник
Цикл – это оператор или группа операторов, которые программа многократно выполняет до тех пор, пока не получит команду начать выполнение чего – либо другого. В Visual Basic существуют два основных типа циклов – циклы со счетчиком (с известным числом повторений) и циклы с условием. Циклы со счетчиком используют в тех случаях, когда необходимо выполнить некоторые действия определенное число раз. Циклы с условием применяются тогда, когда некоторые действия в программе должны повторяться до тех пор, пока выполняется определенное условие или до тех пор, пока не будет выполнено определенное условие.
Циклы со счетчиком
Циклы со счетчиком (с известным числом повторений) в Visual Basic еще называют циклами For, или циклами For … Next. Так они называются потому, что начало и конец этих циклов определяются операторами For и Next. Синтаксис цикла For. . .Next таков:
For СчетчикЦикла= НачальноеЗначение To КонечноеЗначение [Step Шаг]
Блок операторов
[Exit For]
Next [СчетчикЦикла]
где
For – ключевое слово Visual Basic, обозначающее начало цикла;
СчетчикЦикла– переменная, определенная в качестве счетчика цикла;
НачальноеЗначение – число, задающее начальное значение счетчика;
То – ключевое слово Visual Basic, разделяющее НачальноеЗначение и КонечноеЗначение – число, задающее значение счетчика, при котором цикл завершается;
Step – ключевое слово Visual Basic, используемое для задания шага цикла, необязательный аргумент;
Шаг – число, задающее шаг цикла, т.е. значение на которое увеличивается (или уменьшается) значение счетчика на каждом шаге, это число может быть отрицательным;
Exit For – оператор досрочного выхода из цикла (необязательный);
Next – ключевое слово Visual Basic, обозначающее конец цикла.
В начале цикла For …Next определяется переменная-счетчик, а так же начальное и конечное значения этой переменной. В самом начале выполнения цикла переменная – счетчик устанавливается в начальное значение. Каждый раз, когда программа пройдя через цикл, возвращается к его началу, значение счетчика увеличивается. Если используется ключевое слово Step, то переменная- счетчик изменяется в соответствии с числом, указанным после ключевого слова Step. Например:
For I = 0 То 10 Step 2 ‘ Значение I будет увеличиваться на 2
Если ключевое слово Step отсутствует, то значение шага равно единице.
Каждый раз, когда значение переменной-счетчика изменяется, оно сравнивается с заданным конечным значением счетчика. Если значение счетчика превышает конечное значение, программа сразу выходит из цикла и переходит к той строке кода, которая следует за циклом.
Пример:
Option Explicit
Dim I As Integer
For I = 1 To 4
Sum =Sum + 2
Next I
Этот цикл эквивалентен написанию четырех операторов Sum =Sum + 2 в тексте программы.
Цикл For . . . Next Может быть прерван досрочно, например, при достижении какого – либо условия. Для этого в нужном месте цикла нужно поместить оператор Exit For. Например:
Option Explicit
Dim Sum As Integer
Dim j As Integer
Sum = 2
For j = 1 To 10
Sum = Sum + j
If Sum > 6 Then
Exit For ‘ Выход из цикла, если значение Sum больше 6
End If
Next j
TextBox1.Text = Sum
В этом примере цикл прерывается досрочно, когда значение переменной Sum будет больше 6. В результате выполнения этого кода в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.
Циклы с условием
Главной особенностью циклов с условием является условие, которое может быть любым выражением, принимающим значение True (Истина) или False (Ложно). В Visual Basic есть два основных цикла с условием – цикл Do While … Loop и цикл Do Until … Loop. Оба они могут быть с предусловием или с постусловием.
Циклы Do While | Until имеет следующий синтаксис:
где
Do – ключевое слово;
While | Until – ключевые слова, указывающие тип цикла;
Выражение – выражение условия, принимающее значение True или False;
Loop – ключевое слово, указывающее на окончание цикла.
Цикл Do While выполняется до тех пор, пока выражение условия имеет значение True.
Пример цикла Do While, реализующего алгоритм программы, аналогичный приведенной в примере для цикла For с досрочным прерыванием:
Option Explicit
Dim Sum As Integer
Dim j As Integer
Sum = 2
Do While Sum < 7
Sum = Sum + j
j = j + 1
Loop
TextBox1.Text = Sum
В результате выполнения этого кода в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.
В отличие от цикла Do While цикл Do Until выполняется до тех пор, пока выражение условия имеет значение False.
Пример цикла Do Until, реализующего алгоритм программы аналогичный приведенному выше:
Option Explicit
Dim Sum As Integer
Dim j As Integer
Sum = 2
Do Until Sum >7
Sum = Sum + j
j = j + 1
Loop
TextBox1.Text = Sum
В результате выполнения этого примера в текстовом поле будет выведено вычисленное значение переменной Sum равное 8.
Иногда бывает необходимо прервать цикл Do … Loop, если выполняется какое-либо дополнительное условие. Это может быть сделано с помощью оператора Exit Do. Например:
Option Explicit
Dim Sum As Integer
Dim j As Integer
Sum = 2
Do Until Sum > 7
Sum = Sum + j
j = j + 1
If j > 3 Then
Exit Do ‘ Досрочный выход из цикла Do … Loop
End If
Loop
TextBox1.Text = Sum
В этом примере цикл с условием досрочно прерывается, если выполняется дополнительное условие j > 3. В результате выполнения программного кода переменная Sum будет иметь значение, равное 8.
Используя цикл с условием можно организовать бесконечный цикл. Иногда это бывает необходимо, а иногда это происходит из-за ошибки пользователя. Для создания бесконечного цикла условное выражение должно быть таким, которое никогда не выполняется или выполняется всегда. Например:
Do Until 1
Операторы
Loop
Выйти из такого бесконечного цикла и прервать работу программы можно нажав комбинацию клавиш <Ctrl+Break>.
Источник