ROW()函数在SUM()和SUMPRODUCT()中的行为不同

时间:2012-06-20 16:40:52

标签: excel excel-2007 excel-formula excel-2003

问题定义:

在单元格A1中输入任意数字。现在在第一行的任何地方尝试以下公式。

=SUM(INDIRECT("A"&ROW()))

=SUMPRODUCT(INDIRECT("A"&ROW()))

第一个公式计算,第二个公式给出#VALUE错误。 这是因ROW()函数在SUMPRODUCT()内的行为方式不同而引起的。

在第一个公式中,ROW()返回1。在第二个公式中,行返回{1}(一个长度的数组),即使公式尚未作为CSE公式输入。

为什么会这样?

背景

我需要评估类型的公式

=SUMPRODUCT(INDIRECT(*range formed by concatenation and using ROW()*)>1)

这样可以解决错误。作为此问题的解决方法,我现在在另一个单元格中(显然在同一行中)计算ROW()并在我的INDIRECT()内连接。或者,我也尝试将它封装在sum函数中,如SUM(ROW()),并且也可以。

如果有人可以解释(或指向一个可以解释的资源)为什么ROW()SUMPRODUCT()内返回一个数组而不输入CSE,我会很感激。

3 个答案:

答案 0 :(得分:6)

有趣的问题。这里有一些微妙的问题,我没有看到记录。

似乎INDIRECT("A"&ROW())返回一个数组,该数组由一个元素组成,该元素是对单元格的引用 - 而不是该单元格中的值。许多函数无法正确解析此类数据,但是一些函数(如N和T)可以“取消引用”数组并返回基础值。

在这种情况下,数组中有两个元素:

=SUM(N(INDIRECT("A"&ROW(1:2))))

输入数组时返回A1 + A2但正常输入时仅返回A1。但是,在此公式中将ROW(1:2)更改为{1; 2}会在正常输入时返回正确的结果。无论是否输入数组,等效的SUMPRODUCT公式都会返回A1 + A2。

这可能与参数在函数中的注册方式有关。根据{{​​3}},基本上有两种方法来注册函数参数来处理Excel数据类型:

键入R / U:“值,数组和范围引用。”

类型P / Q:“在准备这些参数时,Excel将单单元格引用转换为简单值,将多单元格引用转换为数组。”

SUM参数似乎符合R / U类型,而SUMPRODUCT参数的行为类似于P / Q类型。数组输入上面的SUM公式会强制将ROW中的范围引用参数计算为数组,而这会自动发生在SUMPRODUCT中。

<强>更新

经过一番调查,这里有进一步的证据可能支持这一理论。根据注释中的链接,公式= SUM((A1,A2))给出与以下相同的值:

?executeexcel4macro("CALL(""Xlcall32"",""Excel4"",""2JRJR"",4,,1,(!R1C1,!R2C1))")

通过将2JRJR更改为2JRJP将最后一个参数注册为类型P会在这种情况下出错,但允许使用!R1C1:!R2C1这样的单个区域范围。另一方面,将4(xlfsum)更改为228(xlfsumproduct)只允许单个区域引用,就像它被称为SUMPRODUCT一样。

答案 1 :(得分:2)

ROW()返回一个数组时,使用INDEX获取第一个元素。

然后您的示例变为:=SUMPRODUCT(INDIRECT("A"&INDEX(ROW(),1)))

答案 2 :(得分:1)

我不认为ROW()在这里表现不同,它在两种情况下都返回一个数组。我假设SUM和SUMPRODUCT以不同的方式对待该数组 - 不确定原因。

许多函数或它们的组合返回数组 - 你不需要CTRL + SHIFT + ENTER来实现这一点,在许多情况下你只需要CSE来处理创建的数组。

我只会用INDEX代替INDIRECT(这也可以避免挥发性功能对你有益),即

=SUMPRODUCT(INDEX(A:A,ROW()))

....将其扩展到您的范围此公式将计算值的数量&gt;列A中的范围为1,其中x定义起始行,y定义结束行

=COUNTIF(INDEX(A:A,x):INDEX(A:A,y),">1")

x和y可以通过公式计算

如果有更多条件要添加,您可以以类似的方式使用SUMPRODUCT或COUNTIFS