ROW()函数在SUM()和SUMPRODUCT()

问题定义:

在单元格A1input任何数字。 现在在第一行的任何地方尝试下面的公式。

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

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

第一个公式评估,第二个公式给出一个#VALUE错误。 这是由SUMPRODUCT() ROW()函数的行为不同造成的。

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

为什么会发生?

背景

我需要评估一个types的公式

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

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

如果有人能够解释(或者指出一个可以解释的资源),为什么ROW()返回SUMPRODUCT()一个数组而没有被CSEinput,我肯定会很感激。

有趣的问题。 这里有些微妙的问题我没有看到。

看起来INDIRECT("A"&ROW())返回一个由一个元素组成的数组,该元素是一个单元格的引用,而不是该单元格中的值。 许多函数无法正确parsing这种types的数据,但是一些函数(如N和T)可以“解引用”数组并返回底层的值。

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

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

当数组input时,这将返回A1 + A2,但只有在正常input时才返回A1。 但是,在此公式中将ROW(1:2)更改为{1; 2}时,正常input时将返回正确的结果。 无论数组是否input,相同的SUMPRODUCT公式返回A1 + A2。

这可能与如何在函数中注册参数有关。 根据http://msdn.microsoft.com/en-us/library/bb687900.aspx基本上有两种方法来注册函数参数来处理Excel数据types:

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

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

SUM参数似乎符合R / Utypes,而SUMPRODUCT参数的行为类似于P / Q。 input上述SUM公式的数组会强制ROW中的范围引用参数作为数组进行求值,而这会随SUMPRODUCT自动发生。

更新

经过多一点调查,这里有更多的证据支持这个理论。 基于注释中的链接,公式= SUM((A1,A2))给出与以下相同的值:

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

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

由于ROW()返回一个数组,所以使用INDEX来获取第一个元素。

然后你的例子变成: =SUMPRODUCT(INDIRECT("A"&INDEX(ROW(),1)))

我不认为ROW()在这里的行为不同,它在两种情况下都返回一个数组。 我假设SUM和SUMPRODUCT以不同的方式处理这个数组 – 不知道为什么。

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

我只是使用INDEX来代替INDIRECT(这也可以通过避免volatile函数来使你受益),也就是说,

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

….扩展到你的范围这个公式将计数在A列范围内的值> 1的数量,其中x定义了开始行,y结束行

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

x和y可以通过公式计算

如果要添加更多条件,则可以使用SUMPRODUCT或COUNTIFS