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

Условные операторы позволяют в зависимости от значения логического выражения выполнить отдельный участок программы или, наоборот, не выполнять его. Логические выражения возвращают только два значения 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
  • Is — проверяет, ссылаются ли две объектные переменные на один и тот же объект. Если переменные ссылаются на один и тот же объект, то оператор Is возвращает значение 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 в самое начало модуля:
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
  • # — любая цифра от 0 до 9:
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 имеет более низкий приоритет выполнения, чем операторы сравнения.

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

  • And — логическое И. Вернет True только в случае, если оба выражения равны True:
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
  • Or — логическое ИЛИ. Вернет True, если хотя бы одно из выражений равно True:
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
  • Xor — логическое исключающее ИЛИ. Вернет True, если выражения имеют разные значения и 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
  • Eqv — логическая эквивалентность. Вернет True, если выражения имеют одинаковые значения и 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
  • Imp — логическая импликация. Вернет False, если первое выражение имеет значение True, а второе выражение — 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
  • ключевое слово Is и условие после него:
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 существует альтернатива операторам ветвления и выбора. Вместо операторов можно использовать следующие функции:

  • IIf(<Логическое выражение>, <Выражение1>, <Выражение2>) — если <Логическое выражение> вернет значение True (истина), то выполняется <Выражение1>, а если False (ложь)  — то <Выражение2>. Функция возвращает результат выполнения одного из выражений. Пример:
Dim x As Integer
x = CInt(InputBox("Введите число:"))
MsgBox IIf((x Mod 2) = 0, _
            x & " - четное число", x & " - нечетное число")
  • Choose(<Индекс>, <Значение1>[, ... , <ЗначениеN>]) — возвращает одно из заданных значений по указанному индексу. Если указан индекс 1, то возвращается первое значение из списка, если 2 — то второе значение и т.д. Функция возвращает значение Null, если индекс меньше 1 или больше числа значений в списке. Пример:
Debug.Print Choose(1, "Один", "Два", "Три") ' Один
Debug.Print Choose(2, "Один", "Два", "Три") ' Два
Debug.Print Choose(3, "Один", "Два", "Три") ' Три
  • Switch() — возвращает значение, которое соответствует первому логическому выражению, вернувшему значение True. Если нет логического выражения, возвращающего истинное значение, то функция возвращает значение Null. Формат функции:
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() не сможет преобразовать значение в число.

Visual Basic for Applications (VBA)
Статьи по Visual Basic for Applications (VBA)

Помощь сайту

Yandex-деньги: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов