46

即使添加了新单元格,如何创建始终以上方单元格结尾的 Google 电子表格 sum()?我要对每一列进行几次这样的计算,所以这样的解决方案无济于事。

例子:

在 B 列上,我有几个必须求和的动态范围。B1..B9 应在 B10 上求和,B11..B19 应在 B20 上求和。我有几十个这样的计算要做。时不时地,我在最后一个求和的行下方添加行,我希望它们被添加到总和中。我在第 10 行之前添加了一个新行(称为 9.1),在第 20 行之前添加了一个新的原始行(我们称为 19.1)。我希望 B10 包含 B1 到 B9.1 的总和,B20 包含 B11 的总和: B19.1。

在 excel 上,我有偏移功能,它就像魅力一样。但是如何使用谷歌电子表格来做到这一点?我尝试使用这样的公式:

=SUM(B1:INDIRECT(address(row()-1,column(),false)))   # Formula on B10
=SUM(B11:INDIRECT(address(row()-1,column(),false)))  # Formula on B20

但在谷歌电子表格上,它给出的只是一个#name 错误。

我浪费了几个小时试图找到一个解决方案,也许有人可以停下来?请指教

暗嫩

4

9 回答 9

69

您可能正在寻找如下公式:

=SUM(INDIRECT("B1:"&ADDRESS(ROW()-1,COLUMN(),4)))

Google Spreadsheet INDIRECT 返回对单元格或区域的引用,而-据我回忆-Excel INDIRECT 始终返回对单元格的引用。鉴于 Google 的 INDIRECT 确实在您尝试在 SUM 中使用它作为单元格引用时遇到了一些困难,您想要的是将整个范围提供给 SUM,以便以例如 a1 表示法进行总结:“B1:BX”。

您以与 EXCEL 中相同的方式获得所需的地址(此处注意“4”表示行/列相对,默认情况下 Google INDIRECT 返回绝对地址):

ADDRESS(ROW()-1,COLUMN(),4)

而不是使用它通过与起始单元格连接来为 SUM 函数准备范围字符串。

"B1:"&

并用 INDIRECT 包裹起来,这将返回要汇总的区域。

参考 Druvision 的以下答案(我还不能发表评论,我不想重复答案)

每次插入/删除行以使所有看起来像这样,而不是耗时的公式更正:

=SUM(INDIRECT(ADDRESS(ROW()-9,COLUMN(),4)&":"&ADDRESS(ROW()-1,COLUMN(),4)))

您可以在单独的表格中保留一列用于保存变量(让我们将其命名为“def”),例如 Z,以定义起点,例如在 Z1 中写入“B1”在 Z2 中写入“B11”等,然后将其用作变量使用 INDEX 你的总和:

