Циклы в vb6 cо счетчиком примеры. Циклы VBA (ч.1). Команды организации циклов. Выход для оператора

Синтаксис оператора:

For Счетчик = Начало Т o Конец [Step Шаг ]

Блок_Операторов

Next Счетчик

Здесь обозначено:

For для (обязательное ключевое словоVB);

To до (обязательное ключевое словоVB);

Блок_Операторов – один или несколько операторов, называемыхтелом цикла;

Счетчик – целая переменная, которая считает количество выполняемых циклов;

Начало, Конец – начальное и конечное значения счетчика;

Step шаг (ключевое словоVB);

Шаг – шаг изменения счетчика; может быть и отрицательным; параметр необязательный, так как если шаг равен 1, можноStepШаг опустить;

Next– следующий (обязательное ключевое словоVB, конец записи оператора цикла).

Значение счетчика (Начало, Конец) могут быть численными константами или переменными целого или вещественного типа, могут быть отрицательными или положительными числами. Чтобы тело цикла выполнилось хотя бы один раз, должно бытьНачало ≤ Конец, еслиШаг > 0, иНачало ≥ Конец, еслиШаг < 0. Как только окажется, чтоСчетчик >Конец (если Начало < Конец), выполнение цикла заканчивается. ЕслиНачало = Конец, цикл выполнится один раз;

Пример 9.1 .Вычисление функции Y = 2 – 1.5 Sinx при изменении Х с шагом 0.2 в диапазоне .

Фрагмент программы по вычислению Yи вывода аргумента Х и функцииY:

For X = 0 To 2.4 Step 0.2

Y = 2 – 1.5*Sin(X)

Чтобы понять, как работает этот цикл, приведем программу подобного цикла, созданного с помощью оператора GoTo , меток, оператора If Then .

M1: X = X + 0.2

If X <= 2.4 Then

Y = 2 – 1.5*Sin(X)

Разберем работу этой программы. Первый расчет Yнестандартный, как бы выпадает из цикла. Цикл начинается после первой передачи управленияGoToM1 на метку М1. В строке с меткой М1 аргумент Х увеличивается на шаг 0.2 и сразу идет проверка, не превышает ли новое значение Х конечного значения 2.4. Если не превышает, то расчетYповторяется с этим новым Х. Потом снова выполняется операторGoToM1 – передача управление в строку с меткой М1. Эти повторы (циклы) расчетаYзакончатся, как только Х превысит 2.4.

Теперь программу с Ifсравним с цикломFor…Next.

For X = 0 To 2.4 Step 0.2

заменяет собой две строки

M1: X = X + 0.2

If X <= 2.4 Then

Именно две последние строки кода выполняются в цикле For, но мы этого не видим. Мы закодировали их строкой сFor… Строка кодаGoTo M1 закодирована словомNext X (буквально: следующий Х). Получается компактная конструкция.

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

Пример 9.2 . Определение суммы элементов ряда: .

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 1 To 16 ‘ счетчик i – это знаменатель дроби

S = S + 1/i ‘ накопление суммы

Print “ S = “; S ‘ вывод суммы S на форму

При каждом значении счетчика iвыражение 1/iпоследовательно формирует элементы ряда, начиная с 1.

Пример 9.3 . Вычисление суммы ряда элементов
.

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 1 To 18 ‘ счетчик i – числитель

S = S + i/(i + 1) ‘ знаменатель больше числителя на 1

Print “ S = “; S ‘ вывод суммы S на форму

Пример 9.4 . Вычисление суммы: 5 + 8 + 11 + … + 32 + 35

Фрагмент программы:

S = 0 ‘ S – сумма ряда

For i = 5 To 35 Step 3 ‘ получаем арифметическую _

прогрессию со знаменателем 3

Print “ S = “; S

Пример 9.5. Вычисление суммы для заданного х:

Анализ задачи показывает, что степень при Х изменяется от 1 до 10. При этом числитель в коэффициенте при Х больше степени на 1, а знаменатель – на 2. Значение степени будем формировать с помощью счетчика i. Тогда можно составить такую программу (фрагмент):

S = 1 ‘ S – сумма ряда

For i = 1 To 10 ‘ как счетчик i, изменяется степень при Х

S = S + (-1)^i*(i + 1)*x^i / (i + 2)

Print “ S = “; S

Циклы For Next используются при вводе, выводе и обработке массивов .

