Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Условные операторы и циклы
Условные операторы позволяют в зависимости от значения логического выражения выполнить отдельный участок программы или, наоборот, не выполнять его. Логические выражения возвращают только два значения 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
Перечислим операторы сравнения и логические операторы в порядке убывания приоритета:
<
,>
,<=
,>=
,=
,<>
.Not
— логическое отрицание.And
— логическое И.Or
— логическое ИЛИ.Xor
— логическое исключающее ИЛИ.Eqv
— логическая эквивалентность.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()
не сможет преобразовать значение в число.
Помощь сайту
Yandex-деньги: 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов