Глава 8. Управление потоком.
В этой главе ...
~ Использование управляющих структур для управления происходящим
~ Проверка условий с помощью условных выражений
~ Принятие решений с помощью операторов If. . .Then и SelectCase
~ Повторение выполнения действий с помощью операторов For...Next, For Each.. .Next и Do ... Loop
~ Разветвления с помощью операторов Go То
Управляющие структуры - это операторы программного кода, определяющие, какие действия будут выполняться следующими, и использующие для этого некоторое условие, действительное во время выполнения программного кода. VBA предлагает полный ассортимент достаточно мощных управляющих структур. В этой главе мы обсудим каждую управляющую структуру VBA в отдельности и рассмотрим использование таких структур на практических примерах (ну, по крайней мере, на квазипрактических).
Укрощение диких программ с помощью управляющих структур
Управляющие структуры можно разбить на три главные группы - условные операторы, циклы и операторы With.
* Условный оператор определяет, какую из ветвей программного кода выполнять, в зависимости от того, какое значение (True или False ) принимает некоторое условие. К условным операторам VBA относятся If... Then и Select Case.
* Цикл повторяет выполнение некоторого блока программного кода либо заданное число раз, либо до тех пор, пока некоторое условие не примет значение True или False. Если известно заранее, сколько раз необходимо выполнить цикл, то используйте For. . .Next, а если продолжение повторения программного кода зависит от выполнения некоторого условия, используйте Do ... Loop (этот оператор доступен в нескольких вариантах). Чтобы повторить некоторые действия по отношению к объектам в коллекции, используйте цикл For Each. . .Next, который будет обсуждаться в главе 12.
* Оператор With позволяет выполнить множество действий с одним и тем же объектом без необходимости каждый раз указывать объект (см. главу 12).
Управляющие структуры привносят в программу ясность, организацию и... структурную стройность. Они позволяют с относительной простотой проследить тот путь, который программа может выбрать при ее выполнении.
Анатомия управляющих структур
Что делает управляющую структуру структурой, так это то, что управляющая структура является не просто отдельным оператором, а целым блоком операторов. Моделью для всех управляющих структур служит базовый оператор If ... Then:
If a < b Then ' Если а меньше b, то
b = a ' положить значение b равным а.
a = с ' а затем положить а равным с.
End If ' Это все - продолжить выполнение программы.
Каркас этой структуры составляют открывающий оператор, идентифицирующий структуру и задающий условие, и оператор, означающий конец структуры. Между этими двумя операторами находятся операторы, образующие тело структуры,- операторы, которые выполняют реальную работу.
Примерно такой общий вид имеют все управляющие структуры, правда, в некоторых из них условие, используемое структурой, помещается в последний оператор, а не в первый.
Вложенные управляющие структуры
Когда речь идет об управляющих структурах, вложение означает размещение одной структуры внутри другой, еще до оператора, означающего завершение первой структуры.
VBA начинает работу со второй структурой, еще не закончив обрабатывать первую. Такое вложение оказывается необходимым при решении многих сложных реальных проблем.
Управляющие структуры можно вкладывать одну в другую до любого уровня, какой вам кажется необходимым.
В следующем примере структура Do While... Loop вложена внутрь структуры
If . . . Then, а еще одна структура If ... Then вложена в Do While ... Loop:
If a < b Then ' начало внешней структуры If...Then
Do While b > с ' начало вложенного цикла Do While...Loop
b = b - 1
If с > d Then ' начало вложенной структуры If...Then
d = a
End If ' Конец внутренней структуры If...Then
Loop ' Конец цикла Do While...Loop
End If ' Конец внешней стуктуры If...Then
Используйте отступы!
Правильное использование отступов служит основой создания понятного программного кода. В примере из предыдущего раздела каждая пара операторов, определяющих одну структуру, напечатана с одним и тем же отступом. При наличии отступов проще выяснить, например, какому из операторов If. . .Then соответствует данный оператор End If. Операторы, выполняемые в рамках данной структуры, тоже имеют один и тот же отступ, поэтому сразу видно, что все они находятся под юрисдикцией одной структуры.
Курс на использование условных выражений
Несмотря на простоту концепции, управляющие структуры можно отнести к наиболее мощным средствам программирования. С одной стороны, эти структуры "только" выбирают, какой из двух различных блоков программного кода следует выполнить.
Но, с другой - когда в результате один блок программного кода выполнен, а другой - нет, вы имеете полное основание повторить за Фростом: "Это и явилось причиной всех различий".
Чтобы решить, выполнять ли некоторый блок программного кода, три следующие управляющие структуры VBA оценивают предложенное вами условное выражение: Do ... Loop.
If. . .Then и Select Case. Весь последующий материал этого раздела посвящен использованию условных выражений в этих структурах. Две другие структуры, For. . . Next и For Each. . . Next, условных выражений не используют.
Как работает условное выражение
Структуры If. . .Then, Select Case и Do . . .Loop принимают решение о последующих действиях на основе простого теста: какое значение принимает выражение- True (Истина) или False (Ложь)? Условием здесь может быть любое выражение VBA. (Не забывайте, что в VBA 0 эквивалентен False, а все другие значения рассматриваются как True.)
Чаще всего условные выражения строятся на основе какой-нибудь операции сравнения, применяемой к двум другим выражениям, входящим в данное. Набор операций сравнения, доступных для использования в VBA, достаточно подробно обсуждался в главе 7. Но основные идеи видны и из примеров операторов, помещенных в следующую таблицу. Каковы эти выражения - истинные или ложные? Это только управляющим структурам известно.
Выражение
Перевод на русский язык
а < b
а меньше b
b = с
b равно с
colTBears ("Генри") Is objCurrentBear
Объект, хранящийся в коллекции colTBears под именем "Генри", является тем же самым объектом, что и объект, на который ссылается переменная objCurrentBear
sqr ( l/x * 29.3234) >= CDbl ( strNumber ) + 12
Квадратный корень величины, равной 1, разделенной на х и умноженной на 29,3234, не меньше числового значения строковой переменной strNumber плюс 12
Условные выражения без операторов сравнения
Большинство условных выражений включают операции сравнения, но ничто не мешает создать условия, не использующие такие операции. Прежде чем привести примеры, не помешает подвести под них некоторую теоретическую базу.
Этот вопрос обсуждается здесь не для того, чтобы заставить вас создавать условные выражения, не использующие операций сравнения, а просто потому, что такие выражения создают многие программисты. Часто такие условные выражения присутствуют в текстах программ, публикуемых в компьютерных журналах и представленных в Internet. Но пока вы занимаетесь освоением VBA, я рекомендую вам включать операции сравнения в условные выражения хотя бы для ясности программного кода, даже если такие операции и не необходимы.
Теперь о деталях. Как вы знаете, значением логической переменной всегда является либо True, либо False. Поэтому выражение
bоо1До18 ' это значение либо True, либо False
вполне подойдет в качестве условия в условном выражении, как, например, в случае
If bоо1До18 Then
ПредоставитьСкидку
End If
Но True и False имеют числовые значения, а поэтому в качестве условия можно использовать и любое числовое выражение. Все следующие выражения подходят для использования в качестве условий:
1234 ' всегда True
0 ' всегда False
True ' всегда True
False ' всегда False
intHowManyPets ' False, если intHowManyPets = 0
ingA + lngB + lngC ' False, если сумма = 0
Свойства объектов часто представляют логические значения, поэтому в качестве условий нередко используются выражения типа frmHelpWindow.Enabled и безо всяких операций сравнения.
Нельзя использовать строки и объекты в качестве условий сами по себе, хотя они вполне годятся для использования в качестве компонентов выражений, построенных на основе подходящей операции сравнения.
Использование логических операций в условиях
Логические операции (см. главу 7) сначала оценивают значения входящих в выражение двух выражений-компонентов как True или False, а затем, в соответствии с определенными правилами, на основе этих значений получается конечный результат- тоже True или False.