Условные операторы и циклы

Условные операторы позволяют в зависимости от значения логического выражения выполнить отдельный участок программы или, наоборот, не выполнять его. Логические выражения возвращают только два значения True (истина) или False (ложь).

Логическое значение можно сохранить в переменной:

Dim isOk As Boolean
isOk = True
isOk = False

С помощью функции CBool() можно преобразовать число или строку в логический тип данных. Любое число не равное 0 будет преобразовано в значение True, а значение 0 — в False. Пример:

Debug.Print CBool(0)        ' Выведет: False
Debug.Print CBool(1)        ' Выведет: True
Debug.Print CBool(-1)       ' Выведет: True
Debug.Print CBool(0.5)      ' Выведет: True
Debug.Print CBool("True")   ' Выведет: True
Debug.Print CBool("False")  ' Выведет: False

Операторы сравнения

Операторы сравнения используются в логических выражениях. Перечислим их:

Debug.Print 1 = 1        ' True
Debug.Print 1 = 5        ' False
Debug.Print 1 <> 1        ' False
Debug.Print 1 <> 5        ' True
Debug.Print 1 < 5        ' True
Debug.Print 1 < 0        ' False
Debug.Print 1 > 0        ' True
Debug.Print 1 > 5        ' False
Debug.Print 1 <= 5        ' True
Debug.Print 1 <= 0        ' False
Debug.Print 1 <= 1        ' True
Debug.Print 1 >= 0        ' True
Debug.Print 1 >= 5        ' False
Debug.Print 1 >= 1        ' True
Dim obj1 As Object, obj2 As Object, obj3 As Object
Set obj1 = Range("A1")
Set obj2 = Range("A2")
Set obj3 = obj1
Debug.Print obj1 Is obj2        ' False
Debug.Print obj1 Is obj3        ' True
Debug.Print obj2 Is obj3        ' False

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

Debug.Print "d" = "D"      ' False
Debug.Print "d" > "D"      ' True
Option Compare Text
...
Debug.Print "d" = "D"      ' True
Debug.Print "d" > "D"      ' False
Debug.Print "ф" = "Ф"      ' True

Сравнить строку с заданным шаблоном позволяет оператор Like. Результат сравнения зависит от используемого режима. Если используется двоичный режим (по умолчанию), то регистр символов учитывается, а если текстовый режим (в начале модуля указана инструкция Option Compare Text) — то регистр не учитывается. Оператор Like имеет следующий формат:

<Значение> = <Строка> Like <Шаблон>

В строке шаблона могут быть использованы следующие специальные символы:

Debug.Print "string" Like "??????"   ' True
Debug.Print "string" Like "s????g"   ' True
Debug.Print "string" Like "*ri*"     ' True
Debug.Print "string" Like "??r*g"    ' True
Debug.Print "28.08.2012" Like "##.##.####"     ' True
Debug.Print "28.08.12" Like "##.##.####"       ' False
Debug.Print "ё" Like "[а-яё]"    ' True
Debug.Print "ё" Like "(А-ЯЁ)"    ' False

Пример сравнения в текстовом режиме:

Option Compare Text
...
Debug.Print "ё" Like "[а-яё]"    ' True
Debug.Print "ё" Like "[А-ЯЁ]"    ' True
Debug.Print "л" Like "[!а-я]"    ' False
Debug.Print "л" Like "[!а-км-я]" ' True

Логические операторы

Значение логического выражения можно инвертировать с помощью оператора Not:

Debug.Print 10 = 5       ' False
Debug.Print Not 10 = 5   ' True
Debug.Print Not (10 = 5) ' True

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

Несколько логических выражений можно объединить в одно большое с помощью следующих логических операторов:

