В этом руководстве объясняется, как использовать IIF в VBA.
Функция VBA IIF аналогична использованию функции ЕСЛИ в Excel. Он проверяет, выполняется ли условие, возвращая одно значение (или расчет), если ИСТИНА, другое значение (или расчет), если ЛОЖЬ.
Он похож на оператор If в VBA, многие считают его сокращением использования этого метода, поскольку вам нужно написать только одну строку кода, чтобы получить желаемый результат, а не использовать Если… Тогда… Иначе… Конец Если рутина. Однако его необходимо использовать правильно, поскольку это может привести к проблемам в вашем коде.
IIF синтаксис
Функция IFF состоит из 3 частей - логической проверки, истинной части и ложной части.
- Выражение:Логический тест, который предстоит пройти.
- Истинная часть: Результат, который будет возвращен, если логический тест - ИСТИНА.
- Ложная часть: Результат, который будет возвращен, если логическая проверка - ЛОЖЬ.
Написание процедуры функции IIF
123 | Функция GetNames (strName As String) As StringGetNames = IIf (strName = "John", "Имя - Джон", "Имя не Джон")Конечная функция |
В приведенной выше функции мы можем использовать подпроцедуру, чтобы проверить, является ли переменная, которую мы передаем функции, строкой «Джон».
123 | Sub TestGetNamaes ()MsgBox GetNames («Джон»)Конец подписки |
Если бы мы запускали подпроцедуру TestGetNames, она вызывала бы функцию GetNames и возвращала бы окно сообщения.
Если бы вместо этого мы использовали метод If, код выглядел бы так:
1234567 | Функция GetNames (strName As String) As StringЕсли (strName = "John") ТогдаGetNames = "Меня зовут Джон"ЕщеGetNames = "Имя не Джон"Конец, еслиКонечная функция |
Мы фактически написали одну строку кода вместо пяти - впечатляюще!
Зачем использовать If вместо?
Рассмотрим следующие
123 | Функция GetNames (strName As String) As StringGetNames = IIf (strName = "Джон", MsgBox ("Имя - Джон"), MsgBox ("Имя не Джон"))Конечная функция |
Теперь, если вы запустите следующую подпроцедуру для вызова вашей функции
123 | Sub TestGetNames ()GetNames («Джон»)Конец подписки |
Вы получите то же окно сообщения, что и раньше, но сразу после этого вы получите следующее окно сообщения!
Функция IIF выполняет разделы ИСТИНА и ЛОЖЬ в строке кода - она не выходит из кода после того, как обнаруживает, что условие истинно - она по-прежнему выполняет раздел Ложь, таким образом давая нам ложное сообщение в второе окно сообщения. Если бы вы использовалиЕсли… Тогда… Иначе… Конец Если - этого бы не произошло - функция ЕСЛИ выполняет только раздел кода ИСТИНА или ЛОЖЬ - в зависимости от логики, передаваемой коду.
Код плохо спроектирован (специально!), Окна сообщений удерживаются внутри строки кода, в которой находится оператор IIF, а не после кода или в подпрограмме. Поскольку функция IIF запускает разделы TRUE и FALSE инструкции, возвращаются оба сообщения.
Мы могли бы исправить эту ошибку, переместив окно сообщения ниже строки функции IIF, как в приведенном ниже коде, или переместив окно сообщения в подпроцедуру, как в первом примере в этой статье.
1234 | Функция GetNames (strName As String) As StringGetNames = IIf (strName = "John", "Имя - Джон", "Имя не Джон")MsgBox (GetNames)Конечная функция |
Если вы будете осторожны при написании кода, функция IIF может сэкономить вам много строк кода и лишний набор текста!
Вложенные IIF
Мы можем вложить IIF-функцию аналогично вложению IF-функции, но опять же, все делается в одной строке.
123 | Функция GetDiscount (dblPrice As Double) As DoubleGetDiscount = IIf (dblPrice> = 500, 10, IIf (dblPrice> = 250, 5, IIf (dblPrice> = 100, 2.5, 0)))Конечная функция |
Затем мы могли бы вызвать эту функцию из подпроцедуры
12345 | Дополнительная скидка на поиск ()Dim dblP как двойнойdblP = 899MsgBox ("Вы можете получить скидку" & GetDiscount (dblP) & "%")Конец подписки |
или вы можете вызвать его из Excel, используя его как UDF (определяемую пользователем функцию)