Пример 9.6. Ввод и вывод значений элементов массива В(N ).

Фрагмент программы:

‘ Опускаем присваивание переменной N значения, _

введенного на форме в текстовое поле txtN:

B(i) = InputBox("Введите элемент B(" & i & ")", _

"Ввод массива B(" & N & “)”)

Print " "; B(i);

Функция InputBox () выводит на экран диалоговое окно с кнопкой закрытия, заданным сообщением, полем ввода, кнопкамиОК ,Отмена, заданным заголовком (или без него). Если будет введено число 12 – размер массиваN, то в нашем примере при первом появлении это окно будет иметь вид:

Как видим, сообщение Введите элемент В(1) предлагает ввести значение 1-го элемента в текстовое окно. Появится это окно 12 раз, так как массив содержит 12 элементов. Это следует из заголовка формы. Индекс элемента В(i) в приглашении будет меняться от 1 до 12.

Если требуется вывести на форму только значения элементов массива В(N), то тело цикла будет состоять из одного оператора:

Просмотр элементов массива для совершения над ними каких-то действий также происходит с помощью оператора цикла For…Next.

Приведем примеры обработки одномерных массивов.

Пример 9.7 . Определение максимального элемента в массиве В(M ).

Исключая ввод начальных данных и вывод результатов, кратко опишем алгоритм:

    Объявим переменную Вmaх, в которую занесем значение первого элемента массива, и переменнуюImax, которой присвоим 1 – индекс первого элемента массива.

    В цикле с помощью оператора For…Nextпросматриваем все элементы массива, начиная со 2-го. Используя операторIf…Then, сравниваем их значения со значением, которое хранится в переменнойBmax.

    Если окажется, что значение элемента массива больше величины Bmax, тоBmaxприсваиваем значение этого элемента, а значениюImax– индекс этого элемента массива.

После окончания цикла в переменной Bmaxокажется значение максимального элемента, а вImax– его индекс (номер).

Программа этой части алгоритма.

Bmax = B(1): Imax = 1

If B(i) > Bmax Then Bmax = B(i): Imax = i

Пример 9.8. Определение суммы, произведения и количества положительных элементов массива D (M ).

Переменные: S,P,K– соответственно сумма, произведение и количество положительных элементов.

Алгоритм такого определения:

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

    С помощью цикла For…Nextперебираем все элементы массива и проверяем положительные ли они (D(i) > 0).

    Если окажется, что элемент – положительный, то прибавляем его значение к значению суммы Sи сохраняем новую сумму в этой же переменной. ПеременнуюPумножаем на положительное значение элемента и сохраняем также в переменнойP. А к переменнойKприбавляем 1 и сохраняем новое значение в этой же переменной

Программа этой части алгоритма имеет вид:

S = 0: P = 1: K = 0

If D(i) > 0 Then

S = S + D(i) ‘ так происходит накопление суммы _

положительных значений элементов массива D(i)

P = P*D(i) ‘ определение произведения положительных

‘ элементов массива

K = K + 1 ‘ этот оператор называют СЧЕТЧИКОМ, здесь он

‘ определяет количество положительных элементов массива

Пример 9.9. Определение суммы, произведения, количества и среднего значения нечетных элементов массива D (M ).

Приведем фрагмент программы такого определения.

S = 0: P = 1: K = 0

If D(i) Mod 2 <> 0 Then

Ssr = S/k ‘ вычисление среднего значения нечетных элементов

Сравните этот фрагмент программы с программой Примера 9.8. Эта программа почти полностью повторяет предыдущую. Изменено только условие в операторе If. УсловиеD(i) Mod 2 <> 0 означает, что мы ищем элементы массиваD(i), которые не делятся нацело на 2, т. е. нечетные элементы. Если будем проверять условиеD(i) Mod 2 = 0, то мы будем отбирать четные элементы массива.

Как известно, деление по Mod даетв результате остаток от деления в целых числах. Например, после выполнения оператораd= 34Mod4 переменнаяdбудет равна 2. Поэтому для отбора элементов массива, которые кратны 4, надо проверять условиеD(i) Mod 4 = 0. Аналогичным будет условие, если будем искать элементы, кратные другим числам. Вместо 4 будут записаны эти другие числа.

Пример 9.10. Запись элементов массива R (N ), кратных 5, в другой массив и вывод нового массива на форму.

Другой массив обозначим, например, R5(N). Размер этого нового массива следует принять таким же, как исходный, т. к. в предельном случае все элементы могут быть кратными 5.

