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

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

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

Такие данные на активном листе 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.

Лабораторные работы по основам программирования

2.1. Табулирование функций, представленных аналитически
и сходящимся рядом

Цель работы

· Закрепление теоретических знаний по основам организации разветвляющихся и циклических структур.

· Приобретение практических навыков программирования с использованием разветвляющихся и циклических структур в системе Visual Basic.

В VB существуют три вида операторов цикла:

· счетный цикл: For…To … Next

· циклы с предусловиями: Do While...Loop, Do Until...Loop, While…WEnd

· циклы с постусловиями:Do...Loop While, Do...Loop Until.

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

For счетчик = начало To конец

[операторы ]

[операторы ]

Next [счетчик ]

Параметр счетчик – это числовая переменная (целого, вещественного типа или типа Date, Variant, Currency), которая автоматически увеличивается после каждого повтора. Начальное значение счетчика равно параметру начало, а конечное параметру – конец. Если не указан, то шаг считается равным 1, значение шага можно изменять. Оно может быть положительным или отрицательным числом.

Существуют четыре синтаксические конструкции цикла Do….Loop:

Операторы между ключевыми словами Do … Loop выполняются заданное количество раз в зависимости от условия. Например, в следующем фрагменте программы при C = 100 условие будет выполняться и произойдет вход в цикл. Внутри цикла происходит обращение к процедуре и уменьшение значения C на 1. Далее вновь проверяется условие (C > 0) и операторы цикла выполняются повторно (всего они выполнятся 100 раз), до C = 0. Когда же условие C >0 становится ложным и цикл прекращается.

Do While C > 0

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

В данном случае цикл выполняется, пока условие равно False, в отличие от предыдущего случая, то есть продолжается до выполнения условия C = 0.

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

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



Do Until C <= 0

MsgBox “Нач. значение больше допустимого”, ”Ошибка ввода”

Цикл While…Wend использовался в ранних версиях Visual Basic. Его синтаксис следующий:

While <условие>

<Операторы>

В отличии от цикла Do..Loop цикл While ..Wend не имеет второго варианта, в котором проверка условия выполняется в конце цикла. Кроме того, для него нет оператора выхода из цикла, наподобие Exit Do.

Урок из серии: «Программирование на Visual Basic.NEN для школьников»

Вы познакомились с элементом управления ComboBox (Комбинированный список).
На этом занятии мы продолжим изучение операторов языка Visual Basic.Net, остановимся на операторах цикла.
Циклические алгоритмические структуры бывают трех видов:

  1. циклы со счетчиком, в которых тело цикла выполняется определенное количество раз;
  2. циклы для обработки массивов или коллекций;
  3. циклы по условию, в которых тело цикла выполняется, пока условие истинно (или до тех пор, пока условие не станет истинным).

На этом уроке рассмотрим оператор цикла со счетчиком (For . . . Next). Напишем проект с использованием этого оператора.

Цикл со счетчиком For . . . Nex t используется тогда, когда заранее известно, какое число повторений необходимо выполнить.

Блок-схема

Общий вид оператора

For Счетчик = НачЗнач To КонЗнач Тело цикла Next [Счетчик]

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

Алгоритм выполнения оператора For . . . Next

  1. Значение переменной Счетчик устанавливается равным НачЗнач.
  2. Проверяется условие Счетчик <= КонЗнач
  3. Если условие выполняется, то выполняется тело цикла. Переменная Счетчик изменяется на величину шага: Счетчик = Счетчик + шаг.
  4. Когда переменная Счетчик достигает величины КонЗнач, происходит выход из цикла и выполняются следующие за ним операторы.

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

Проект «Доход по вкладу»

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

Технология выполнения

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

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

7.2.1. Параметрический цикл For… Next

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

Синтаксис цикла: For ИПЦ=НЗПЦTo КЗПЦ[Step ШИПЦ] Тело цикла (одна или несколько инструкций) Next [ИПЦ]

Слова For (для), To (до), Step (шаг), Next (затем) являются зарезервированными.

Применены обозначения:

ИПЦ – имя параметра цикла (переменная любого числового типа);

НЗПЦ – начальное значение параметра цикла (выражение любого числового типа), которое параметр цикла будет иметь при первом выполнении тела цикла;

КЗПЦ – конечное значение параметра цикла (выражение любого числового типа), с которым сравнивается текущее значение параметра цикла;

ШИПЦ – шаг изменения параметра цикла (выражение любого числового типа) – необязательная часть инструкции цикла.

Числовые значенияНЗПЦ и КЗПЦ задают интервал, в котором будет изменяться параметр цикла. Необязательный параметр ШИПЦ задает шаг изменения счетчика цикла на каждом проходе. По умолчанию, если он отсут–ствует, то принимается равным 1. Наконец, после инструкций, составляющих тело цикла, следует команда, обозначающая границу действия цикла. В случае вложенных циклов (в тело цикла входит инструкция цикла) полезно указывать, к какому из них относится команда Next . Это достигается добавлением после слова Next имени параметра цикла.

Процесс выполнения инструкции For Next для положительного шага иллюстрирует рисунок 7.4.

Рассмотрим примеры.

В первом примере запишем инструкции для вычисления суммы всех целых нечетных чисел от 1 до 100.

Dim I As Integer, Сумма As Integer

For i = 1 To 100 Step 2

Сумма = Сумма +i

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

Dim N As Integer

For N = 100 To 60 Step –10

Этот код выведет на текущей форме:

Следующая инструкция заставляет компьютер подавать звуковой сигнал 50 раз. Инструкция For определяет, что параметром цикла является переменная x , ее начальное и конечное значения. Команда Next изменяет счетчик с шагом.

Dim x As Integer

Инструкцию For...Next можно завершить досрочно с помощью инструкции Exit For. Выполнение этой инструкции приводит к немедленному выходу из цикла.

7.2.2. Инструкция цикла Do While...Loop или Do...Loop While

Здесь While (пока) и Loop (цикл) зарезервированные слова. Циклы типа While предназначены для ситуаций, когда количество повторений тела цикла (итераций) заранее не известно. Вот синтаксис двух разновидностей цикла While :

Do While УсловиеПовторения Группа инструкций Loop

Do Группа инструкций Loop While УсловиеПовторения

Различие между ними заключается в том, что УсловиеПовторения (условие повторения выполнения тела цикла) проверяется в первом случае до выполнения тела цикла (цикл – пока), а во втором случае – после выполнения тела цикла (цикл – до).

Перейдем к примерам.

Рассмотрим действие следующего участка программы.

Счетчик = 0

Do While Номер > 10

Номер = Номер - 1

Счетчик = Счетчик + 1

MsgBox ("Выполнено " & Счетчик & ­_

" итераций цикла.")

При выполнении этого участка программы в окне функции MsgBox будет выведено:

Выполнено 10 итераций цикла.

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

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

Счетчик = 0

Номер = Номер - 1

Счетчик = Счетчик + 1

Loop While Номер > 10

MsgBox ("В цикле выполнено " & Счетчик & _

" итераций.")

Инструкцию Do...Loop можно завершить досрочно с помощью инструкции Exit Do .

Последнее обновление: 30.10.2015

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

Цикл 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. И если принадлежит, переходим к новой итерации цикла, а если нет, то выводим его на экран.