【问题标题】:Google Spreadsheet sum which always ends on the cell above谷歌电子表格总和,总是在上面的单元格结束
【发布时间】:2013-09-28 13:37:48
【问题描述】:

如何创建一个始终以上方单元格结尾的 Google 电子表格 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 电子表格上,它给出的只是 #name 错误。

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

安农

【问题讨论】:

  • 实际情况如何?为什么这么难!?

标签: google-sheets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        Google 电子表格 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”(INDEX(...,1,1) 中的 1,1

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

        请注意:

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

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

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

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

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

        【讨论】:

        • 如果您将列硬编码为范围的开始,不妨将其硬编码为范围的结束。然后可以简化为=SUM(INDIRECT("B1:B"&ROW()-1))
        • 或者你可以使用 offset =sum(offset(B1,0,0,row()-1))
        • 大概是问题出现后才加了offset函数。但是索引函数似乎也可以工作 =sum(B1:index(B:B,row()-1))
        • 注意:你可能需要replace commas by semicolons !!!
        • @aross 绝对正确。考虑到这个问题可能会导致更多案例,我打算使用索引。对于手头的情况,使用硬编码的范围开始和/或结束,直接连接列名和行索引的方法是绝对足够的。 +1。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

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

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              【解决方案8】:

              一般语法:

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

              【讨论】:

              • 这真的很适合我。非常感谢。
              【解决方案9】:

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

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

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

              【讨论】:

                猜你喜欢
                • 2012-12-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多