Алгоритм задачи:

    Обнуляем счетчик k. С помощью оператора циклаFor…Nextпросматриваем все элементы массиваR(N).

    Каждый элемент проверяем на кратность 5, используя оператор If…Thenи деление элемента массива поMod.

    Если элемент кратен 5, то с помощью счетчика типа k=k+ 1 формируем индексы массиваR5(N), начиная с 1, и записываем его в этот другой массив –R5(N).

    Если kотлично от нуля, выводим массивR5() на форму.

    Если же kравно нулю выводим: «Нет элементов, кратных 5».

Фрагмент программы:

If R(i) Mod 5 Then k = k + 1: R5(k) = R(i)

If k <> 0 Then

Print “Нет элементов, кратных 5”

Циклы могут быть вложенными в другие циклы.

Продемонстрируем работу вложенных циклов . Ниже в программе организован вывод значений счетчиков цикловi,jиk. Из результатов выводаi,j,kстановится понятно, как выполняются вложенные циклы.

Private Sub frmCycle_DblClick()

ScaleMode = 4 ‘единицы измерения – символы

For i = 1 To 3 ‘внешний цикл

Print "i = "; i;

For j = 1 To 4 ‘1-й вложенный цикл

CurrentX = TextWidth("i = 1 ") + 5

Print "j = "; j;

CurrentX = TextWidth("i = 1 j = 1 ") + 7

For k = 1 To 5 ‘2-й вложенный цикл

На изображенной форме (рис. 1) приведены результаты вывода счетчиков всех трех циклов: внешнего цикла – счетчик i, первого вложенного цикла – счетчикjи второго, самого внутреннего цикла – счетчикk. Как видим,самый «медленный» счетчик у внешнего цикла (поi), асамый «быстрый» – счетчик самого внутреннего цикла (по k ).

Программа выполняется после двойного щелчка левой кнопкой мыши по форме frmCicli.

CurrentX, CurrentY – свойства формы, задающие координатыX,Yточки начала вывода информации методомPrint(см. на рис.1 расположение осейXиYна форме).

TextWidth() – функция, возвращающая ширину текста, заданного в функции как аргумент в двойных кавычках.

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

Пример 9.11. Ввод и вывод матрицы (двумерного массива) целых чисел intA (N ).

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

Ввод и вывод матрицы по строкам – фрагмент 1 .

Dim M As Integer, N As Integer, i As Integer, j As Integer

Dim intA() As Integer ‘ объявляем динамический массив

M = Val(txtN.Text) ‘ M – количество строк

N = Val(txtN.Text) ‘ N – количество столбцов

ReDim intA(M, N) As Integer ‘ переопределяем массив

For i = 1 To M ‘ i будет сохранять свое значение, пока полностью

‘не выполнится вложенный цикл по j

Print " "; intA(i, j); ‘ вывод по строкам

Print ‘ переход в начало новой строки

Чтобы вводить матрицу по столбцам, следует внешним сделать цикл по j(задает номера столбцов), а внутренним – цикл поi(задает номера строк).

Ввод и вывод матрицы по столбцам фрагмент 2 .

PrY = 2500: CurrentY = PrY ‘ PrY задает координату Y начала

‘ вывода первого элемента каждого столбца на форме

For j = 1 To N ‘ j будет сохранять свое значение, пока полностью

‘не выполнится вложенный цикл по i

intA (i, j) = InputBox("Введите элемент intA(" & i & “,” & j & ")", _

"Ввод матрицы intA(" & M & “,” & N & ")")

Print Tab(6 * j); intA(i, j) ‘ вывод по столбцам

CurrentY = PrY ‘ для вывода первого элемента

‘ следующего столбца

В этом втором фрагменте программы не повторяются 5 первых строк из первого фрагмента. Функция Tab(6 * j) устанавливает начало вывода в строке (в символах), начиная от левого края формы. КоординатаPrYздесь равна 2500 твипов, но можно подобрать и другое значение.

Пример 9.12 . Упорядочивание значений элементов массива V (N ) по возрастанию.

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

Фрагмент программы, реализующей этот алгоритм:

For i = 1 To N – 1

For j = i + 1 To N

If V(j) < V(i) Then P = V(i): V(i) = V(j): V(j) = P

Поясним этот фрагмент программы.

