对列求和直到第一个空单元格

Sum column until first empty cell

我有以下 table:

A1 - 25

A2 - 26

A3 - 27

A4 - 空白

A5 - 30

A6 - 23

A7 - 空白

A8 - 24

在 B1 中,我想要以下内容 - 从 A1 开始,对条目求和,直到遇到第一个空白单元格。在这种情况下,它将是 25+26+27 = 78.

我已经看了几个小时的多个答案并尝试调整它们,但没有任何效果。感谢任何帮助(还有很多事情没有意义,函数 isblank(a1:a10) 将 return true 或 false,那么 arrayformula(isblank(a1:a10)) 如何突然将其转换为数组,因为 isblank 只是 returning 一个布尔值?)

这里有几个方法和一个显示它们的电子表格。

https://docs.google.com/spreadsheets/d/1rkLarQC6NQ4HdGa38X3-rPoAW0A2-USvImFimlelhZM/edit#gid=0

方法一:用MATCH找到第一个空行的行,然后用INDIRECT构造一个引用传给SUM:

=sum(indirect("a1:a" & match("~~", arrayformula("~" & A1:A10 & "~"), 0) - 1))

重新格式化:

=sum(
  indirect(
    "a1:a" & 
    match(
      "~~", 
      arrayformula("~" & A1:A10 & "~"), 
      0
    ) - 1
  )
)

这里唯一棘手的事情是 MATCH return 是错误的,如果你只是传递它 "" 来查找,所以我使用 ARRAYFORMULA 将 A1:A10 范围包装在分隔符中(~在这种情况下,但这是任意的)然后在数组中查找 ~~ 。 return 是第 4 行,所以我使用间接构造对 A1:A3 的引用并将其传递给 sum.


与ztiaa的方法类似,但稍逊一筹。他直接过滤 ROW() 结果,并使用 A:A 作为过滤器参数。两者都优于我使用 ISBLANK 等传递给 FILTER

二、同样的思路(找到第一个空行的编号,构造一个引用传递给INDIRECT):

=sum(indirect("a1:a" & filter(ARRAYFORMULA(isblank(A2:A11)*row(A2:A11)), ARRAYFORMULA(isblank(A2:A11)*row(A2:A11))<>0)-1))

重新格式化以便于阅读:

=sum(
  indirect(
    "a1:a" & 
    filter(
      ARRAYFORMULA(isblank(A1:A10)*row(A1:A10)), 
      ARRAYFORMULA(isblank(A1:A10)*row(A1:A10))<>0
    ) - 1, 
  )
)

所以我使用 ISBLANK(A1:A10) 得到一个布尔数组,指示哪些行为空,然后将其乘以 ROW(A1:A10),这将 return 一个包含所有行号的数组范围,都在 ARRAYFORMULA.

ARRAYFORMULA(isblank(A1:A10)*row(A1:A10))

在乘法中使用布尔值将它们转换为零,因此这将生成一个 0(对于 non-blank 行)或行号(对于任何空白行)的数组。然后我采用相同的公式并在其上使用 FILTER 以删除所有零

      filter(
        ARRAYFORMULA(isblank(A1:A10)*row(A1:A10)), 
        ARRAYFORMULA(isblank(A1:A10)*row(A1:A10))<>0
      )

留下一个包含每个空白行的行号的数组。由于它们是有序的并且 Sheets 缺少动态数组处理,因此 return 值将只是第一个值而不是数组,因此我们可以将其传递给 INDIRECT 以使用该行号生成对范围的引用 - 1(因为我希望范围 运行 从 A1 到第一个空白行之前的行):

  indirect(
    "a1:a" & 
    filter(
      ARRAYFORMULA(isblank(A1:A10)*row(A1:A10)), 
      ARRAYFORMULA(isblank(A1:A10)*row(A1:A10))<>0
    )-1
  )

然后作为最后一步,将整个内容包装在 SUM 中,以对您刚刚使用 INDIRECT 创建引用的范围内的值求和。

=sum(
  indirect(
    "a1:a" & 
    filter(
      ARRAYFORMULA(isblank(A1:A10)*row(A1:A10)), 
      ARRAYFORMULA(isblank(A1:A10)*row(A1:A10))<>0
    )-1
  )
)

[![在此处输入图片描述][1]][1]

让我知道这是否适合您。我想有更好的方法来做到这一点。我会继续考虑的。

还有另一种方法:

=sum(indirect("A1:A"&filter(row(A:A),A:A="")))

选择很少

=SUM(QUERY(A:A,"select A limit " & MIN(FILTER(ROW(A:A),A:A=""))-1))

具有INDEX()功能

=SUM(INDEX(A:A,1):INDEX(A:A,min(filter(row(A:A),A:A=""))-1))

尝试:

=FLATTEN(INDEX(QUERY(; "select "&SUBSTITUTE(JOIN("+"; 
 IF(INDIRECT("A1:A"&MAX(ROW(A1:A)*(A1:A<>"")))=""; 
 ","; A1:A)); "+,+"; ",")); 2))