引用前一行的ArrayFormula? (循环依赖错误)

我遇到了一个似乎是相当普遍的要求的麻烦:一个数组公式计算,结合了先前的行。 问题似乎是数组公式中的所有单元格都是一次性计算的,所以它认为存在循环依赖关系,并给出了该错误。

我在Google Spreadsheet上模拟了一个玩具示例 ,您应该可以看到并发表评论。 (我禁止编辑访问以防止破坏行为。)

看起来像这样,一切都在第2行,子弹1,2,3,4分别指向ABCD列:

  1. “更改” – 手动input空白
  2. “防爆。 =ARRAYFORMULA(IF(ROW(B2:B)>2, OFFSET(D2:D, -1, 0) + A2:A,))
  3. “利率” – 手动input的空白
  4. =ARRAYFORMULA(IF(ROW(D2:D)=2, 0, B2:B*(1+C2:C)))

这个想法是在每一行都有兴趣复合(有可能变化的利率)和一个正/负资本变化的选项,但是,单元格B2D2 (点2,4)错误#REF ,并且在hover报告一个“循环依赖”。

我尝试了一切我能想到的: OFFSETINDIRECTD1:D (而不是2 ),甚至一个帮助列什么都不做,只能引用D的前一行(而不是引发三列循环依赖) 。

我怎么能有'前。 兴趣“列引用数组公式中的”平衡“列,而不会导致此错误?

类似的问题可以通过在行上使用SUMIF来解决,而行的条件是小于数组公式中的“当前”行。 我看不出这对我来说可行,因为我需要把整个运行总和乘以每一步的兴趣。 我试过SUMIF(... "="&DATE(...) ...)来引用前面的单行; 这个工作在一个帮助列来打印偏移量的平衡,但试图使用它(与下面的迭代计算)只是performance为零。

在@ JackBrown的build议,我启用迭代计算,摆脱循环依赖错误,但它仍然不起作用 – 第二个填充的行从前一行获得值0 ,尽pipe前一行有一个非零值。 就好像它在早期的迭代中所取得的价值,并没有更新变化。

高强

在excel中做智能表和使用公式:

=If(row()=2,A2*(1+B2),(A1+C1)*(1+B2))

请在此下载示例文件: https : //drive.google.com/file/d/0B79ClRnKS87QTTR5VDBld0plajg/view?usp=sharing 在这里输入图像描述


Google表格

我已经做了一个研究,以尝试解决你的问题。 简短的回答:我不能这样做,我相信这是不可能的。

背景

我简化了这个案例,以便随着利率的变化find未来的利率值:

 Rate+ Recursive formula for rate 1.00% 101.0000% =(1+A2) 1.50% 102.5150% =B2*(1+A3) 1.10% 103.6427% =B3*(1+A4) 1.10% 104.7827% =B4*(1+A5) 

然后我手工制作了一个数组,得到相同的结果,得到这个:

 ={1+A2; 1+A2+(1+A2)*A3; 1+A2+(1+A2)*A3+(1+A2+(1+A2)*A3)*A4; 1+A2+(1+A2)*A3+(1+A2+(1+A2)*A3)*A4+(1+A2+(1+A2)*A3+(1+A2+(1+A2)*A3)*A4)*A5} 

如你所见,争论的数量增长非常快:

 1 = 2 ^1 - 1 1+B2 3 = 2 ^2 - 1 1+B2+(1+B2)*B3 7 = 2 ^3 - 1 1+B2+(1+B2)*B3+(1+B2+(1+B2)*B3)*B4 15 = 2 ^4 - 1 1+B2+(1+B2)*B3+(1+B2+(1+B2)*B3)*B4 + ... 

为了计算最后一行的结果,我们需要2^n - 1variables:

  • 对于第32行,这个数字是4 294 967 295!

这就是为什么即使启用Iterative calculation= On arrayformula也无法处理计算的原因


Workaroud但是这对于recursion函数或脚本来说是非常简单的任务,因为它们可以记住上次find的值。 所以我build议编写脚本并将其作为自定义的数组forms使用:

 function futureValue(values, rates) { var result = []; var resultCurrent = 0; for (var i = 0, len = values.length; i < len; i++) { resultCurrent = (+values[i] + resultCurrent) * (1 + +rates[i]); result.push(resultCurrent); } return result; } 

链接:

  1. 示例文件与脚本工作
  2. 自定义function指南