问题定义:
在单元格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,我会很感激。
答案 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