С помощью внешнего цикла со счетчиком iвыбираем элементV(i) для сравнения с последующими элементами. Внутренний цикл со счетчикомjвыбирает для сравнения последующие элементыV(j). Начальное значениеjравноi+ 1. Это первый элемент из последующих.

Для обмена значений элементов V(i) иV(j) вводим некоторую переменнуюP, в которую временно «прячем» значение одного из элементов массива (в программе – этоV(i)). Затем элементу V(i) присваиваем значение элементаV(j), а элементуV(j) присваиваем значениеV(i), которое хранится в переменнойP. Если «спрячем» вPзначениеV(j), то код по обмену значениями будет таким:P = V(j): V(j) = V(i): V(i) = P. Результат не изменится.

Чтобы упорядочить массив по убыванию , достаточно условие для проверки написать в видеV(j) > V(i), т. е. изменить знак неравенства на другой.

Если массив будет не числовой, а строковый, и в элементы массива будут введены фамилии, то по программе примера 9.12, можно упорядочить список фамилий по алфавиту. Дело в том, что для букв алфавита, используемых в компьютере, справедливы неравенства: А < Б < В < Г….< Я и т. д., поскольку числовые коды букв алфавита последовательно увеличиваются, начиная с А и до конца алфавита. Это же справедливо и для букв английского алфавита.

Пример 9.13 . Вычисление суммы положительных элементов для нечетных столбцов матрицы F (M , N ) и вывод сумм на форму.

Алгоритм программы:

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

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

    Во внутреннем цикле проверяем знак элемента массива.

    Если элемент массива положителен (> 0), вычисляем сумму S.

    После окончания внутреннего цикла выводим сумму Sна форму.

Фрагмент программы :

For j = 1 To N Step 2

If F(i, j) > 0 Then S = S + F(i, j)

Print “Сумма столбца “; j; “:”; S ‘ j – номер столбца!

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

Пример 9.14. Имеется 1801 руб. Сколько можно купить шоколадок по 31 руб. и булок по 18 руб., чтобы полностью потратить все деньги.

Программа:

Сумма = 1801

ВсеШоколадки = Сумма \ 31: ВсеБулки = Сумма \ 18

For i = 1 To ВсеШоколадки

For j = 1 To ВсеБулки

Цена = i * 31 + j * 18 ‘общая цена покупки

If Цена = 1801 Then

Print "Шоколадок: "; i; Tab(19); "Булок: "; j

Поясним программу, в которой используем переменные, названные по-русски.

Сначала определяем, какое максимальное количество только шоколадок или только булок можно купить на всю сумму. Полученные значения ВсеШоколадки и ВсеБулки используем для ограничения количеств переборов по количеству шоколадок и булок. Для каждых значений количества шоколадок (i) и количество булок (j) определяем общую Цену для их покупки. Если рассчитанная Цена равна 1801, то подобранный вариант есть одно из решений задачи.

Функция Tab() указывает, с какой позиции от края формы будет вывод информации, следующий за этой функцией. ЕслиTab(19), то с 19-ой позиции.

Программа выводит 3 возможных вариантов покупки:

Шоколадок 7, булок 88

Шоколадок 25, булок 57

Шоколадок 43, булок 26

Если требуется дать однозначный ответ, надо сформулировать дополнительное условие. Например, «булок было куплено меньше, чем шоколадок». Тогда единственным решением будет 3-й вариант.

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

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

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.

В этом уроке будет рассмотрена работа с циклом For в VBA. Пример работы с циклом For, так же будет продемонстрирован пример создания формул в Excel с помощью макросов.

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

Цикл For имеет следующий синтаксис:
For счетчик = начало цикла To конец цикла [Step шаг ]
группа операторов, команд и т.д.
Exit For
Next счетчик

  • "счетчик" - переменная, которая изменяется на указанный "шаг". Если шаг не указан, то по умолчанию берется единица.
  • "начало цикла" , "конец цикла" - числа или переменные указывающие нижний предел счетчика и верхний. Остановка цикла происходит тогда, когда "счетчик" > "конец цикла" (или, если цикл обратный, т.е. с шагом -1, то "счетчик" < "конец цикла").
  • Exit For – команда принудительной остановки цикла. Применяется в тех случаях, когда произошло некоторое событие, после которого необходимо остановить выполнение команд в цикле, или для предотвращения возникновения ошибки.

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

Пример 1
Даны два столбца С и Е заполненные числами:

