Функция IIf
работает иначе.
Это функция, а не инструкция: вы используете возвращаемое ею значение так же, как и с любой другой функцией — использовать ее для управления потоком — плохая идея.
На первый взгляд, IIf
работает примерно так же, как тернарный оператор в других языках:
string result = (foo == 0 ? "Zero" : "NonZero");
Условие, значение, если оно истинно, значение, если оно ложно, и оба возможных значения имеют один и тот же тип.
Это для поворота этого:
If foo = 0
Debug.Print "Zero"
Else
Debug.Print "NonZero"
End If
В это:
Debug.Print IIf(foo = 0, "Zero", "NonZero")
Однако будьте осторожны, IIf
оценивает обе части true и false, так что вам не нужны побочные эффекты. Например, вызов приведенной ниже процедуры Foo
:
Public Sub Foo()
Debug.Print IIf(IsNumeric(42), A, B)
End Sub
Private Function A() As String
Debug.Print "in A"
A = "A"
End Function
Private Function B() As String
Debug.Print "in B"
B = "B"
End Function
Результаты в этом выводе:
in A
in B
A
Вот почему использование IIf
для потока управления не идеально. Но когда аргументы истинный результат и ложный результат являются постоянными выражениями, при разумном использовании это может помочь улучшить читаемость кода, превратив If...Else...End If
блоков в простой вызов функции.
Как и все хорошие вещи, лучше не злоупотреблять этим.
person
Mathieu Guindon
schedule
10.12.2015
msgbox "Good " & IIF(hour(now())<12,"Morning","Afternoon")
Вы не можете использовать его для вызова подпрограмм или возобновления следующего. - person Dan Donoghue   schedule 11.12.2015If isnumeric(inputs) Then resume next Else call notnum
- person Dirk Reichel   schedule 11.12.2015