2013-06-04 31 views
4

在Excel中,是否有一個早期的退出AND功能(也稱爲短路評估)?在Excel中,是否有一個提前退出AND/OR功能(短路評估)?

例如:

=AND(FALSE, #N/A) 

返回#N/A。如果函數是「提前退出」,只要找到第一個FALSE,它就會返回FALSE,因爲沒有附加值可能會使函數返回true。

excel中是否存在這樣的函數?

+0

您可能可以根據需要調整Choose(),但我們需要更多的細節。你可以編輯你的文章,並告訴我們你的具體問題? – PowerUser

+1

此外,我建議爲此頁添加書籤:http://www.techonthenet.com/excel/formulas/index_ws.php – PowerUser

回答

11

你所說的「early opt out」通常被稱爲「short-circuit evaluation」,通常是C/C++/C#/ Java系列語言的一個特性(但主要是而不是 Visual BASIC)。

對於Excel公式,一些邏輯函數實踐短路評估,但有些則不。 AND沒有,因爲你找到了。 OR也沒有 - 如果OR表達式中的第一個參數爲真,Excel仍然會嘗試評估後續參數。

解決方法是使用嵌套IF s;對IF的評估從外部到內部逐步進行,必要時進行分支,並在沒有進一步嵌套公式進行評估時停止。這會產生正確的短路行爲。所以,你可以寫爲

=IF(FALSE, IF(ISNA(<address of cell to test for the #N/A state>), TRUE), FALSE) 

你上面的編碼,可以更清晰又如:

Cell A1 contains the value 1 and cell A2 contains the formula "=1/0", 
causing a #DIV/0 error. 

Put this formula in A3: 
=IF(A1 = 0, IF(A2 = 5, "Never get here"), "Short-circuit OK: A1 <> 0") 
+1

現代Visual Basic(即VB.NET)使用備用運算符'AndAlso'和'OrElse'來提供簡短-circuiting。但是,Excel VBA不是基於VB.NET的... – jimbobmcgee

2

你正在尋找本地Excel中不存在的功能。

然而,你可以模仿它,例如,使用IFERROR

=AND(FALSE,IFERROR(A1,FALSE)) 

(工作項2007年及以後在2003年,你需要使用=IF(ISERROR(A1),FALSE,A1),而不是IFERROR(A1,FALSE)

或者,你可以建立一個用戶自定義功能:

Public Function EarlyAnd(var1 As Variant, ParamArray vars() As Variant) As Boolean 
    On Error GoTo Finalize 
    Dim blnTemp As Boolean 
    Dim varNext As Variant 

    If Not CBool(var1) Then GoTo Finalize 
    For Each varNext In vars 
     If Not CBool(varNext) Then GoTo Finalize 
    Next 

    blnTemp = True 

Finalize: 
    EarlyAnd = blnTemp 

End Function 

將此函數放置在Visual Basic編輯器的模塊中。現在您可以在Excel中使用=EarlyAnd(False,A1)