Необходимо сложить числа в столбце С с числами столбца Е следующим образом:
С2+Е21, С3+E20, ..., C21+E2. Результат вывести в столбец D в виде формулы т.е. содержание ячейки результата должно быть "=С2+Е21".

Код макроса выглядит следующим образом (куда прописывать код читаем ):

Sub Цикл_For()
"константа указывающая предел цикла т.е. до какого значения циклу бежать
Const n = 21
For i = 2 To n
" создаем строку формулу и сохраняем ее в ячейку
Cells(i, 4) = "=C" & CStr (i) & "+E" & CStr ((n - i) + 2)
" продолжение когда выполняющегося в цикле
Next i
" остальной код программы
End Sub

Разбираем написанный код:

  • Const n = 21 - описание константы n со значением 21, т.е. число строк по которому необходимо пробежаться циклу For ;
  • For i = 2 To n - i счетчик который будет изменяться на 1 с каждым проходом цикла. Счетчик начинается с 2 и заканчивается когда i>n;
  • Cells(i, 4) - ячейка выделенного листа, i номер строки, 4 -номер столбца в который выводится результат. Обратите внимание, наш счетчик i указывает номер строки листа Excel;
  • Next i - оператор закрытия цикла и перевода указателя к For. Все что находится между For и Next выполняется в цикле;
  • CStr - функция преобразующая число в текст.

Ячейке мы присваиваем формулу созданную следующим образом "=C" & CStr (i) & "+E" & CStr ((n - i) + 2). Знак & - "склеивание" символов, строк. В результате у нас получится формула "=Сn+E((n - i) + 2)" где n = 21, i - счетчик.
Страшно? Это только кажется:)

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

Пример 2
Теперь рассмотрим цикл с указанным шагом. После расчета прошлого макроса мы получили три столбца, теперь нам необходимо из столбца E вычесть D, в столбец F вывести формулы вычитания. Код макроса следующий:

Sub Цикл_For_с_шагом()
Const n = 21
For i = n To 2 Step -1
Cells(i, 6) = "=E" & CStr (i) & "-D" & CStr (i)
Next i
End Sub

В данном случае все тоже самое, только цикл теперь "бежит" не от 2, а от 21 до 2 с шагом (Step) -1.
Результат выполнения получим следующий:

Цикл For , в VBA, является не единственным циклом. В дальнейшем будут рассмотрены еще пара вариантов циклов, без которых не обойтись при написании макрокоманд в Excel.

VBA. Организация циклов.

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

VBA поддерживает циклические конструкции двух видов:

  1. Циклы с фиксированным числом повторений (циклы со счетчиком ).
  2. Циклы с неопределенными числом повторений (циклы с условием ).

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

Фиксированные циклы

VBA предоставляет две управляющие структуры для организации фиксированного цикла: For … Next (цикл со счетчиком) и For Each … Next (цикл с перечислением).

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

For <счетчик> = <начЗначение> То <конЗначение>

<блок операторов>

Next [<счетчик>]

Пример использования оператора For … Next.

Листинг 1. Оператор For … Next

‘ ЗАДАЧА: Составить программу, которая получает два числа от пользователя.

‘ Складывает все числа в диапазоне, заданном этими двумя числами, а затем

‘ отображает результирующую сумму.

Sub sample7()

Dim i As Integer ‘счетчик цикла

Dim sStart ‘начальное значение счетчика

Dim sEnd ‘конечное значение счетчика

Dim sSum As Long ‘результирующая сумма

sStart = InputBox(“Введите первое число:”)

sEnd = InputBox(“Введите второе число:”)

sSum = 0

For i = CInt(sStart) To CInt(sEnd)

sSum = sSum + i

Next i

MsgBox “Сумма чисел от ” & sStart & ” до ” & sEnd & ” равна: ” & sSum

End Sub

Оператор цикла For Each … Next относится к категории операторов объектного типа, т.е. применяется в первую очередь к коллекциям объектов , а также к массивам . Тело цикла выполняется фиксированное число раз, соответствующее числу элементов массива или коллекции. Формат оператора For Each … Next:

For Each <элемент> In <группа> <блок операторов> Next [<элемент>]

Циклы с условием (неопределенные циклы)

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

  • Четыре вида циклов Do..Loop, которые различаются типом проверяемого условия и временем выполнения этой проверки.
  • Непрерываемый цикл While … Wend.