Debug.Print (1 < 5) And (2 < 5) ' True And True = True
Debug.Print (1 < 5) And (2 > 5) ' True And False = False
Debug.Print (1 > 5) And (2 < 5) ' False And True = False
Debug.Print (1 < 5) Or (2 < 5)  ' True Or True = True
Debug.Print (1 < 5) Or (2 > 5)  ' True Or False = True
Debug.Print (1 > 5) Or (2 < 5)  ' False Or True = True
Debug.Print (1 > 5) Or (2 > 5)  ' False Or False = False
Debug.Print (1 < 5) Xor (2 < 5) ' True Xor True = False
Debug.Print (1 < 5) Xor (2 > 5) ' True Xor False = True
Debug.Print (1 > 5) Xor (2 < 5) ' False Xor True = True
Debug.Print (1 > 5) Xor (2 > 5) ' False Xor False = False
Debug.Print (1 < 5) Eqv (2 < 5) ' True Eqv True = True
Debug.Print (1 < 5) Eqv (2 > 5) ' True Eqv False = False
Debug.Print (1 > 5) Eqv (2 < 5) ' False Eqv True = False
Debug.Print (1 > 5) Eqv (2 > 5) ' False Eqv False = True
Debug.Print (1 < 5) Imp (2 < 5) ' True Imp True = True
Debug.Print (1 < 5) Imp (2 > 5) ' True Imp False = False
Debug.Print (1 > 5) Imp (2 < 5) ' False Imp True = True
Debug.Print (1 > 5) Imp (2 > 5) ' False Imp False = True

Перечислим операторы сравнения и логические операторы в порядке убывания приоритета:

  1. <, >, <=, >=, =, <>.
  2. Not — логическое отрицание.
  3. And — логическое И.
  4. Or — логическое ИЛИ.
  5. Xor — логическое исключающее ИЛИ.
  6. Eqv — логическая эквивалентность.
  7. Imp — логическая импликация.

Оператор ветвления If...Else

Оператор ветвления If...Else позволяет в зависимости от значения логического выражения выполнить отдельный фрагмент программы или, наоборот, не выполнять его. Оператор имеет два формата. Первый формат является однострочным:

If <Логическое выражение> Then <Выражение1> [Else <Выражение2>]

Если <Логическое выражение> вернет значение True (истина), то выполняется <Выражение1>, а если False (ложь)  — то <Выражение2>. Блока Else может не быть. Пример проверки числа, введенного пользователем:

Dim x As Integer
x = CInt(InputBox("Введите число:"))
If x = 10 Then Debug.Print "10" Else Debug.Print "Не 10"

Второй формат оператора If...Else является блочным:

If <Логическое выражение> Then
    <Блок, выполняемый если условие истинно>
[ElseIf <Логическое выражение> Then
    <Блок, выполняемый если условие истинно>
]
...
[Else
    <Блок, выполняемый если все условия ложны>
]
End If

Для примера напишем программу, которая проверяет, является ли введенное пользователем число четным или нет (листинг 4.1). После проверки выведем соответствующее сообщение. Чтобы упростить код проверку возможности преобразования введенного значения в число выполнять не будем.

Листинг 4.1. Проверка числа на четность

Dim x As Integer
x = CInt(InputBox("Введите число:"))
If (x Mod 2) = 0 Then
   MsgBox x & " - четное число"
Else:
   MsgBox x & " - нечетное число"
End If

Оператор If...Else позволяет проверить сразу несколько условий. Рассмотрим это на примере (листинг 4.2).

Листинг 4.2. Проверка нескольких условий

Dim os As String
os = InputBox("Какой операционной системой вы пользуетесь?" & vbCr _
              & "1 - Windows 7" & vbCr & "2 - Windows XP" _
              & vbCr & "3 - Windows Vista" & vbCr & "4 - Другая" _
              & vbCr & "Введите число, соответствующее ответу:")
If os = "1" Then
   MsgBox "Вы выбрали - Windows 7"
ElseIf os = "2" Then
   MsgBox "Вы выбрали - Windows XP"
ElseIf os = "3" Then
   MsgBox "Вы выбрали - Windows Vista"
ElseIf os = "4" Then
   MsgBox "Вы выбрали - Другая"
