Цикл с непостоянным приращением в vba. Циклы в VBA. Оператор прерывания цикла «Exit For»

Цикл - это группа операторов, которые многократно выполняются. Для организации циклов в VBA, т. е. многократного выполнения одного или нескольких операторов, можно использовать две основные группы: циклы с перечислением For...Next и циклы с условием Do... Loop. Существуют две разновидности For...Next (For-Next и For Each-Next) и два вида циклов Do...Loop (Do While...Loop и Do Until ...Loop), которые различаются типом проверяемого условия.

Цикл For-Next

Самым распространенным циклом в VBA является цикл с перечислением "For-Next". Этому циклу необходимо задать границы (начальное и конечное значения счетчика) в пределах которых будет изменяться переменная цикла.

Оператор цикла имеет следующий синтаксис:
For For n = 1)
То Конечное Значение (То 10)
Step Приращение (Step 2)

Next [счетчик]

Здесь переменная - это счетчик, значение переменной увеличивается или уменьшается с каждым повторением цикла. Если в конструкции цикла отсутствует Step, то приращение равно 1 (по умолчанию). Для досрочного выхода из оператора цикла, т.е. до достижения счетчиком конечного значения, в конструкцию цикла надо ввести оператор Exit For .

С учетом Exit For оператор цикла имеет следующий синтаксис:
For счетчик = Начальное Значение (например, Например, For n = 1)
То Конечное Значение (То 10)
Step Приращение (Step 2)
[Инструкции] или [блок Операторов]
Exit For
Next [счетчик]

Для обработки группы однородных объектов или массивов применяется следующая конструкция цикла:
For Each Элемент In Группа (имя группы однородных объектов)
[Инструкции] или [блок Операторов]
Exit For
Next элемент

Циклы с условием Do While...Loop и Do Until…Loop

Оператор Do While…Loop выполняет циклы до тех пор, пока соблюдается какое-либо заданное условие. Необходимо отметить, что условие проверяется до того, как выполняется инструкция или группа операторов.

В этом случае синтаксис операторов цикла Do While...Loop имеет следующий вид:
Do While условие (Например, x<20)
[Инструкции] или [блок Операторов]
Exit Do
Loop


Do
[Инструкции] или [блок Операторов]
Exit Do
Loop While условие

Оператор Do Until…Loop выполняет циклы до тех пор, пока условие не соблюдается, а при соблюдении условия оператор выходит из цикла. Условие проверяется до того, как выполняется инструкция или группа операторов.

В этом случае синтаксис операторов цикла Do Until...Loop имеет следующий вид:
Do Until условие (Например, x=20)
[Инструкции] или [блок Операторов]
Exit Do
Loop

Если надо проверять условие после того, как инструкции или блок операторов будут выполнены хотя бы один раз, то можно применить следующую конструкцию оператора цикла:
Do
[Инструкции] или [блок Операторов]
Exit Do
Loop Until условие

В этом уроке будет рассмотрена работа с циклом 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 существуют два основных типа циклов – циклы со счетчиком (параметрические) и циклы с условием (итерационные).

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

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

Циклы с параметром 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

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

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….Next приведен на рис. 5.28.

Counter – любая численная переменная VBA, обычно переменная типа Integer или Long.

Start - любое численное выражение и определяет начальное значение для переменной Counter.

End – численное выражение, определяющее конечное значение для переменной Counter .

Statements – один, несколько или ни одного оператора. Эти операторы выполняют тело цикла. VBA выполняет каждый из этих операторов при каждом выполнении цикла.

Ключевое слово Next

Counter=counter+StepSise

Рис.9.28. Алгоритм цикла For….Next

Ключевое слово Next сообщает VBA о том, что достигнут конец цикла. Не обязательная переменная Counter поcле ключевого слова Next должна быть той же самой переменной Counter, которая была задана после ключевого слова For начале структуры цикла.

Синтаксис :

