Управляющие конструкции VBA

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

Ветвления

Ветвления работают по общему принципу: вначале проверяется заданное усло­вие, затем, в зависимости от результатов проверки, выполняется та или иная группа инструкций, входящая в конструкцию ветвления. Конструкции ветвле­ния включают в себя три варианта инструкции условного перехода If и инст­рукцию выбора Select Case.

Конкретный вариант управляющей конструкции с инструкцией If выбирается в зависимости от программного контекста. Если в зависимости от результата проверки сравнительно простого условия следует выполнить или пропустить простую инструкцию, удобнее оказывается однострочный сокращенный вари­ант, синтаксис и пример которого приведен в листинге 14.6.

 

Оператор if.. .Then.. .Else — стандартный оператор ветвления. Его исполь­зование позволяет проверить некоторое условие и, в зависимости от его ис­тинности, выполнить ту или иную группу операторов.

Для данного оператора есть два варианта синтаксиса — в одну строку, и в несколько:

If условие Then   [блокОператоров1]    [Else  блокОператоров2]

 ИЛИ

If условие1  Then

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

 [Elself условиеN  Then

[блокОператоровN]] ...

 [Else

[блокОператоров_Е1зе]]

End  If

 

Листинг 14.6. Однострочный сокращенный вариант инструкции If

If <условие> Then <инструкция>

If пол = "ж" Then пенс_возраст = 55

ПРИМЕЧАНИЕ

Обратите внимание на то, что знаки равенства в записи условия и в инструкции, входящих в состав однострочной конструкции ветвления, обозначают различные операции. В условии это — операция сравнения, вырабатывающая значение ИС­ТИНА при равенстве значений выражений, стоящих справа и слева от знака ра­венства. В инструкции это — операция присваивания значения выражения, распо­ложенного справа от знака равенства, переменной (или свойству), имя которой (которого) расположено слева от этого знака.

Условия, применяющиеся в любой форме конструкций ветвления, представля­ют собой выражения, вычисление которых дает логическое значение. В сокра­щенном однострочном варианте инструкции If входящая в ее состав инструк­ция выполняется только тогда, когда это логическое выражение при вычислении дает значение ИСТИНА. Если при соблюдении условия требуется выполнить не одну, а несколько инструкций, удобнее оказывается сокращенный много­строчный вариант инструкции If, синтаксис и пример которого приведен в листинге 14.7.

Листинг 14.7. Многострочный сокращенный вариант инструкции If

If <условие> Then

<инструкция   1>

<инструкция  2>

. . .

<инструкция   N>

End If

If пол = "ж" Then

пенс_возраст = 55

поздравление_8_марта=True
End If                                                                 

В таком варианте конструкции ветвления при соблюдении условия выполня­ются все инструкции, записанные между ключевыми словами Then и End If. Полный вариант инструкции If удобен в том случае, когда при соблюдении условия необходимо выполнить одну группу инструкций, а при несоблюде­нии — другую. Синтаксис и пример этого варианта приведены в листинге 14.8.

Листинг 14.8. Полный вариант инструкции If

If <условие> Then

 <инструкция  1>

. . .

<Инструкция  N>

Else

<Инструкция   1>

. . .

<Инструкция  N>

End If

 If пол = "ж" Then

пенс_возраст = 55

поздравление_8__марта = True

Else

пенс_возраст = 60

поздравление_8_марта =  False

End If

Функция iif

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

Iif   (выражение,   значениеЕслиДа,   значениеЕслиНет)

Эта функция проверяет значение выражения выражение, если оно истинно, то функция возвращает значение значениеЕслиДа, в противном случае — зна чениеЕслиНе т.

Функция iif является встроенной функцией, и как всякая функция используется в выражении. Таким образом, функцию iif удобно ис­пользовать, когда ветвление требуется в программе не для того, чтобы вы­брать ту или иную альтернативную последовательность действий, а для того, чтобы присвоить то или иное альтернативное значение.

