17

在 Excel 中,是否有提前退出 AND 功能(也称为短路评估)?

例如:

=AND(FALSE, #N/A)

返回#N/A。如果该函数是“提前退出”,那么一旦找到第一个 FALSE,它就会返回 FALSE,因为没有其他值可以使函数返回 true。

excel中是否存在这样的功能?

4

2 回答 2

22

您所说的“提前退出”通常称为“短路评估”,通常是 C/C++/C#/Java 系列中语言的一个特性(但值得注意的是,不是Visual BASIC)。

对于 Excel 公式,一些逻辑函数会进行短路评估,但有些则不会。 AND没有,正如你所发现的。也不- 如果OR表达式中的第一个参数OR为真,Excel 仍将尝试评估后续参数。

解决方法是使用嵌套IF的s;对 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")
于 2013-06-04T20:14:21.707 回答
4

您要查找的函数在本机 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 编辑器中的一个模块中。现在您可以=EarlyAnd(False,A1)在 Excel 中使用。

于 2013-06-04T20:20:56.720 回答