ElseIf os = "" Then
   MsgBox "Вы не ввели число"
Else
   MsgBox "Мы не смогли определить вашу операционную систему"
End If

Один условный оператор можно вложить в другой. В этом случае отступ вложенной инструкции следует сделать в два раза больше, чтобы это было видно (листинг 4.3).

Листинг 4.3. Вложенные инструкции

Dim os As String
os = InputBox("Какой операционной системой вы пользуетесь?" & vbCr _
              & "1 - Windows 7" & vbCr & "2 - Windows XP" _
              & vbCr & "3 - Windows Vista" & vbCr & "4 - Другая" _
              & vbCr & "Введите число, соответствующее ответу:")
If os <> "" Then
   If os = "1" Then
      MsgBox "Вы выбрали - Windows 7"
   ElseIf os = "2" Then
      MsgBox "Вы выбрали - Windows XP"
   ElseIf os = "3" Then
      MsgBox "Вы выбрали - Windows Vista"
   ElseIf os = "4" Then
      MsgBox "Вы выбрали - Другая"
   Else
      MsgBox "Мы не смогли определить вашу операционную систему"
   End If
Else
   MsgBox "Вы не ввели число"
End If

Оператор выбора Select

Оператор выбора Select имеет следующий формат:

Select <Переменная или выражение>
   Case <Условие 1>
      <Инструкции>
   ...
[  Case <Условие N>
      <Инструкции>]
[  Case Else
      <Инструкции>]
End Select

В зависимости от значения параметра <Переменная или выражение> выполняется один из блоков Case, в котором указано это значение. Если ни одно из значений не описано в блоках Case, то выполняется блок Case Else (если он указан). В параметрах <Условие> можно указать:

Case "1"
<Начало> To <Конец>

Пример указания диапазона от 5 до 10 включительно:

Case 5 To 10
Case Is < 10

В одном операторе Case допустимо указание сразу нескольких условий через запятую:

Case 1, 3 To 5, Is > 10

Пример использования оператора Select приведен в листинге 4.4.

Листинг 4.4. Использование оператора Select

Dim os As String
os = InputBox("Какой операционной системой вы пользуетесь?" & vbCr _
              & "1 - Windows 7" & vbCr & "2 - Windows XP" _
              & vbCr & "3 - Windows Vista" & vbCr & "4 - Другая" _
              & vbCr & "Введите число, соответствующее ответу:")
Select Case os
   Case "1"
      MsgBox "Вы выбрали - Windows 7"
   Case "2"
      MsgBox "Вы выбрали - Windows XP"
   Case "3"
      MsgBox "Вы выбрали - Windows Vista"
   Case "4"
      MsgBox "Вы выбрали - Другая"
   Case ""
      MsgBox "Вы не ввели число"
   Case Else
      MsgBox "Мы не смогли определить вашу операционную систему"
End Select

Функции выбора

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

Dim x As Integer
x = CInt(InputBox("Введите число:"))
MsgBox IIf((x Mod 2) = 0, _
            x & " - четное число", x & " - нечетное число")
Debug.Print Choose(1, "Один", "Два", "Три") ' Один
Debug.Print Choose(2, "Один", "Два", "Три") ' Два
Debug.Print Choose(3, "Один", "Два", "Три") ' Три
Switch(<Логическое выражение1>, <Значение1>[, ...,
       <Логическое выражениеN>, <ЗначениеN>])

Пример:

Dim x As Integer
x = CInt(InputBox("Введите число:"))
Debug.Print Switch(x = 1, "Один", x = 2, "Два", x = 3, "Три")

Если пользователь введет число 1, то в окне Immediate отобразится значение "Один", если число 2 — то значение "Два", а если 3 — то значение "Три". Любое другое целочисленное значение приведет к отображению значения Null, а попытка ввести не число станет причиной ошибки времени выполнения, так как функция CInt() не сможет преобразовать значение в число.

Предыдущая статья Все статьи Следующая статья