Google Spreadsheet总和,总是在上面的单元格上结束

时间:2013-09-23 15:19:02

标签: google-sheets

如何创建一个总是在上面的单元格上结束的Google Spreadsheet sum(),即使添加了新单元格也是如此?我在每个列上都有几个这样的计算,因此solutions like this无济于事。

示例:

  

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

在excel上,我有offset function就像魅力一样。但是如何使用谷歌电子表格呢?我试着使用这样的公式:

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

但是在Google Spreadsheet上,它给出的只是一个#name错误。

我浪费了几个小时试图寻找解决方案,也许有人可以打个招呼? 请指教

暗嫩

9 个答案:

答案 0 :(得分:51)

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

=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,1中的INDEX(...,1,1)

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

请注意:

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

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

  3. 因此,您可以灵活地为每个公式定义起始单元格,这不受计算表更改的影响。

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

    注意:您可能需要replace commas by semicolons

答案 1 :(得分:4)

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

它有点代数,但我们可以利用Spreadsheets'右下角拖动。

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

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

*你提到过要进行数十次这样的计算。因此,为了满足您的确切需求,我们会减去您的最后总和以获得该结果"中间"我们想要的范围。

e.g。

  

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

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

=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)

答案 2 :(得分:2)

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

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

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

@PsychoFish是正确的,但无法拖动和复制,因为该列是字面和硬编码的,并且@Druvision处于正确的方向但是错误...基本上最终出现了同样的问题,即必须重新输入范围,然后反复滑动公式。

答案 3 :(得分: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)

答案 4 :(得分:1)

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

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

希望您也有帮助。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

你们正在努力做到这一点。我只是在"总和"上面留下几行空行。 row(您可以将它们格式化为填充颜色或其他东西以防止它们被无意中使用),然后只需将这些新行添加到这些特殊行的上方。

答案 7 :(得分: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))

答案 8 :(得分:-1)

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

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

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