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