Цикл с параметром for basic
- 07/20/2015
- Чтение занимает 4 мин
В этой статье
Повторяет группу инструкций указанное число раз.
Синтаксис
For counter [ As datatype ] = start To end [ Step step ] [ ements ] [ Continue For ] [ ements ] [ Exit For ] [ ements ] Next [ counter ]
Компоненты
Отделение | Описание |
---|---|
counter | Требуется в For инструкции. Числовая переменная. Управляющая переменная для цикла. Дополнительные сведения см. в подразделе аргумент Counter далее в этой статье. |
datatype | Необязательный элемент. Тип данных counter . Дополнительные сведения см. в подразделе аргумент Counter далее в этой статье. |
start | Обязательный. Числовое выражение. Начальное значение counter. |
end | Обязательный. Числовое выражение. Конечное значение counter . |
step | Необязательный элемент. Числовое выражение. Величина, на которую counter увеличивается каждый раз с помощью цикла. |
ements | Необязательный элемент. Одна или несколько инструкций между For и Next выполняются указанное число раз. |
Continue For | Необязательный элемент. Передает управление в следующую итерацию цикла. |
Exit For | Необязательный элемент. Передает управление за пределы For цикла. |
Next | Обязательный элемент. Завершает определение For цикла. |
Примечание
ToКлючевое слово используется в этом операторе для указания диапазона счетчика. Это ключевое слово также можно использовать в SELECT… Оператор Case и в объявлениях массивов. Дополнительные сведения об объявлениях массивов см. в разделе оператор Dim.
Простые примеры
Используйте For структуру…, Next Если нужно повторить набор инструкций заданное число раз.
В следующем примере index переменная начинается со значения 1 и увеличивается при каждой итерации цикла, после чего значение index достигает 5.
For index As Integer = 1 To 5 Debug.Write(index.ToString & ” “) Next Debug.WriteLine(“”) ‘ Output: 1 2 3 4 5
В следующем примере number переменная начинается с 2 и уменьшается на 0,25 в каждой итерации цикла, после чего значение number достигнет 0. StepАргумент класса -.25 сокращает значение на 0,25 при каждой итерации цикла.
For number As Double = 2 To 0 Step -0.25 Debug.Write(number.ToString & ” “) Next Debug.WriteLine(“”) ‘ Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0
Совет
Ответ … Конец оператора while или Do… Оператор Loop хорошо работает, если заранее неизвестно, сколько раз нужно выполнять инструкции в цикле. Однако, если вы планируете выполнять цикл определенное число раз, For Next лучше выбрать цикл…. Число итераций определяется при первом входе в цикл.
Вложенные циклы
Можно вложить For циклы, поместив один цикл в другой. В следующем примере показаны вложенные For структуры… Next , имеющие разные значения шага. Внешний цикл создает строку для каждой итерации цикла. Внутренний цикл уменьшает переменную счетчика цикла для каждой итерации цикла.
For indexA = 1 To 3 ‘ Create a new StringBuilder, which is used ‘ to efficiently build strings. Dim sb As New System.Text.StringBuilder() ‘ Append to the StringBuilder every third number ‘ from 20 to 1 descending. For indexB = 20 To 1 Step -3 sb.Append(indexB.ToString) sb.Append(” “) Next indexB ‘ Display the line. Debug.WriteLine(sb.ToString) Next indexA ‘ Output: ‘ 20 17 14 11 8 5 2 ‘ 20 17 14 11 8 5 2 ‘ 20 17 14 11 8 5 2
При вложенных циклах каждый цикл должен иметь уникальную counter переменную.
Вы также можете вкладывать различные виды управления в друг друга. Дополнительные сведения см. в разделе вложенные структуры управления.
Выход и продолжение для
Exit ForОператор немедленно завершает работу For …Next выполняет цикл и передает управление оператору, который следует за Next оператором.
Continue ForОператор передает управление сразу в следующую итерацию цикла. Дополнительные сведения см. в разделе оператор continue.
В следующем примере показано использование Continue For Exit For операторов и.
For index As Integer = 1 To 100000 ‘ If index is between 5 and 7, continue ‘ with the next iteration. If index >= 5 AndAlso index <= 8 Then Continue For End If ‘ Display the index. Debug.Write(index.ToString & ” “) ‘ If index is 10, exit the loop. If index = 10 Then Exit For End If Next Debug.WriteLine(“”) ‘ Output: 1 2 3 4 9 10
Можно разместить любое количество Exit For операторов в For …Next повторить. При использовании внутри вложенного For …Next выполняет цикл, Exit For выходит из внутреннего цикла и передает управление следующему более высокому уровню вложенности.
Exit For часто используется после вычисления некоторого условия (например, в If … Then …Else структура). Может потребоваться использовать Exit For для следующих условий:
Продолжение итерации не требуется или невозможно. Это условие может быть создано с помощью ошибочного значения или запроса на завершение.
А.. Try . Catch …Finally перехватывает исключение. Exit ForВ конце блока можно использовать Finally .
У вас есть бесконечный цикл, который может выполняться с большим или даже бесконечным числом раз. При обнаружении такого условия можно использовать Exit For для экранирования цикла. Дополнительные сведения см. в разделе Do… Loop, инструкция.
Техническая реализация
При For запуске цикла… Next Visual Basic вычисляет start , end и step . Visual Basic вычисляет эти значения только в данный момент, а затем присваивает значение start counter . Перед выполнением блока операторов Visual Basic сравнивается counter с end . Если counter уже больше end значения (или меньше step , если имеет отрицательное значение), For цикл завершается, и управление передается оператору, следующему за Next оператором. В противном случае выполняется блок операторов.
Каждый раз, когда Visual Basic обнаруживает Next оператор, он увеличивается на counter step и возвращается в For оператор. Затем он сравнивает counter с end и снова либо выполняет блок, либо выходит из цикла, в зависимости от результата. Этот процесс выполняется до тех пор counter , пока не будет пройден end или Exit For не встретится оператор.
Цикл не останавливается, пока не будет counter пройден end . Если counter равно end , цикл продолжится. Сравнение, которое определяет, следует ли запускать блок, counter <= end Если step является положительным и counter >= end step отрицательным.
Если изменить значение counter во время цикла, код может оказаться труднее для чтения и отладки. Изменение значения start , end или step не влияет на значения итерации, которые были определены при первом входе в цикл.
При вложении циклов компилятор сообщает об ошибке, если обнаруживает Next оператор внешнего уровня вложенности перед Next инструкцией внутреннего уровня. Однако компилятор может обнаружить эту перекрытие ошибки только в том случае, если указать counter в каждой Next инструкции.
Аргумент Step
Значение step может быть либо положительным, либо отрицательным. Этот параметр определяет обработку цикла в соответствии со следующей таблицей.
Значение шага | Цикл выполняется, если |
---|---|
Положительный или нулевой | counter <= end |
Отрицательное число | counter >= end |
Значение step по умолчанию – 1.
Аргумент счетчика
В следующей таблице показано counter , определяет ли новая локальная переменная, областью действия которой является весь For…Next цикл. Это определение зависит от того, существует ли оно datatype и counter уже определено ли оно.
datatypeИмеется? | counterУже определено? | Результат ( counter определяет, определена ли новая локальная переменная в пределах всего For…Next цикла) |
---|---|---|
Нет | Да | Нет, так как counter уже определено. Если область действия counter не является локальной для процедуры, возникает предупреждение во время компиляции. |
Нет | Нет | Да. Тип данных выводится из start end выражений, и step . Дополнительные сведения о выводе типа см. в разделе Option Infer и определение локального типа. |
Да | Да | Да, но только в том случае, если существующая counter переменная определена за пределами процедуры. Эта переменная остается отдельной. Если область существующей counter переменной является локальной для процедуры, возникает ошибка времени компиляции. |
Да | Нет | Да. |
Тип данных параметра counter определяет тип итерации, который должен быть одним из следующих типов:
A Byte , SByte , UShort , Short , UInteger , Integer , ULong , Long , Decimal , или Double .
Перечисление, объявляемое с помощью инструкции enum.
Объект Object.
Тип T , имеющий следующие операторы, где B – это тип, который можно использовать в Boolean выражении.
Public d Operator >= (op1 As T, op2 As T) As B
Public d Operator <= (op1 As T, op2 As T) As B
Public d Operator – (op1 As T, op2 As T) As T
Public d Operator + (op1 As T, op2 As T) As T
При необходимости можно указать counter переменную в Next инструкции. Этот синтаксис повышает удобочитаемость программы, особенно при наличии вложенных For циклов. Необходимо указать переменную, которая отображается в соответствующем For операторе.
startВыражения, end и step могут иметь любой тип данных, который расширяется до типа counter . При использовании определяемого пользователем типа для может потребоваться counter определить CType оператор преобразования для преобразования типов start , end или step в тип counter .
Пример
В следующем примере удаляются все элементы из универсального списка. Вместо a для каждого… Следующий оператор. в примере показана For инструкция… Next , которая выполняет итерацию в убывающем порядке. В этом примере используется этот метод removeAt , поскольку метод заставляет элементы после удаленного элемента иметь меньшее значение индекса.
Dim lst As New List(Of Integer) From {10, 20, 30, 40} For index As Integer = lst.Count – 1 To 0 Step -1 lst.RemoveAt(index) Next Debug.WriteLine(lst.Count.ToString) ‘ Output: 0
Пример
В следующем примере перебирается перечисление, объявленное с помощью инструкции enum.
Public Enum Mammals Buffalo Gazelle Mongoose Rhinoceros Whale End Enum Public Sub ListSomeMammals() For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros Debug.Write(mammal.ToString & ” “) Next Debug.WriteLine(“”) ‘ Output: Gazelle Mongoose Rhinoceros End Sub
Пример
В следующем примере параметры инструкции используют класс, который содержит перегрузки операторов для + операторов,, – >= и <= .
Private Class Distance Public Property Number() As Double Public Sub New(ByVal number As Double) Me.Number = number End Sub ‘ Define operator overloads to support For…Next ements. Public d Operator +(ByVal op1 As Distance, ByVal op2 As Distance) As Distance Return New Distance(op1.Number + op2.Number) End Operator Public d Operator -(ByVal op1 As Distance, ByVal op2 As Distance) As Distance Return New Distance(op1.Number – op2.Number) End Operator Public d Operator >=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean Return (op1.Number >= op2.Number) End Operator Public d Operator <=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean Return (op1.Number <= op2.Number) End Operator End Class Public Sub ListDistances() Dim distFrom As New Distance(10) Dim distTo As New Distance(25) Dim distStep As New Distance(4) For dist As Distance = distFrom To distTo Step distStep Debug.Write(dist.Number.ToString & ” “) Next Debug.WriteLine(“”) ‘ Output: 10 14 18 22 End Sub
См. также
- List<T>
- Циклические структуры
- Оператор While…End While
- Оператор Do…Loop
- Вложенные структуры управления
- Оператор Exit
- Коллекции
Источник
Цикл For… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For… Next.
Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла – счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.
Синтаксис цикла For… Next
For counter = start To end [ Step step ] [ ements ] [ Exit For ] [ ements ] Next [ counter ] |
For счетчик = начало To конец [ Step шаг ] [ операторы ] [ Exit For ] [ операторы ] Next [ счетчик ] |
В квадратных скобках указаны необязательные атрибуты цикла For… Next.
Компоненты цикла For… Next
Компонент | Описание |
---|---|
counter | Обязательный атрибут. Числовая переменная, выполняющая роль счетчика, которую еще называют управляющей переменной цикла. |
start | Обязательный атрибут. Числовое выражение, задающее начальное значение счетчика. |
end | Обязательный атрибут. Числовое выражение, задающее конечное значение счетчика. |
Step* | Необязательный атрибут. Оператор, указывающий, что будет задан шаг цикла. |
step | Необязательный атрибут. Числовое выражение, задающее шаг цикла. Может быть как положительным, так и отрицательным. |
ements | Необязательный** атрибут. Операторы вашего кода. |
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 функцию рабочего листа Worksheet.Round для округления числа перед использованием его в цикле For… Next.
Источник
Циклы
Последнее обновление: 30.10.2015
Еще одним видом управляющих конструкций являются циклы. В VB.NET используется несколько видов циклов.
For…Next
For Each…Next
While
Do
Цикл For…Next
В этом цикл выполняется определенное число раз, причем это число задается счетчиком:
For i As Integer = 1 To 9 Console.WriteLine(“Квадрат числа {0} равен {1}”, i, i * i) Next
Здесь переменная i выполняет роль счетчика. После слова To мы помещаем максимальное значение счетчика. При каждом цикле значение счетчика увеличивается на единицу. И это значение сравнивается со значением после To. Если эти два значения равны, то цикла прекращает свою работу.
При работе с циклами мы можем увеличивать значение счетчика при каждом проходе не только на единицу, но и вообще на любое число. Для этого нужно либо использовать ключевое слово Step и после него указать шаг цикла, на который будет увеличиваться значение счетчика, либо можно увеличивать счетчик непосредственно в цикле:
For i As Integer = 1 To -9 Step -1 For j As Integer = 1 To 9 Console.WriteLine(“Произведение чисел i и j равно {0}”, i * j) j += 1 Next Next
Обратите внимание, что в качестве шага в первом цикле выбрано отрицательное значение и значение счетчика с каждым проходом уменьшается на единицу. Во внутреннем цикле счетчик j при каждом проходе увеличивается на 2, так как он по умолчанию увеличивается на единицу, и еще мы явным образом увеличиваем его в цикле на единицу. В итоге внутренний цикл отрабатывает пять раз, а внешний девять, то есть фактически получается 45 циклов.
Цикл For Each…Next
Цикл For Each осуществляет перебор элементов в определенной группе, например, в массиве или в коллекции. Предположим у нас есть некоторый массив типа Integer и нам надо инициализировать этот массив случайными значениями и затем вывести все его элементы на экран:
‘Создаем массив из пяти чисел Dim nums(4) As Integer Dim r As New Random() ‘инициализируем массив For i As Integer = 0 To nums.Length – 1 nums(i) = r.Next(100) Next ‘Выводим элементы массива For Each i As Integer In nums Console.Write(“{0} “, i) Next
В выражении For Each мы сначала указываем переменную, которая будет принимать значения элементов массива. А после ключевого слова In указываем группу, в которой надо перебрать все элементы.
Цикл While
В цикл While выполняется до тех пор, пока соблюдается определенное условие, указанное после слова While:
Dim j As Integer = 10 While j > 0 Console.WriteLine(j) j -= 1 End While
Цикл Do
Цикл Do, также как и цикл While, выполняется, пока соблюдается определенное условие. Однако он имеет разные формы. Так, в следующем примере сначала проверяется условие, а затем выполняется блок кода, определенный в цикле:
Dim j As Integer = 10 Do While j > 0 Console.WriteLine(j) j -= 1 Loop
В данном случае цикл выполняется, пока значение j больше нуля. Но есть еще одна запись, где вместо слова While используется слово Until, а цикл выполняется пока не соблюдено определенное условие, то есть пока значение j не станет меньше нуля:
Dim j As Integer = 10 Do Until j < 0 Console.WriteLine(j) j -= 1 Loop
Если изначально условие, заданное в цикле, неверно, то цикл не будет работать. Но мы можем определить проверку в конце цикла, и таким образом, наш цикл как минимум один раз отработает:
Dim j As Integer = -1 Do Console.WriteLine(j) j -= 1 Loop Until j < 0 ‘либо Do Console.WriteLine(j) j -= 1 Loop While j > 0
Операторы Continue и Exit
Нередко возникает необходимость не дожидаться окончания цикла, а сразу же выйти из цикла, в случае соблюдения определенного условия. Для этого используют оператор Exit, после которого указывают тип цикла, из которого осуществляется выход, например, Exit Do (Exit While):
Dim r As New Random() Dim num As Integer = r.Next(100) For i As Integer = 0 To 100 num -= 1 If num < 50 Then Exit For Next Console.WriteLine(num)
Существует и другая задача – осуществить выход не из цикла, а из текущего прохода или итерации и перейти к следующему. Для этого используют оператор Continue, после которого указывают тип цикла, из которого осуществляется выход, например, Continue While:
Dim r As New Random() Dim num As Integer = r.Next(100) For i As Integer = 0 To 10 num -= 7 If num < 50 AndAlso num > 25 Then Continue For End If Console.WriteLine(num) Next
В данном случае мы в каждом проходе цикла вычитаем из num число 7 и затем смотрим, не принадлежит ли число num интервалу от 25 до 50. И если принадлежит, переходим к новой итерации цикла, а если нет, то выводим его на экран.
Источник