SUM(INDIRECT(INDEX(def!Z:Z,1,1)&":"&ADDRESS(ROW()-1,COLUMN(),4)))- 从 B1 到计算行的总和,因为在 Z1 我们有“B1”(1,1in INDEX(...,1,1)

SUM(INDIRECT(INDEX(def!Z:Z,2,1)&":"&ADDRESS(ROW()-1,COLUMN(),4)))- 从 B11 到计算行的总和,因为在 Z2 我们有“B11”(2,1in INDEX(...,2,1)

请注意:

  1. 名为“def”的单独工作表-您不希望行插入/删除影响该数据,因此将其保留在一边。对于添加一些验证列表以及公式中需要的其他内容很有用。

  2. “Z:Z”符号 - 整列。你说你有很多这样的公式;)

因此,您保留了为每个公式定义起始单元格的灵活性,这不受计算表更改的影响。

顺便说一句,编写自定义函数/脚本总结单元格上方的所有行不是更容易吗?如果你喜欢 javascript,据我记得,谷歌电子表格现在有很好的脚本编辑器。您可以创建一个名为sumRowsAboveMe()的函数,而不仅仅是在工作表中使用它,就像=sumRowsAboveMe()在工作表单元格中一样。

注意:您可能必须用分号替换逗号

于 2013-09-24T15:59:00.803 回答
5

注意 在测试此答案后,它仅在总和由于循环依赖错误而位于不同列中时才有效。否则,解决方案是有效的。

这有点代数,但我们可以利用电子表格的右下角拖动。

=SUM(X:X) - SUM(X2:X)

其中 X 是您正在使用的列,X2 是您的结束点。向下拖动公式,Sheets 将增加 X2,从而更改结束点。

*你提到你有几十个这样的计算要做。因此,为了满足您的确切需求,我们将减去您的最后一个总和以获得我们想要的“中间”范围。

例如

B1..B9 应在 B10 上求和,B11..B19 应在 B20 上求和

由于前面提到的循环依赖错误,我无法完全解决它并将总和放在同一行,但这可能适用于总和需要存储在不同列中的其他情况。

=SUM(B:B) - SUM(B9:B) //Formula on C10 (Sum of B1..B9)
=SUM(B:B) - SUM(B19:B) - B10 // Formula on C20 (Sum of B11..B19)
于 2015-03-08T09:51:05.357 回答
2

你们让这件事变得比你必须做的更难。我只是在“sum”行上方留下几个空行(您可以将它们格式化为填充颜色或其他东西以防止它们被无意使用),然后只需在这些特殊行上方添加新行。

于 2016-12-06T06:01:13.827 回答
2

这是基于@PsychoFish,这里是解决方案:

=SUM(INDIRECT(SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")&"3:"&ADDRESS(ROW()-1,COLUMN(),4)))

只需将行的“3:”替换为开始总和。

@PsychoFish 是正确的,但不能拖动和复制,因为该列是文字和硬编码的,而 @Druvision 方向正确但错误......基本上最终遇到了同样的问题,即必须重新输入范围然后一遍又一遍地滑动公式。

于 2016-12-01T05:10:02.473 回答
1

一般语法:

=SUM(INDIRECT(cell_reference_as_string1 &":"& cell_reference_as_string2)

例如:

cell_reference_as_string1 = ADDRESS(ROW(),COLUMN(),4)
cell_reference_as_string2 = ADDRESS(ROW()-1,COLUMN(),4)
于 2014-07-21T11:16:50.037 回答
1

我喜欢@abernier 描述通用解决方案的方式。到目前为止,仅使用基于字母的 A1 表示法(A 是第一列,1 是第一行)。它一直让我感到困惑,尤其是在考虑另一列留下的列数时。我更喜欢基于数字的 R1C1 表示法。要对INDIRECT使用 R1C1 表示法,您需要像这样传递 FALSE:

=SUM(INDIRECT("R1C"&COLUMN()&":R"&(ROW()-1)&"C"&COLUMN(), FALSE))

我希望你也觉得这很有帮助。

于 2018-07-04T00:17:09.180 回答
1

同意user7255446所说的每个人都过于复杂。在总和行之前保留一行空白。然后每当您想插入新行时,单击空白行并使用“在上方插入行”而不是“在下方插入行”。您的总和公式将自动调整。示例:我想从 B1 求和到 B19。我将第 20 行留空。在单元格 B21 中,输入 =SUM(B1:B20)。然后,如果您需要插入新行,请单击第 20 行并选择“在上方插入行”。总和公式会自动更改为 =SUM(B1:B21)。当然,您的总和单元格现在是 B22。

于 2021-03-08T03:52:51.353 回答
0

为此目的可以使用/滥用 OFFSET()。给它范围左上角的绝对地址,行/列偏移量为 0 和 0,范围的高度/宽度。让 OFFSET() 成为 SUM()、SUMIF() 等的参数。

在计算所需的高度/宽度时,ROW() 和 COLUMN() 很方便。请务必记住减去一个以排除当前行/列,否则您可能会以循环引用结束。如果您有标题行/列,也请减去它们。

例如,要总结从 A2 开始的所有内容,不包括当前行,请尝试:

=SUM(OFFSET($A$2,0,0,ROW()-2,1))

要将当前单元格左侧的所有内容求和,无论它在哪里,请尝试:

=SUM(OFFSET(INDIRECT("RC1",FALSE),0,0,1,COLUMN()-1))

现在让我们把事情颠倒过来,以表明这在另一个方向上是有效的。假设您要对 B 列求和,从当前行下方开始,直到(包括)第 10 行。尝试这个:

=SUM(OFFSET($B$10,ROW()-9,0,10-ROW(),1))

您可以避免负偏移,同时仍对 B 列求和:

=SUM(OFFSET(INDIRECT("RC2",FALSE),1,0,10-ROW(),1))

删除“2”以代替对当前列求和:

=SUM(OFFSET(INDIRECT("RC",FALSE),1,0,10-ROW(),1))

(感谢上面评论的 Tom Sharpe。) INDEX() 可以在范围表达式中使用。你可能更喜欢这个而不是 OFFSET(),所以我把它放在这里。以下总结了从 G1 到当前行上方的所有内容:

=SUM(G1:INDEX(G:G,ROW()-1))
于 2021-08-04T17:32:42.063 回答
-1

@PsychoFish 的回答以正确的方式引导我。唯一的问题是我必须从每一列和每个总和再次重写公式。所以这里是改进的公式,它将同一列上的前 9 个单元格相加,而不对列号或行号进行硬编码:

=SUM(INDIRECT(ADDRESS(ROW()-9,COLUMN(),4)&":"&ADDRESS(ROW()-1,COLUMN(),4)))

唯一的问题是,如果有人添加或删除一行,我必须重写公式。在这种情况下,我应该相应地将 9 更改为 10 或 8。

于 2013-09-25T07:58:28.557 回答