Циклы в VBA. Циклы VBA (ч.1)

Операторы цикла

В VBA существуют два основных типа циклов – циклы со счетчиком (параметрические) и циклы с условием (итерационные).

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

Циклы с условием применяются тогда, когда некоторые действия в программе должны повторяться до тех пор, пока выполняется определенное условие.

Циклы с параметром For … Next

Структура цикла:

For Параметр_Цикла = Начальное_Значение To Конечное_Значение

[ Step Шаг]

Операторы

[ Exit For ]

Next [Параметр_Цикла]

где For – ключевое слово VBA (от), обозначающее начало цикла;

Параметр_цикла – переменная, определенная в качестве счетчика цикла;

Начальное_Значение – число, задающее начальное значение параметра цикла;

To – ключевое слово VBA (до), разделяющее

Начальное_значение и Конечное_Знаение;

Конечное_Значение – число, задающее значение параметра цикла,

При котором цикл завершается;

Step – ключевое слово VBA (шаг), используемое для

Задания шага цикла, необязательный аргумент;

Шаг – число, задающее шаг цикла, т.е. значение, на которое

Увеличивается (или уменьшается) значение параметра

Цикла на каждом шаге. Это число может быть

Отрицательным;

Exit For – оператор досрочного выхода из цикла (необязательный);

Next – ключевое слово VBA (следующий), обозначающее

Конец цикла.

Работа цикла:

Шаг 1 Сначала определяется параметр цикла, а также вычисляются и запоминаются начальное и конечное значения этой переменной.

Шаг 2 Параметру цикла присваивается начальное значение.

Шаг 3 Начальное значение параметра цикла сравнивается с конечным значением.

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

Шаг 4 Выполняется тело цикла.

Шаг 5 После выполнения тела цикла происходит присваивание параметру цикла следующего значения. Переход к шагу 3.

Примечание.

1. Если используется ключевое слово Step , то параметр цикла изменяется в соответствии с числом, указанным после этого слова. Если слово Step отсутствует, то значение шага равно единице.

Пример 1.

For I = 0 To 10 Step 2 (Значение I будет увеличиваться на 2)

2. Цикл For … Next может быть прерван досрочно при достижении какого либо условия. Для этого в нужном месте цикла нужно поместить оператор Exit For .

Пример 2.

Dim S As Integer

Dim j As Integer

S = 2

For j = 1 To 10

S = S + j

If S > 6 Then

Exit For (Выход из цикла, если значение S > 6)

End If

Next j

MsgBox (S)

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

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

В VBA есть два основных цикла DO … LOOP – с условием, вводимым ключевым словом While , и с условием, вводимым ключевым словом Until . Оба они могут быть с предусловием или с постусловием.

Синтаксис:

где Do – ключевое слово (делать);

While – ключевое слово (пока);

Until – ключевое слово (до тех пор пока);

Loop – ключевое слово, указывающее на окончание цикла;

<условие> – логическое выражение, истинность которого проверяется

В начале каждого выполнения тела цикла;

<тело_цикла> – произвольная последовательность операторов;

Конструкция Do … While читается: делать пока выполняется условие. В конструкции Do … While For

Конструкция Do … Until читается: делать до тех пор, пока не будет выполнено условие. В конструкции Do … Until для увеличения шага следует писать специальный оператор, т.к. в ней в отличие от конструкции For , не делается это автоматически.

Условие, записанное после ключевого слова Until , проверяется в конце каждой итерации (после выполнения тела цикла). Обратить внимание, что оно работает здесь не совсем так, как в цикле While . Если условие является истинным (True ), то выполнение цикла завершается. Если условие не выполняется (является ложным – False ), то вновь выполняется тело цикла.

Пример 1.

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

Технология выполнения задания:

1. Исходные данные: i  Z

Результат: S  R .

2.Набрать в стандартном модуле проекта следующую пользовательскую процедуру, используя цикл с предусловием While :

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

Do While i <= 10

S = S + i ^ 2

i = i + 1

Loop

MsgBox (S)

End Sub

3.Набрать в стандартном модуле проекта следующую пользовательскую процедуру, используя цикл с предусловием Until :

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

Do Until i > 10

S = S + i ^ 2

i = i + 1

Loop

MsgBox (S)

End Sub

4 Набрать в стандартном модуле проекта следующую пользовательскую процедуру, используя цикл с постусловием While :

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

S = S + i ^ 2

i = i + 1

Loop While i <= 10

MsgBox (S)

End Sub

5 Набрать в стандартном модуле проекта следующую пользовательскую процедуру, используя цикл с постусловием Until :

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

S = S + i ^ 2

i = i + 1

Loop Until i > 10

MsgBox (S )

End Sub

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

Цикл - это алгоритмическая структура, при помощи которой реализуется многократное повторение блоков операторов.

В языке Visual Basic существует три основных вида циклов, которые реализуется при помощи конструкций For:Next, Do:Loop и While:Wend.

Цикл For:Next. Используется в том случае, когда количество повторов заданного блока операторов известно заранее. Данная конструкция выглядит следующим образом:

For счетчик = начальное значение To конечное значение Операторы1 Операторы2 Next [счетчик]

Когда приведенные операторы выполняются первый раз, то переменной счетчику присваивается начальное значение, после чего возможны два варианта действий. Если в результате проверки условия счетчик > конечное значение было получено значение True, то происходит завершение цикла, при этом блоки операторы1 и операторы2 ни разу не выполняются. С другой стороны, если результатом проверки условия является False, то в этом случае блоки операторов выполняются первый раз, после чего происходит переход на начало цикла. Далее значение переменной-счетчика увеличивается на шаг, расположенный после ключевого слова Step (в случае его отсутствия устанавливается шаг = 1). После этого снова проверяется истинность условия счетчик > конечное значение и т.д., окончание цикла происходит в тот момент, когда результатом данной проверки станет значение True.

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

If условие Then Exit For

Если результатом проверки условия будет значение True, то выполнение цикла будет прекращено, причем блок операторы1 будет выполнен очередной раз, а блок операоры2 - нет.

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

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

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

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

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

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

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

Блок операторы выполняется до тех пор, пока результатом проверки условия является значение False, иначе выполнение цикла заканчивается.

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

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

Цикл While:Wend. Также используется в том случае, когда число повторений операторов тела цикла заранее неизвестно, и имеет следующий синтаксис:

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

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

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

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-й вариант.

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

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

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

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

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

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

for цикл

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

Синтаксис

Ниже приведен синтаксис цикла for в VBA.

For counter = start To end .... .... 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 .... 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) ... Wend

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

пример

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 ... ... Loop

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

пример

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

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

пример

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

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

пример

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

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

пример

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