【问题标题】:Excel: What determines evaluation order in a formula?Excel:什么决定了公式中的评估顺序?
【发布时间】:2013-11-20 03:49:09
【问题描述】:

我在 A1:G1 中有一个包含以下内容的工作表

7  8  4  2  9  11  10

公式

=SUMPRODUCT(MIN($B1:$G1-$A1)) (1)

计算为 -5,

=SUMPRODUCT(ABS($B1:$G1-$A1)) (2)

计算为 18。但是

=SUMPRODUCT(MIN(ABS($B1:$G1-$A1))) (3)

#VALUE!

为了试图理解这个问题,我使用了公式审核 -> 评估公式。 在有效的公式(1 和 2)中,首先计算 $A1(下划线)。 在不起作用的公式 (3) 中,首先对 $B1:$G1 求值(下划线)。

错误的原因是什么,公式之间的行为不同?

【问题讨论】:

  • 我喜欢这个问题。查了一下,我发现这个解决方案并不完全令人满意 - 但它可能会派上用场:office.microsoft.com/en-001/excel-help/…
  • 对于第三个公式,当公式在 A 列时我可以复制,但如果我填写正确,我会在每个单元格中看到不同的结果,这很奇怪,因为公式没有改变.
  • @mr.Reband 不错的发现!实际上,我最初在 O1 中输入了我的公式。我会在这里挖掘。不过,我觉得有趣的是:1)评估顺序不同,2)与公式(3)相反,将公式(1)类似地填充到右侧会给出恒定的结果。
  • @Mark :我没有在您的链接中找到解决方案的提示。您是指将公式作为数组输入(如 John 的回答)?
  • @sancho.s 是的,这就是为什么我添加评论并提到我发现的不是解决方案但可能会更好地理解并且可以提出新想法(或没有):)

标签: excel nested excel-formula


【解决方案1】:

根据我的评论,要在不使用“输入数组”公式的情况下获得 A1 和 B1:G1 之间的最小差异,您可以使用 INDEX 来执行您尝试使用 SUMPRODUCT 执行的操作,即

=MIN(INDEX(ABS($B1:$G1-$A1),0))

【讨论】:

    【解决方案2】:

    您似乎正在使用 SUMPRODUCT 函数使此公式作为数组公式工作,并且 Excel 没有将您的第三个公式计算为数组,当在列中输入公式时会出现 #VALUE 错误A. 它在 B 到 G 列中没有给我这个错误,但它也没有作为数组计算。输入公式后按 Shift+Ctrl+Enter 将公式作为数组公式输入将解决此问题。您还可以使用更简单的公式获得相同的结果:

    =MIN(ABS($B1:$G1-$A1))
    

    将其作为数组公式输入后,您将能够逐步完成评估并查看它是否正常工作。

    这里有更多关于数组的信息:http://office.microsoft.com/en-us/excel-help/introducing-array-formulas-in-excel-HA001087290.aspx

    【讨论】:

    • 感谢您的指点。我知道将它作为数组公式输入它可以工作,但我的意思是要避免这种情况。这就是引入SUMPRODUCT的原因,我不明白为什么它只在某些情况下有效。该问题专门针对理解这一点,而不是针对达到预期结果的替代方法。
    • +1,很好的答案 - SUMPRODUCT 并不总是神奇地将需要数组输入的公式转换为不需要的公式,我认为 ABS 需要 CSE - TRANSPOSE 属于同一类别
    • @sancho.s,您的问题不是评估顺序,而是 Excel 评估的方式(数组与常规函数)。解决方案是强制 Excel 作为一个数组进行评估,而不是让它通过在数组函数中嵌套非数组函数来决定如何评估(SUMPRODUCT 是一个数组函数)。有趣的是,Excel 在评估为数组与常规函数时如何翻转评估顺序。我从来没有注意到这一点。
    • 文档说ABS 接受一个数字作为输入,MIN 接受任意数量的数字,SUMPRODUCT 接受任意数字或数组。好像当 ABS 嵌套太深时,它默认取数字并且无法弄清楚如何返回数组
    • 好点 Brad,所以为了抵消我们可以使用 INDEX 圆形 ABS 并在没有“数组输入”和没有 SUMPRODUCT 的情况下获得正确的结果,即 =MIN(INDEX(ABS($B1:$G1-$A1),0))
    【解决方案3】:

    通过Bradbarry houdini (originally this) 总结 cmets:

    文档说ABS 接受一个数字作为输入,MIN 接受任意数字,SUMPRODUCT 接受任意数字或数组。好像ABS 嵌套得太深,默认取数字,不知道如何返回数组。

    所以为了抵消我们可以使用INDEXABS 并在没有“数组条目”和没有SUMPRODUCT 的情况下得到正确的结果,即=MIN(INDEX(ABS($B1:$G1-$A1),0))

    这显示了输入公式的正确方法,并解释了错误的原因。

    【讨论】:

      【解决方案4】:

      我认为您正在使用“公式 > 评估公式”进行调查

      结果是典型的数学运算:从内到外对函数进行评估。

      因为=SUMPRODUCT(MIN(ABS($B1:$G1-$A1))) 不会被强制计算为数组,所以$B1:$G1 将从调用单元所在的同一列返回该数组的值。 IE。如果 B2 = 则 $B1:$G1 将返回 B1,如果 A2= $B1:$G1 则它将尝试返回 A1 但没有任何内容可返回,因此它会给您#VALUE 错误。

      【讨论】:

      • 我承认没有完全理解你的答案(我会考虑的)。同时,与两者相比,您认为它是否解释了仅与 MINABS 之一一起使用时的不同行为?
      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      相关资源
      最近更新 更多