2012-05-03 58 views
7

Excel的if函數有三個參數,一個條件,一個if-true值和一個if-false值。 Excel是否計算出所有三個參數的值,還是隻計算出條件的值和相應的結果?Excel是否評估提供給IF函數的結果參數?

澄清:我不知道該結果if會,我想知道什麼它是否計算的所有參數計算函數的結果前的值。

這相當於詢問if函數是否使用惰性或嚴格評估。例如,下面的僞代碼:

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

會拋出一個除以零異常的語言,全面嚴格的評估,因爲它會評估1/0,即使結果將不需要爲?:運營商。

在懶惰評估語言中,在決定要評估哪個表達式之前,?:運算符會評估x>2

問題是,在Excel中,1/0會生成表達式中可以存在的合法值(正好是#DIV/0!)。因此,簡單地調用=if(true,1,1/0)並不顯示Excel是否正在評估1/0

+0

查看我的更新回答。 –

回答

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())

只有獲得每IF()細胞的計算一個MSGBOX。

隨着進一步的驗證,這給你兩個MSGBOX - 每個:

Sub Tester() 
    Debug.Print IIf(True, TruePart(), FalsePart()) 
End Sub 
+0

我實際上是在討論Excel函數if,而不是Excel VBA語句if。 – Joe

+0

太棒了!我不會猜測你可以在'Function'中使用'Msgbox'。蒂姆,非常好, – Joe

+0

! +1 –

0

我有相反的答案添,而是基於2010 XL如果功能:

=IF(TRUE,1,1/0) 

沒有按」 t產生#DIV/0錯誤,

=IF(FALSE,1,1/0) 

確實。此外,my reading意味着只評估適當的條件。

+0

這實際上並不表示Excel是否首先計算「1/0」。它可以評估所有參數,導致IF(TRUE,1,#DIV/0),然後評估函數。 – Joe

+0

@Doug - 我在不同的軌道上... –

+1

@TimWilliams,很高興看到你是人類:)。 –

2

幾個簡單的測試:

=IF(TRUE,1,1/0)

=IF(FALSE,1/0,1)

既不導致DIV/0錯誤,因此人們可以得出結論:只有條件的相應的結果實際上被評估。顯然,條件本身也必須進行評估。

在更復雜的公式中,您還可以使用評估公式工具來觀察如何分析IF語句。

+0

我的回答和@Doug Glancy有趣的區別。我使用XL2007。 –

+0

Excel仍然可以計算'1/0',然後返回另一個參數作爲函數的結果。 – Joe

+0

我們的第二個公式是不同的。我的評估結果爲False,因此產生錯誤。我們的結果是一樣的。 –

2

它沒有。

Excel 2013只評估必要的代碼。

我有一個非常複雜和耗時的單元格公式來複制幾十萬行。計算需要幾個小時。但幸運的是,當結果爲零時,根據其他標準很容易確定。

因此,使用If語句來避免計算時,其他條件建議它必須爲零,並且只在必要時執行計算才能大大加快處理速度,將處理時間減少到前一個的約10%。

如果Excel正在評估這兩個表達式,If語句只會增加複雜性和時間。

1

Excel似乎使用IF()函數的熱切評估(即總是評估所有三個參數)。爲了測試沒有VBA,打開工作簿自動計算,並進入一個新的工作簿中的單元格:

=IF(TRUE, 0, RAND()) 

保存並關閉工作簿。再次打開工作簿並再次關閉,Excel將顯示「保存更改」提示,因爲已對易失性函數RAND()進行了評估。

更改RAND()1而Excel不顯示提示。

+0

這不是一個證明。在我看來,這是發生了什麼事情:Excel認識到單元格包含一個包含*** volatile volatile函數('RAND()')的公式,因此它會重新計算公式並因此提示您保存工作簿。 – Teejay