Однострочная и многострочная конструкции оператора If…Then…Else и функция IIf, используемые в коде VBA Excel — синтаксис, компоненты, примеры.
Оператор If…Then…Else
Оператор If…Then…Else предназначен для передачи управления одному из блоков операторов в зависимости от результатов проверяемых условий.
Однострочная конструкция
Оператор If…Then…Else может использоваться в однострочной конструкции без ключевых слов Else, End If.
Синтаксис однострочной конструкции If…Then…
1 |
If [условие] Then [операторы] |
Компоненты однострочной конструкции If…Then…
- условие — числовое или строковое выражение, возвращающее логическое значение True или False;
- операторы — блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True.
Если компонент условие возвращает значение False, блок операторов конструкции If…Then… пропускается и управление программой передается следующей строке кода.
Пример 1
1 2 3 4 5 6 |
Sub Primer1() Dim d As Integer, a As String d = InputBox("Введите число от 1 до 20", "Пример 1", 1) If d > 10 Then a = "Число " & d & " больше 10" MsgBox a End Sub |
Многострочная конструкция
Синтаксис многострочной конструкции If…Then…Else
1 2 3 4 5 6 7 8 |
If [условие] Then [операторы] ElseIf [условие] Then [операторы] ---------------- Else [операторы] End If |
Компоненты многострочной конструкции If…Then…Else:
- условие — числовое или строковое выражение, следующее за ключевым словом If или ElseIf и возвращающее логическое значение True или False;
- операторы — блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True;
- пунктирная линия обозначает дополнительные структурные блоки из строки
ElseIf [условие] Then
и строки[операторы]
.
Если компонент условие возвращает значение False, следующий за ним блок операторов конструкции If…Then…Else пропускается и управление программой передается следующей строке кода.
Самый простой вариант многострочной конструкции If…Then…Else:
1 2 3 4 5 |
If [условие] Then [операторы] Else [операторы] End If |
Пример 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub Primer2() Dim d As Integer, a As String d = InputBox("Введите число от 1 до 40", "Пример 2", 1) If d < 11 Then a = "Число " & d & " входит в первую десятку" ElseIf d > 10 And d < 21 Then a = "Число " & d & " входит во вторую десятку" ElseIf d > 20 And d < 31 Then a = "Число " & d & " входит в третью десятку" Else a = "Число " & d & " входит в четвертую десятку" End If MsgBox a End Sub |
Функция IIf
Функция IIf проверяет заданное условие и возвращает значение в зависимости от результата проверки.
Синтаксис функции
1 |
IIf([условие], [если True], [если False]) |
Компоненты функции IIf
- условие — числовое или строковое выражение, возвращающее логическое значение True или False;
- если True — значение, которое возвращает функция IIf, если условие возвратило значение True;
- если False — значение, которое возвращает функция IIf, если условие возвратило значение False.
Компоненты если True и если False могут быть выражениями, значения которых будут вычислены и возвращены.
Пример 3
1 2 3 4 5 6 7 8 9 |
Sub Primer3() Dim d As Integer, a As String Instruk: On Error Resume Next d = InputBox("Введите число от 1 до 20 и нажмите OK", "Пример 3", 1) If d > 20 Then GoTo Instruk a = IIf(d < 10, d & " - число однозначное", d & " - число двузначное") MsgBox a End Sub |
Пример 4
Стоит отметить, что не зависимо от того, выполняется условие или нет, функция IIf вычислит оба выражения в параметрах если True и если False:
1 2 3 4 5 6 7 8 9 10 11 |
Sub Primer4() On Error GoTo Instruk Dim x, y x = 10 y = 5 MsgBox IIf(x = 10, x + 5, y + 10) MsgBox IIf(x = 10, x + 5, y / 0) Exit Sub Instruk: MsgBox "Произошла ошибка: " & Err.Description End Sub |
При нажатии кнопки «Cancel» или закрытии крестиком диалогового окна InputBox из первых двух примеров, генерируется ошибка, так как в этих случаях функция InputBox возвращает пустую строку. Присвоение пустой строки переменной d типа Integer вызывает ошибку. При нажатии кнопки «OK» диалогового окна, числа, вписанные в поле ввода в текстовом формате, VBA Excel автоматически преобразует в числовой формат переменной d. В третьем примере есть обработчик ошибок.
при ElseIf после Then выражение должно быть обязательно с новой строки
Спасибо, Александр!
Я изменил некоторые формулировки в статье, допускающие неоднозначное толкование. Кроме того, я решил проверить, что будет, если поместить при ElseIf выражение после Then, и вот что получилось:
Код работает! Но он не будет работать, если строки
заменить на строку
или на строку
Конструкция:
if (condition)
then (action 1)
else (action 2)
Допустим, condition = true. Следовательно, выполняется action 1. Но затем операции, совершенные в action 1, приводят к тому, что условие уже не соблюдается, т.е. после завершения action 1 condition = false. Означает ли это, что сработает также конструкция else и будут выполняться операции action 2? Или условие всей конструкции if-then-else проверяется в один момент времени и не подвержено влиянию операций внутри конструкции?
Привет, Михаил!
Условие в вашей конструкции проверяется один раз:
И даже если в конструкции используется блок
ElseIf ... Then
, для проверки условия используется первоначальное значение:В обоих случаях MsgBox выведет число 5.
чем отличается однострочная и многострочная форма синтаксиса
Привет, Виктор!
Однострочная запись короче и работает только с одним условием.
Здравствуйте, Евгений!
Однострочная запись работает не только с одним условием.
Добрый вечер!
Здесь «одно условие» означает выражение, которое может состоять из нескольких входящий в него условий (лучше сказать «под-условий») и возвращает логическое значение True или False. Такое выражение может быть только одно в однострочной записи.
Второе условие расположено в многострочной записи после ключевого слова Then и операторов, выполняемых при истинном значении первого условия, и предваряется ключевым словом ElseIf.
Здравствуйте, Евгений!
Может знаете, что быстрее
или
Не знаю, не сравнивал. Измерьте скорость выполнения обоих вариантов с помощью функции MicroTimer.
Здравствуйте, Евгений!
Продолжим спор 🙂
Однострочная запись работает не только с одним условием.
P.S. Удалите мои сообщения, которые нужно удалить.
Привет!
Я и не думал, что такое возможно! Добавил Else — тоже работает:
Видимо, незадокументированные возможности однострочной функции If.
Решить с помощью VBA
Определите, является ли заданное целое число А нечётным двузначным
числом.
Привет, Икром!
Решение может быть таким:
Здравствуйте!
«блок операторов после ключевого слова Else выполняется в любом случае, но структурный блок кода из строки Else и строки [операторы] не является обязательным и может быть пропущен».
Это только у меня вызывает недоумение?
«блок операторов после ключевого слова Else выполняется в любом случае»?! Да ну!
И то, что после «но» вовсе не противоречит первой части, хотя при употреблении «но» должно бы.
А по смыслу вторая это «после но» д.б. в отдельном предложении, даже в отдельном абзаце.
Добрый день!
Согласен. Это выражение касается функции IIf. Исправил. Спасибо за бдительность!
Есть столбик с процентами выполнения плана. Если больше 70%,то цвет текста зеленый, если меньше 40% то цвет текста красный. Как это прописать у меня получается только покрасить весь столбец в красный. Помогите пожалуйста я всю голову словмал что не так.
Павел, если в ячейке с процентным форматом отображается 90%, то фактически в ней содержится число 0,9. Вам надо сравнивать значения ячеек не с 70 и 40, а с 0,7 и 0,4.
Евгений, я так пробовал, но тогда сразу подсвечивается красным вся переменная.
И не работает, просто красит весь столбик в красный то есть работает вторая строка, первая с зеленым цветом не работает, он проскакивает её.
Павел, я исправил код в вашем комментарии. Пробуйте снова.
Добрый день!
Во втором примере получается все цифры от 31 до бесконечности в четвертом десятке (хотя диапазон от 1 до 40). Может стоит дописать как в третьем примере, чтобы при несоответствии цифры возвращал на начальное окно ввода?
Как написать код, чтобы при закрашивании ячейки красным цветом открывалась почта аутлук?
Добрый день, Егор!
В VBA Excel нет события рабочего листа, привязанного к смене цвета ячейки.
Обсуждение закрыто.