
- •Часть 1. Макросы и язык программирования vba. Среда редактора visual basic
- •Часть 2. Редактирование простых макросов
- •2U Object Browser
- •Import File
- •Часть 3. Типы данных, переменные и константы. Выражения в visual basic. Использование функций visual basic
- •Часть 4. Изменения порядка выполнения операторов в vba
- •Часть 5. Повторение действий в vba: циклы
- •I Statements
- •Часть 6. Массивы. Объекты vba для ввода-вывода
- •Часть 7. Создание и использование функций и функций-процедур
- •Часть 8. Элементы диалоговых окон
- •' Мним ' ' IIIIIIIII ' тГмшмГ ' ' ниши' |( ' .... Jwli ....
- •Часть 1. Макросы и язык программирования vba. Среда редактора Visual
Часть 5. Повторение действий в vba: циклы
Теперь, когда вы научились выбирать различные действия на основе предопределенных условий, вы узнаете, что необходимо делать, чтобы процедуры VBA повторяли действия заданное количество раз или пока выполняется (или не выполняется) некоторое условие.
Для организации циклов VBA предоставляет несколько мощных и гибких структур, позволяющих легко повторять различные действия. Программные структуры, приводящие к неоднократному повторению одного или нескольких операторов, называются структурами организации циклов, потому что поток выполнения операторов процедуры проходит циклично по одним и тем же операторам неоднократно.
Процесс выполнения всех операторов, заключенных в структуру цикла, один раз называется итерацией (iteration) цикла. Некоторые структуры цикла организуются так, что они всегда выполняются заданное количество раз. Структуры цикла, всегда выполняющиеся заданное количество раз, называются циклами с фиксированным числом итераций (fixed iteration). Другие типы структур цикла повторяются переменное количество раз в зависимости от некоторого набора условий. Поскольку количество раз повторений этих гибких структур цикла является неопределенным, такие циклы называются неопределенными циклами (indefinite loops).
Существуют два основных способа создания неопределенного цикла. Можно построить цикл так, что VBA будет тестировать некоторое условие (детерминант цикла) перед выполнением цикла. А также можно построить цикл таким образом, что VBA будет тестировать условие детерминанта цикла после выполнения операторов в цикле.
Тело (body) цикла – это блок операторов VBA, находящийся между началом и концом цикла.
Можно также создать неопределенный цикл таким образом, чтобы он не имел условия детерминанта вообще; циклы, не имеющие условия детерминанта, повторяются бесконечно и называются бесконечными циклами (infinite loops). Бесконечный цикл не заканчивается никогда (для прерывания VBA нажмите клавишу Esc или комбинацию клавиш Ctrl+Break); большинство бесконечных циклов являются результатом ошибок программирования, хотя имеется несколько случаев, когда удобно использовать бесконечные циклы.
79
Лабораторная работа № 5. Операторы циклов
Цель занятия: Знать операторы циклов For…Next, Do… Уметь
использовать вложенные циклы Материалы к занятию: MS Excel 2003.
Использование цикла For…Next
Используйте цикл For…Next, когда вам необходимо повторить действие или ряд действий заданное количество раз, известное до начала выполнения цикла. Цикл For…Next имеет следующий синтаксис:
For Counter = Start To End [Step StepSize] Statements [Exit For]
Next [Counter]
здесь counter - любая численная переменная VBA; Start - любое численное выражение и определяющее начальное значение для переменной Counter; End -это также численное выражение, определяет конечное значение для переменной Counter. По умолчанию VBA увеличивает переменную Counter на 1 каждый раз при выполнении операторов в цикле (считает количество циклов). Можно задавать другое значение (StepSize), на которое будет изменяться Counter, включая необязательное ключевое слово Step. При включении ключевого слова Step необходимо задавать значение для изменения переменной Counter. В указанной синтаксической конструкции StepSize представляет любое численное выражение и определяет значение для изменения переменной Counter. Досрочно завершить цикл For…Next можно с помощью оператора Exit For. Statements представляет один, несколько или ни одного оператора VBA. Эти операторы составляют тело цикла For; VBA выполняет каждый из этих операторов при каждом выполнении цикла. Ключевое слово Next сообщает VBA о том, что достигнут конец цикла; необязательная переменная Counter после ключевого слова Next должна быть той же самой переменной Counter, которая была задана после ключевого слова For в начале структуры цикла. Включайте необязательную переменную Counter после ключевого слова Next для улучшения читабельности программного кода (особенно при использовании вложенных циклов For…Next) и для повышения скорости выполнения кода (иначе VBA придется потратить время на определение того, какая переменная Counter является правильной, для ее изменения после достижения ключевого слова Next).
Изображение оператора For…Next на блок-схеме:
fCounter=Start, End, StepSize
Statements
Counter
80
Порядок выполнения: переменной Counter присваивается значение Start и проверяется условие: CounterЈStart для положительного шага StepSize (CounterіStart для отрицательного шага StepSize); если условие неверно, то тело цикла Statements не выполняется и управление передается на оператор, следующий за Next. Если же условие выполняется, то выполняется тело цикла Statements, затем значение Counter изменяется на значение StepSize (увеличится в случае положительного значения StepSize, и уменьшается при отрицательном значении StepSize). Данный процесс будет выполняться пока значение Counter не достигнет значения End (если шаг положителен, цикл завершится, когда впервые выполнится условие Counter>Start; если шаг цикла отрицателен, условие его завершения – Counter<Start). Досрочно завершить цикл For…Next можно и с помощью оператора Exit For. Такие операторы могут быть расположены в тех местах тела цикла, где требуется из него выйти, не дожидаясь выполнения условия завершения.
Задание 1. Напишите процедуру, суммирующую все числа из диапазона, содержащую цикл For…Next.
Для этого:
ь введите процедуру (листинг 14):
Листинг 14 – Демонстрация цикла For…Next с возрастающим счетчиком
1 Sub List5_14 ()
Dim i As Integer
Dim a As String
Dim b As String
Dim S As Long 6
a = InputBox("Введите первое целое число:")
b = InputBox ("Введите другое целое число:")
S = 0
For i = CInt(a) To CInt(b)
11 S = S + i
Next i
MsgBox "Сумма чисел от " & a & _
" до " & b & " равна " & S
Переменная i
используется
как счетчик цикла For…Next
(буквы i, j,
k,
l,
m,
n
чаще всего используются программистами
в качестве счетчиков цикла); другие
переменные используются для сохранения
начального (a)
и конечного значений (b),
полученных от пользователя, и для
сохранения суммы чисел (S).
Обратите внимание на типы этих переменных.
Переменные a
и b
в этой
процедуре чаще всего используются для
работы со строками (строки 7, 8, 13, 14) и
только в одном операторе (строка 11)
преобразованы в числа. Переменная S,
по существу, должна иметь тип числовой,
причем как можно больший, потому что
неизвестно, насколько большой диапазон
будет вводиться пользователем, который
будет
81
испытывать этот код. В процедуре предполагается, что первое вводимое число меньше, чем второе. Иначе тело цикла не выполнится ни разу и значение переменной S будет равно 0, так как она инициализируется этим значением в строке 10. Со строки 10 начинается описание цикла For…Next. При обработке этой строки VBA сначала выполняет вызов функции CInt, которая преобразует пользовательский строковый ввод в числа типа Integer, а затем вставляет результирующие целые значения в оператор. VBA присваивает целый эквивалент значения, хранимого в a, переменной счетчика i. Затем значение в i сравнивается с целым эквивалентом числа, сохраненного в b. Если i меньше или равно значению в b, VBA выполняет тело цикла. Этот цикл имеет только один оператор в своем теле: выражение сложения и присваивания (в строке 11). В строке складывается текущее значение i с текущим содержимым переменной S, а затем результат сложения присваивается переменной S. Далее VBA переходит к оператору Next (в строке 12), который указывает на конец тела цикла For; VBA увеличивает переменную счетчика на 1 (по умолчанию) и возвращается к началу цикла (строка 10) и снова сравнивает значение в переменной счетчика i с числом, хранимым в переменной b. Как только значение в счетчике цикла превысит значение, определенное для конечного значения счетчика (а это зависит от вводимых данных), VBA прекращает выполнение цикла. Теперь, когда цикл закончился, VBA продолжает выполнение кода с оператора MsgBox в строке 13, который отображает два введенных числа и сумму всех целых в этом диапазоне.
Упражнение 1
Напишите процедуру, содержащую цикл For…Next с использованием шага изменения счетчика цикла.
Использование циклов, тестирующих условия до выполнения тела цикла
Для VBA-тестирования условия детерминанта цикла до выполнения тела цикла следует помещать логическое выражение для детерминанта цикла в начало блока операторов, составляющего тело цикла.
Первой конструкцией цикла, тестирующей свое условие детерминанта до выполнения цикла, является Do While со следующим синтаксисом:
Do While Condition
Statements
[Exit Do] Loop
Condition – логическое выражение для детерминанта цикла; Statements – один, ни одного или несколько операторов, которые составляют тело цикла. Ключевое слово Loop после Statements указывает на окончание тела цикла и обозначает место, из которого VBA возвращается в начало цикла для проверки условия детерминанта (оператор Exit Do досрочно завершает цикл Do While). Изображение оператора Do While на блок-схеме:
82
^ Counter