Однострочная и многострочная конструкции оператора 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 |
Так как IIf всегда вычисляет оба результата (и если True и если False), даже если условие не выполнено, это может привести к ошибкам, если выражения содержат операции, которые не должны быть выполнены в одном из случаев.
Если вам нужно избегать этой проблемы, лучше использовать конструкцию If…Then…Else, которая будет вычислять только ту часть, которая соответствует условию.
При нажатии кнопки «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 нет события рабочего листа, привязанного к смене цвета ячейки.
Обсуждение закрыто.