Цикл Do While … Loop – типичный цикл с предусловием . Условие проверяется до того, как выполняется тело цикла. Цикл продолжает свою работу, пока это <условие> выполняется (т.е. имеет значение True). Так как проверка выполняется в начале, то тело цикла может ни разу не выполниться. Формат цикла Do While … Loop:

Do While <условие>

<блок операторов>

Loop

Листинг 2. Цикл Do While … Loop

‘ ЗАДАЧА: Составить программу, которая предусматривает ввод пользователем

‘ произвольной последовательности чисел. Ввод должен быть прекращен

‘ только после того, как сумма введенных нечетных чисел превысит 100.

Sub sample8()

Dim OddSum As Integer ‘сумма нечетных чисел

Dim OddStr As String ‘строка с нечетными числами

Dim Num ‘для приема вводимых чисел

OddStr = “” ‘инициализация выходной строки

OddSum = 0 ‘инициализация суммы OddSum

Do While OddSum < 100 ‘начало цикла

Num = InputBox(“Введите число: “)

If (Num Mod 2) <> 0 Then ‘проверка на четность

OddSum = OddSum + Num ‘накопление суммы нечетных чисел

OddStr = OddStr & Num & ” ”

End If

Loop

‘вывод строки с нечетными числами

MsgBox prompt:=”Нечетные числа: ” & OddStr

End Sub

Оператор Do … Loop While предназначен для организации цикла с постусловием . Условие проверяется после того, как тело цикла, будет выполнено хотя бы один раз. Цикл продолжает свою работу, пока <условие> остается истинным. Формат цикла Do … Loop While:

Do <блок операторов> Loop While<условие>

Листинг 3. Цикл с постусловием

‘ ЗАДАЧА: Составить программу игры “Угадай число”. Программа должна случайным

‘ образом генерировать число в диапазоне от 1 до 1000, пользователь должен

‘ угадать это число. Программа на каждое вводимое число выводит подсказку

‘ “больше” или “меньше”.

Sub sample8()

Randomize Timer ‘ инициализация генератора случайных чисел

Dim msg As String ‘ строка сообщения

Dim SecretNumber As Long, UserNumber As Variant

Begin: SecretNumber = Round(Rnd * 1000) ‘ число, сгенерированное компьютером

UserNumber = Empty ‘ число, вводимое пользователем

Do ‘ игровой процесс

Select Case True

Case IsEmpty(UserNumber): msg = “Введите число”

Case UserNumber > SecretNumber: msg = “Слишком много!”

Case UserNumber < SecretNumber: msg = “Слишком мало!”

End Select

UserNumber = InputBox(prompt:=msg, Title:=”Угадай число”)

Loop While UserNumber <> SecretNumber

‘ проверка

If MsgBox(“Играть еще? “, vbYesNo + vbQuestion, “Вы угадали!”) = vbYes Then

GoTo Begin

End If

End Sub

Циклы Do Until … Loop и Do … Loop Until являются инверсиями ранее рассмотренных циклов с условием. В общем случае они работают аналогично, за исключением того, что тело цикла выполняется при ложном условии (т.е. <условие>=False). Формат цикла Do Until … Loop:

Do Until <условие> <блок операторов> Loop

Формат цикла Do … Loop Until:

<блок операторов>

Loop Until<условие>

Практическое задание: Перепишите программы из листингов 10 и 11 с использованием инвертированных операторов цикла.

Цикл While … Wend также относится к циклам с условием. Данный оператор полностью соответствует структуре Do While … Loop. Формат цикла While … Wend:

While <условие>

<блок операторов>

Wend

Отличительной особенностью этого оператора является невозможность принудительного завершения (прерывания) тела цикла (оператор Exit Do не работает в цикле While … Wend).

Прерывание цикла

Для досрочного завершения итерации и выхода из цикла применяется оператор Exit. Этот оператор применим в любой циклической структуре, кроме While … Wend. Общий синтаксис использования Exit для прерывания цикла таков:

<начало_цикла>

[<блок операторов1>]

Exit (For | Do)

[<блок операторов2>]

<конец_цикла>

При выполнении оператора Exit цикл прерывается, и управление передается оператору, следующему за оператором <конец_цикла>. В теле цикла может присутствовать несколько операторов Exit.

Листинг 4. Принудительный выход из цикла

Sub sample9()

For i = 1 To 10000000

If i = 10 Then Exit For ‘ выход из цикла, когда счетчик достигнет 10

Next