Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Оператор If…Then…Else и функция IIf

    Однострочная и многострочная конструкции оператора If…Then…Else и функция IIf, используемые в коде VBA Excel — синтаксис, компоненты, примеры.

    Оператор If…Then…Else

    Оператор If…Then…Else предназначен для передачи управления одному из блоков операторов в зависимости от результатов проверяемых условий.

    Однострочная конструкция

    Оператор If…Then…Else может использоваться в однострочной конструкции без ключевых слов Else, End If.

    Синтаксис однострочной конструкции If…Then…

    Компоненты однострочной конструкции If…Then…

    • условие — числовое или строковое выражение, возвращающее логическое значение True или False;
    • операторы — блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True.

    Если компонент условие возвращает значение False, блок операторов конструкции If…Then… пропускается и управление программой передается следующей строке кода.

    Пример 1

    Многострочная конструкция

    Синтаксис многострочной конструкции If…Then…Else

    Компоненты многострочной конструкции If…Then…Else:

    • условие — числовое или строковое выражение, следующее за ключевым словом If или ElseIf и возвращающее логическое значение True или False;
    • операторы — блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True;
    • пунктирная линия обозначает дополнительные структурные блоки из строки ElseIf [условие] Then и строки [операторы].

    Если компонент условие возвращает значение False, следующий за ним блок операторов конструкции If…Then…Else пропускается и управление программой передается следующей строке кода.

    Самый простой вариант многострочной конструкции If…Then…Else:

    Пример 2

    Функция IIf

    Функция IIf проверяет заданное условие и возвращает значение в зависимости от результата проверки.

    Синтаксис функции

    Компоненты функции IIf

    • условие — числовое или строковое выражение, возвращающее логическое значение True или False;
    • если True — значение, которое возвращает функция IIf, если условие возвратило значение True;
    • если False — значение, которое возвращает функция IIf, если условие возвратило значение False.

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

    Пример 3

    Пример 4
    Стоит отметить, что не зависимо от того, выполняется условие или нет, функция IIf вычислит оба выражения в параметрах если True и если False:

    Так как IIf всегда вычисляет оба результата (и если True и если False), даже если условие не выполнено, это может привести к ошибкам, если выражения содержат операции, которые не должны быть выполнены в одном из случаев.

    Если вам нужно избегать этой проблемы, лучше использовать конструкцию If…Then…Else, которая будет вычислять только ту часть, которая соответствует условию.


    При нажатии кнопки «Cancel» или закрытии крестиком диалогового окна InputBox из первых двух примеров, генерируется ошибка, так как в этих случаях функция InputBox возвращает пустую строку. Присвоение пустой строки переменной d типа Integer вызывает ошибку. При нажатии кнопки «OK» диалогового окна, числа, вписанные в поле ввода в текстовом формате, VBA Excel автоматически преобразует в числовой формат переменной d. В третьем примере есть обработчик ошибок.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    23 комментария для “VBA Excel. Оператор If…Then…Else и функция IIf”

    1. Александр

      при ElseIf после Then выражение должно быть обязательно с новой строки

    2. Евгений

      Спасибо, Александр!
      Я изменил некоторые формулировки в статье, допускающие неоднозначное толкование. Кроме того, я решил проверить, что будет, если поместить при ElseIf выражение после Then, и вот что получилось:

      Код работает! Но он не будет работать, если строки

      заменить на строку

      или на строку

    3. Конструкция:
      if (condition)
      then (action 1)
      else (action 2)
      Допустим, condition = true. Следовательно, выполняется action 1. Но затем операции, совершенные в action 1, приводят к тому, что условие уже не соблюдается, т.е. после завершения action 1 condition = false. Означает ли это, что сработает также конструкция else и будут выполняться операции action 2? Или условие всей конструкции if-then-else проверяется в один момент времени и не подвержено влиянию операций внутри конструкции?

      1. Евгений

        Привет, Михаил!
        Условие в вашей конструкции проверяется один раз:

        И даже если в конструкции используется блок ElseIf ... Then, для проверки условия используется первоначальное значение:

        В обоих случаях MsgBox выведет число 5.

    4. чем отличается однострочная и многострочная форма синтаксиса

      1. Евгений

        Привет, Виктор!
        Однострочная запись короче и работает только с одним условием.

        1. Сбитый Лётчик Небосводов

          Здравствуйте, Евгений!
          Однострочная запись работает не только с одним условием.

          1. Евгений

            Добрый вечер!
            Здесь «одно условие» означает выражение, которое может состоять из нескольких входящий в него условий (лучше сказать «под-условий») и возвращает логическое значение True или False. Такое выражение может быть только одно в однострочной записи.

            Второе условие расположено в многострочной записи после ключевого слова Then и операторов, выполняемых при истинном значении первого условия, и предваряется ключевым словом ElseIf.

            1. Сбитый Лётчик Небосводов

              Здравствуйте, Евгений!
              Может знаете, что быстрее

              или

            2. Сбитый Лётчик Небосводов

              Здравствуйте, Евгений!
              Продолжим спор 🙂
              Однострочная запись работает не только с одним условием.

              P.S. Удалите мои сообщения, которые нужно удалить.

              1. Евгений

                Привет!
                Я и не думал, что такое возможно! Добавил Else — тоже работает:

                Видимо, незадокументированные возможности однострочной функции If.

    5. Решить с помощью VBA
      Определите, является ли заданное целое число А нечётным двузначным
      числом.

      1. Евгений

        Привет, Икром!
        Решение может быть таким:

    6. Сбитый Лётчик Небосводов

      Здравствуйте!
      «блок операторов после ключевого слова Else выполняется в любом случае, но структурный блок кода из строки Else и строки [операторы] не является обязательным и может быть пропущен».
      Это только у меня вызывает недоумение?
      «блок операторов после ключевого слова Else выполняется в любом случае»?! Да ну!
      И то, что после «но» вовсе не противоречит первой части, хотя при употреблении «но» должно бы.
      А по смыслу вторая это «после но» д.б. в отдельном предложении, даже в отдельном абзаце.

      1. Евгений

        Добрый день!
        Согласен. Это выражение касается функции IIf. Исправил. Спасибо за бдительность!

    7. Есть столбик с процентами выполнения плана. Если больше 70%,то цвет текста зеленый, если меньше 40% то цвет текста красный. Как это прописать у меня получается только покрасить весь столбец в красный. Помогите пожалуйста я всю голову словмал что не так.

      1. Евгений

        Павел, если в ячейке с процентным форматом отображается 90%, то фактически в ней содержится число 0,9. Вам надо сравнивать значения ячеек не с 70 и 40, а с 0,7 и 0,4.

        1. Евгений, я так пробовал, но тогда сразу подсвечивается красным вся переменная.

          И не работает, просто красит весь столбик в красный то есть работает вторая строка, первая с зеленым цветом не работает, он проскакивает её.

          1. Евгений

            Павел, я исправил код в вашем комментарии. Пробуйте снова.

    8. Добрый день!
      Во втором примере получается все цифры от 31 до бесконечности в четвертом десятке (хотя диапазон от 1 до 40). Может стоит дописать как в третьем примере, чтобы при несоответствии цифры возвращал на начальное окно ввода?

    9. Как написать код, чтобы при закрашивании ячейки красным цветом открывалась почта аутлук?

      1. Евгений

        Добрый день, Егор!
        В VBA Excel нет события рабочего листа, привязанного к смене цвета ячейки.

    Обсуждение закрыто.