Вопрос по excel, if-statement – Оценивает ли Excel оба аргумента результата, переданных в функцию IF?

7

Excel & APOS; sif Функция принимает три аргумента: условие, значение if-true и значение if-false. Работает ли Excel значение всех трех аргументов или только значение условия и соответствующий результат?

Clarification: Мне не интересно, чтоresult изif мне будет интересно, вычисляет ли он значение всех аргументов перед вычислением результата функции.

Это равносильно тому, чтобы спросить,if Функция использует ленивую или строгую оценку. Например, следующий псевдокод:

<code>x = 5;
print x>2 ? "Bigger" : "Smaller" + 1/0
</code>

бросил бы исключение деления на ноль в языке с полностью строгой оценкой, так как это оценило бы1/0даже если результат не потребуется для?: оператор.

На ленивом языке оценки?: Оператор оценитx>2 прежде чем даже решить, какое выражение для оценки.

Проблема в том, что в Excel1/0 производит законное значение (которое оказывается#DIV/0!) которые могут существовать в выражениях. Поэтому просто звоню=if(true,1,1/0) не показывает, оценивает ли Excel1/0 или нет.

Смотрите мой обновленный ответ. Tim Williams

Ваш Ответ

5   ответов
6

? iif(true, 1, 1/0) 'run-time error: division by zero

Я предполагаю, что вы действительно имеете в виду iif () - в VBA это не "короткое замыкание", поэтому вы должны использоватьIf..Then..Else..End If в тех случаях, когда это может быть проблемой.

Хорошо - тестирование того, что вы действительно спросили:

'In a VBA module
Function TruePart()
      MsgBox "True part"
      TruePart = "True"
End Function


Function FalsePart()
      MsgBox "False part"
      FalsePart = "False"
End Function

В клетке:=IF(TRUE,truepart(),falsepart())

Получите только один msgbox для расчета ячейки IF ().

В качестве дополнительной проверки вы получите два сообщения msgbox - по одному для каждого:

Sub Tester()
    Debug.Print IIf(True, TruePart(), FalsePart())
End Sub 
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededMsgboxError: User Rate Limit ExceededFunction. Joe
Error: User Rate Limit ExceededifError: User Rate Limit Exceededif. Joe
Error: User Rate Limit ExceedednotError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

Excel 2013 только оценивает необходимый код.

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

Таким образом, использование оператора If для избежания вычислений, когда другие критерии предполагают, что оно должно быть нулевым, и выполнение вычислений только в случае необходимости значительно ускорило процесс, сократив время обработки примерно до 10% от предыдущего.

Если бы Excel оценивал оба выражения, оператор If добавил бы только сложность и время.

2

=IF(TRUE,1,1/0)

=IF(FALSE,1/0,1)

Ни один из них не приводит к ошибке div / 0, поэтому можно сделать вывод, что на самом деле оценивается только соответствующий результат условия. Очевидно, само условие также должно быть оценено.

В более сложных формулах вы также можете использовать инструмент Evaluate Formula, чтобы посмотреть, какIF заявления разбираются.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded1/0Error: User Rate Limit Exceeded Joe
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded=IF(TRUE,"sucess",IF(TRUE,0/0,LOG(-1)))Error: User Rate Limit ExceededIFError: User Rate Limit Exceeded
1

IF() функция (т.е. всегда оценивает все три аргумента). Чтобы проверить без VBA, включите автоматический расчет рабочей книги и войдите в ячейку новой рабочей книги:

=IF(TRUE, 0, RAND())

Сохраните и закройте рабочую книгу. Снова откройте рабочую книгу и c, снова проиграйте, и в Excel отобразится «сохранить изменения». подскажите, потому что изменчивая функцияRAND() был оценен.

+ ИзменитьRAND() в1 и Excel не показывает подсказку.

Error: User Rate Limit ExceededvolatileError: User Rate Limit ExceededRAND()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded1/0Error: User Rate Limit ExceededIF(TRUE,1,#DIV/0)Error: User Rate Limit Exceeded Joe
0

основанный вместо этого на XL 2010 If Function:

=IF(TRUE,1,1/0)

не выдает ошибку # DIV / 0,

=IF(FALSE,1,1/0)

делает. Также,мое чтение подразумевает, что оценивается только соответствующее условие.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded1/0Error: User Rate Limit ExceededIF(TRUE,1,#DIV/0)Error: User Rate Limit Exceeded Joe
Error: User Rate Limit Exceeded

Похожие вопросы