【问题标题】:ArrayFormula that refers to the previous row? (Circular dependency error)ArrayFormula 指的是前一行? (循环依赖错误)
【发布时间】:2017-05-10 18:06:23
【问题描述】:

我遇到了一个看起来很常见的要求:包含先前行的数组公式计算。问题似乎是数组公式中的所有单元格都被一次评估,因此它认为存在循环依赖,并给出了错误。

我已经模拟了一个toy example on Google Spreadsheet,您应该能够看到并发表评论。 (我已禁止编辑访问以防止故意破坏。)

看起来像这样,其中所有内容都在行 2 中,项目符号 1、2、3、4 分别指的是 ABCD 列:

  1. “更改” - 手动输入为空白
  2. '例如。兴趣' - =ARRAYFORMULA(IF(ROW(B2:B)>2, OFFSET(D2:D, -1, 0) + A2:A,))
  3. “利率” - 手动输入为空白
  4. '平衡' - =ARRAYFORMULA(IF(ROW(D2:D)=2, 0, B2:B*(1+C2:C)))

我们的想法是让利率复合(可能有可变利率)和每行加/减资本变化的选项,但是,单元格 B2D2(点 2、4)错误 @ 987654331@,并在悬停时报告“循环依赖”。

我已经尝试了所有我能想到的:OFFSETINDIRECTD1:D(而不是2),甚至是一个辅助列,除了参考D(这只是导致了一个三列循环依赖)。

我怎样才能拥有'ex。兴趣”列引用数组公式中上一行的“余额”列而不会导致此错误?

类似的问题用SUMIF 在行上解决这个问题,条件是行小于数组公式中的“当前”行。 我看不出这在我的情况下可行,因为我需要将整个运行总和乘以每一步的利息。我尝试SUMIF(... "="&DATE(...) ...) 引用前一行;这可以在帮助列中打印抵消余额,但尝试使用它(通过下面的迭代计算)就像它是零一样。

在@JackBrown 的建议下,我启用了消除循环依赖错误的迭代计算,但是它仍然不起作用 - 第二个填充的行从上一行获得了 0 的值,尽管前一行有一个非-零值。好像它在早期迭代中获取了值,并且没有在更改时更新。

【问题讨论】:

  • 投反对票的原因?
  • 你试过了吗?文件>电子表格设置>计算>迭代计算=打开。希望有帮助!
  • @JackBrown 实际上,我说得太早了——这解决了循环依赖问题,但它似乎将0 作为前一行余额的值,即在它得到它的值之前,并没有'不更新。
  • 我不完全确定您要计算什么?您可以创建具有预期值的新列吗?
  • @JackBrown '前。利息”应该是之前的“余额”+“零钱”。我添加了一列,通过下拉的“标准”公式显示预期值。

标签: excel google-sheets array-formulas


【解决方案1】:

Excel

在excel中制作智能表并使用公式:

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

请在此处下载示例文件: https://drive.google.com/file/d/0B79ClRnKS87QTTR5VDBld0plajg/view?usp=sharing


谷歌表格

为了尝试解决您的问题,我进行了一项研究。 简短的回答:我不能这样做,我相信这是不可能的。

背景

我将案例简化为通过不断变化的汇率寻找未来汇率值的任务:

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 - 1 变量:

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

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


临时工 但这对于递归函数或脚本来说是非常简单的任务,因为它们可以记住最后找到的值。所以我建议编写脚本并将其用作自定义数组公式:

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. Sample file 脚本正常工作
  2. Guide on custom functions

【讨论】:

  • 谢谢你,我确实考虑过一个脚本,但是当它要我启动一个单独的网络应用程序并将脚本另存为其他文件时停止了,这并不容易确定如何使用它,等等。我将暂时开放赏金,以防有人突然出现反驳你认为这是不可能的:) - ArrayFormula 将是理想的,但否则我将使用脚本或切换脱颖而出。谢谢:)
  • 我已经用脚本添加了文件的链接。
  • 此公式返回的结果不准确,请参见 C3 中的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2012-04-24
  • 1970-01-01
  • 2015-07-24
  • 2019-02-21
  • 2021-10-12
相关资源
最近更新 更多