Например, оператор

D2  =  IIf(i  <=  10,   250,   50)

можно было бы записать так:

If  i  <=  10  Then

D2  =  250 Else

D2  =  50 End  If

Согласитесь, что первый способ короче, нагляднее и надежнее.

 

Оператор Select Case

Вышерассмотренные цепочки операторов if.. .Then. . .Eiseif обладают большой гибкостью и позволяют решить все проблемы, однако, если выбор одной из нескольких возможностей все время основан на различных значе­ниях одного и того же выражения, гораздо удобнее использовать предназна­ченный для этого оператор выбора select Case, имеющий следующий син­таксис:

Select Case <выражение>

Case <список значений 1>

<группа инструкций 1>

Case <список значений 2>

<группа инструкций 2>

.. .

  Case <список значений N>

<группа инструкций N>

 Case Else

<группа инструкций N+1>

 End Select

 

Select Case набрано_баллов

Case 0, 1, 2

Оценка = "неудовлетворительно" Case 3 To 5

Оценка = "удовлетворительно"

Case Is > 8

Оценка = "отлично"

Case Else

Оценка = "хорошо"

End Select

 

Проверяемое выражение вычисляется в начале работы оператора select case. Это выражение может возвращать значение любого типа — например, логи­ческое, числовое или строковое. При выполнении оператора Select Case значение проверяемого выражения вычисляется один раз и запоминается.

Далее идет список альтернатив, начинающихся ключевым словом Casе. В каждой альтернативе указан список значений, представляющий собой не­сколько возможных значений, разделенных запятой. При выполнении опе­ратора select Case значение сравнивается со списками значений альтерна­тив. Элементы списка значений могут иметь одну из следующих форм:

О   Значение

в этом случае проверяется, совпадает ли значение проверяемого выраже­ния с указанным значением;

О  Значение1   То  Значение2

в этом случае проверяется, находится ли значение проверяемого выраже­ния в диапазоне указанных значений;

О Is логическаяОперация значение

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

Вся конструкция работает следующим образом. Если хотя бы один из эле­ментов списка значений соответствует проверяемому выражению, то выпол­няется соответствующий блок операторов, и на этом выполнение оператора Select Case заканчивается. Если же ни один из элементов всех списков альтернатив не соответствует значению проверяемого выражения, выполня­ется блокОператоров_Е1зе (если, конечно, присутствует ключевое слово case

Else).

В следующем примере при помощи функции inputBox переменной t при­сваивается некое значение, после чего посредством оператора select case проверяется положительность значения переменной. Заметьте, что преду­смотрен вариант, когда пользователь введет не число.

Листинг 3-14; Использование оператора Select

Sub branchLine ()

Dim t As  Integer

t = InputBox   ("Введите число")

Select Case t

Case 0

Msgbox ("Введен О")

Case 1 То 100

MsgBox("Введено положительное число")

Case -100 То -1

MsgBox("Введено отрицательное число")

Case Is < -100, Is > 100

MsgBox("Число слишком большое, не понять")

Case Else

MsgBox("Введено не число")

End Select

 End Sub

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

Оператор GoTo

Помимо условных операторов, в VBA существует оператор безусловного пе­рехода, который также меняет порядок выполнения операторов в программе (безусловно).

GoTo  имяМетки

После ключевого слова идет имя метки. Метка — это идентификатор, при­писанный оператору программы и используемый в других частях программы для обращения к этому оператору. Метка может быть определена как до, так и после ключевого оператора goto, причем она должна отделяться от поме­ченного ею оператора двоеточием. Нижеприведенный пример, вообще гово­ря, будет выполняться бесконечно. Мы специально приводим семантически неверную программу, чтобы подчеркнуть, как легко можно ошибиться при использовании оператора goto.

Sub branchLabel ()

label1   :   MsgBox ("Использование метки")

GoTo  labell

End Sub

(~~ Совет       )

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

 

Сайт управляется системой uCoz