For counter = Start To End

При выполнении цикла For Next VBA поступает следующим образом:

Присваивает значение, представленное Star , переменной С ounter .

Выполняет все операторы, представленные с помощью Statements , пока не достигнет ключевого слова Next . Ключевое слово Next показывает VBA на то, что достигнут конец тела цикла.

Изменяет переменную С ounter на величину StepSize (если включается необязательное слово Step) Если Step не определено, то VBA увеличивает переменную counter на 1.

Возвращается к началу цикла и сравнивает текущее значение переменной С ounter со значением, представленным End. Если значение С ounter меньше значения End , VBA продолжает выполнение с первого оператора после ключевого слова Next .

9.2.4. Ввод-вывод одномерных и двухмерных массивов

Массив (array ) – это коллекция переменных, которые имеют общее имя и базовый тип. Массив является удобным способом хранения нескольких связанных элементов данных в едином контейнере для большего удобства и эффективности программирования. Все элементы данных, сохраняемых в массиве, должны иметь один и тот же тип.

Массив позволяет сохранять и манипулировать многими элементами данных посредством единственной переменной. Кроме уменьшения общего числа различных имен переменных, которые необходимо отслеживать, другим основным преимуществом использования массивов является то, что можно использовать циклы для легкой обработки различных элементов массивов. Объединяя массивы и структуры цикла (обычно For….Next) можно написать небольшое число операторов, которые обрабатывают большой объем данных. Выполнение тех же задач с использованием отдельных переменных может потребовать написания сотен операторов.

Размерность массива

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

Одномерные массивы

Пример одномерного массива приведен в таблице № 9.9.

Таблица № 9.9

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

Для доступа к данным, хранящимся в определенном элементе массива, следует указывать имя массива с последующим числом, называемым индексом элемента. Индекс заключают в круглые скобки. Например, если массив в таблице № 1.1 имеет имя DoubleArray, то следующий оператор присваивает число 45 переменной DoubleAny.

DoubleAny = DoubleArray (3)

В этом операторе число 3 является индексом массива. Поскольку нумерация элементов начинается с нуля, элемент, на который ссылается оператор, является, фактически, четвертым элементом массива DoubleArray.

При выполнении оператора DoubleArray, VBA выбирает значение 45 и сохраняет это значение в переменной DoubleArray.

Этот же оператор можно использовать при сохранении данных в массиве:

DoubleArray (5)=12.

При выполнении этого оператора VBA помещает значение 12 в указанных элемент массива, заменяя предыдущее содержимое этого элемента.

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

Многомерные массивы

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

В двумерном массиве адрес каждой ячейки состоит из двух чисел: номер строки (первый индекс) и номер столбца (второй индекс). В VBA можно создавать массивы до 60 измерений.

Если в массиве число элементов не меняется, то такой массив называется статическим.

Статические и динамические массивы

Если при выполнении VBA-программы можно изменять число элементов в массиве, то такие массивы называются динамическими. Для изменения размера динамического массива используется оператор ReDim.

VBA сохраняет зарезервированной область памяти для всех элементов в массиве, пока существует переменная типа массива. Подобные массивы называются статическими (static), потому что число элементов в массиве не меняется.

Оператор Option Base

Обычно в VBA используются массивы с нулевой базой. Оператор Option Base позволяет задавать 0 или 1 как начальное число по умолчанию для индексов массива. Если оператор Option Base не используется, VBA начинает нумерацию индексов с 0 (по умолчанию). Необходимо помещать оператор Option Base в область объявлений модуля перед объявлением любых переменных, констант или процедур. Нельзя помещать оператор Option Base внутри процедуры. Можно иметь только один оператор Option Base в модуле.

Синтаксис:

Option Base 0|1

Объявление массивов

Объявление массива с помощью оператора Dim имеет следующий синтаксис.

Синтаксис:

Dim VarName ()

Dim VarName ( upper, upper]….) [ As type ],

