ROW()函数在SUM()和SUMPRODUCT()
问题定义:
在单元格A1
input任何数字。 现在在第一行的任何地方尝试下面的公式。
=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