Синтаксическая ошибка при использовании IIf

Это простой вопрос, я надеюсь. Я узнал о IIf сегодня и хочу реализовать его в некоторых случаях, чтобы сэкономить несколько строк.

IIF(isnumeric(inputs), resume next, call notnum)

Это выделено красным цветом, что означает синтаксическую ошибку, как это исправить? Я отсканировал статью MSDN по этому поводу, поэтому я не ленюсь здесь.


person Thomas Shera    schedule 10.12.2015    source источник
comment
Что вы подразумеваете под isnumeric(inputs) - это функция, которая возвращает логическое значение? Это массив логических значений?   -  person Branden Keck    schedule 10.12.2015
comment
Входные данные - это пользовательский ввод, я хочу проверить на нем IfNumeric.   -  person Thomas Shera    schedule 10.12.2015
comment
Чего именно вы пытаетесь достичь?   -  person A.S.H    schedule 11.12.2015
comment
IIF используется для возврата результата, например msgbox "Good " & IIF(hour(now())<12,"Morning","Afternoon") Вы не можете использовать его для вызова подпрограмм или возобновления следующего.   -  person Dan Donoghue    schedule 11.12.2015
comment
как это выглядит, почему бы просто не использовать If isnumeric(inputs) Then resume next Else call notnum   -  person Dirk Reichel    schedule 11.12.2015


Ответы (3)


Функция 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
comment
Итак, я не могу вызывать функции с помощью IIf или запускать IsNumeric? - person Thomas Shera; 10.12.2015
comment
@ThomasShera как часть условия, да; вы можете построить свое логическое выражение из значения, возвращаемого IsNumeric. Что укусит вас в тыл в тот или иной момент, так это если истинная часть или ложная часть имеет побочные эффекты. Другими словами, последние два параметра IIf всегда должны быть постоянными выражениями, - person Mathieu Guindon; 11.12.2015

Вы не можете использовать iif таким образом.

Вот возможный способ решить эту проблему:

if isnumeric(input) then
    do something ...
else
    call notnum
end if
person SQL Police    schedule 10.12.2015
comment
Итак, я не могу вызывать функции с помощью IIf или запускать IsNumeric? - person Thomas Shera; 10.12.2015
comment
@ThomasShera Да, вы не можете вызывать никакую другую функцию в iif. Если вы хотите вызвать функцию, вы должны использовать классический if - person SQL Police; 11.12.2015

IIf возвращает значение. Как заявил Мэт Мэг, вы можете использовать его для передачи данных в другой метод или функцию, но вы не можете вызвать процедуру или функцию, которая не имеет возвращаемого значения. Однако IsNumeric() для условного выражения в порядке.

person Reen de Winter    schedule 10.12.2015