VarName – любое имя для массива, удовлетворяющее VBA-правилам для имен идентификаторам.

Subscripts – измерение массива.

As Type – тип данных.

Lower – нижняя граница значения индекса.

Upper – верхняя граница значения индекса.

Type – тип данных

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

Dim str_array (1 To 100) As String

Dim variant_array ()

Dim str_Multiplication (0 To 15, 0 To 15) As String

Использование массивов

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

Обращение к элементу массива имеет следующий синтаксис.

Синтаксис.

arrayName (validIndex1, ….)

validIndex – имя массива.

validIndex1 – допустимое значение индекса для первого измерения массива.

validIndex2 – допустимое значение индекса для второго измерения массива.

Необходимо предоставлять значение индекса для каждого измерения массива при каждом обращении к какому-либо элементу массива.

Ввод-вывод одномерных массивов

При вводе одномерного массива необходимо последовательно вводить 1-й, 2-й и т.д. элементы массива, аналогично поступают при выводе. Для ввода или вывода массива необходимо организовать цикл. Наиболее удобно использовать для ввода и вывода одномерного массива алгоритм с использованием безусловного цикла.

Алгоритм ввода вывода одномерного массива приведен на рис.5.29.

Расшифровка процедуры приведена ниже.

Sub Massiv () – название процедуры.

Dim Mas (5) As Integer - объявили одномерный массив с 5-ю элементами, тип чисел – целые.

Dim s As String – объявили рабочую переменную для завершающего вывода данных из массива в диалогом окне. As String – тип данных в переменной для хранения.

For i = 1 To 5 – процедура в первом цикле For….Next, принимает целые числа от 1 до 5 и заносит их в массив.

Mas (i) = InputBox (i) – ввод целого числа для i-го элемента.

Next – переход ко второму циклу (элементы массива заносятся в строку и выводятся на экран в диалоговом окне с помощью оператора MsgBox).

For i = 1 To 5 – элементы в строке с 1 по 5.

s = s & Mas(i) & “ ;” - формирование строки из элементов массива. Массив выводится в одну строку. Элементы массива разделяются символом “ ;”.

MsgBox s – вывод ранее введенного массива.

Рис.5.27. Алгоритм ввода-вывода одномерного

Рис. 9.29. Алгоритм и процедура ввода-вывода одномерного массива

Ввод-вывод двухмерного массива

Алгоритм и процедура ввода и вывода двухмерного массива представлен на рис.5.30.

Описание данной процедуры:

Sub Massiv () – название процедуры

Объявление переменных, которые используются в данной процедуре:

Dim Mas (5, 5) As Integer - объявили двухмерный массив с 5 столбцами и пятью строками, тип чисел – целые.

Dim s As String – объявили рабочую переменную для завершающего вывода данных из массива в диалогом окне. As String – тип данных в переменной для хранения

Next i – окончание операции присвоения переменных

Ввод элементов массива в память компьютера:

For i = 1 To 5 – ввод осуществляется с первого элемента первой строки, потом со второго и т.д.

For j = 1 To 5 до конца первой строки, потом с первого элемента второй строки и т.д.

Mas(i,j) = InputBox(i,j) – оператор ввода элементов массива в память ЭВМ

Рис. 9.30. Алгоритм и процедура ввода-вывода двухмерного массива

Алгоритмы упорядочения массива

В качестве примера приведем алгоритм и процедуру сортировки одномерного массива методом «пузырька»

Вывод элементов введенного массива из памяти ЭВМ:

For i = 1 To 5 – вывод осуществляется аналогично вводу

s = s & Mas (i,j) & “ ; ”

s = s & Chr (13) – перевод строки (вывод не одной строкой, а несколькими, как в введенном массиве)

Next i – окончание действия оператора For….Next

MsgBox s – вывод ранее введенного массива на диалоговое окно

End Sub – окончание процедуры.