Excel - 动态求和公式 [0,1]

Joa*_*ses 5 excel excel-formula

我试图创建一个动态 Excel 公式,当另一行中的值是 1 后跟 0 时,该公式对一行中的值进行求和。如果在最后一个 0 之后有一个 1,则再次求和,直到达到另一个 1。 在此输入图像描述

如图所示,F6 中的第一个值必须是 323(202+47+74),然后出现 1,但下面没有 0,因此该值保持不变(1997)。然后另一个 1 后面跟着两个 0,形成 9 (4+3+2),依此类推。

May*_*rya 5

这是另一种选择,

\n

在此输入图像描述

\n
\n

\xe2\x80\xa2 单元格中使用的公式F2

\n
=LET(\na,B2:B13,\nb,C2:C13,\nc,SCAN(0,a,LAMBDA(x,y,x+y)),\nd,UNIQUE(c),\nIF(a=0,"",INDEX(MMULT(N(TOROW(c)=d),b),XMATCH(c,d))))\n
Run Code Online (Sandbox Code Playgroud)\n
\n

注意:请参阅下面每个变量的作用:

\n

\xe2\x80\xa2 首先,我们采用两个范围即B2:B13&C2:C13并将它们分别定义为a& b

\n
\n

\xe2\x80\xa2 接下来,我们使用SCAN()函数返回一个数组,其初始值会迭代0序列中的每个值,其中使用. 返回值被指定为axyLAMBDA()c

\n

在此输入图像描述

\n
\n
SCAN(0,a,LAMBDA(x,y,x+y))\n
Run Code Online (Sandbox Code Playgroud)\n
\n

\xe2\x80\xa2 现在,我们使用UNIQUE()函数来删除任何重复项c

\n

在此输入图像描述

\n
\n
=LET(\na,B2:B13,\nb,C2:C13,\nc,SCAN(0,a,LAMBDA(x,y,x+y)),\nd,UNIQUE(c),\nd)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

\xe2\x80\xa2 接下来,我们使用MMULT().

\n
\n
N(TOROW(c)=d)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

上面将数组中的每个值c与数组中的每个值进行比较d,并返回一个BOOLEAN相同大小的数组,其中 if it equal then TRUEelse FALSE。然后MMULT()执行矩阵乘法,得到的行数和列数与b将 的每个值BOOLEAN与对应的乘积相加的行数和列数相同b

\n
MMULT(N(TOROW(c)=d),b)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

在此输入图像描述

\n
\n

\xe2\x80\xa2 最后,我们使用 anIF()INDEX()wtihXMATCH()根据需要返回所需的输出。

\n

在此输入图像描述

\n
\n

==> 该XMATCH()函数用于查找c数组中每个值的位置d,该数组用于INDEX()返回上述矩阵乘法的相应值。最后将其包装在IF()函数中,该函数检查数组中是否有任何值a等于0,然后返回空,否则返回使用INDEX()&返回的值XMATCH()

\n
\n

当然,您不必向下填充,因为它会动态溢出。

\n
\n

  • 很好地使用“MMULT”。我个人更喜欢稍小的屏幕截图 - 在这种尺寸下,它们往往会稍微偏离您原本非常好的答案。 (2认同)
  • 仅供参考@MayukhBhattacharya,我做了一些性能测试(检查我的答案),您的解决方案在我测试的三个场景中具有最佳性能。公式中的注释“d”按升序排列,因此您可以使用“search_mode”输入参数优化“XMATCH”中的搜索并将其设置为“2”,这样您就可以得到:“XMATCH(c,d, ,2)`。很好的解决方案! (2认同)

小智 1

您可以使用(隐藏的)额外列轻松完成此操作。将运行总计保留在隐藏列中,并且仅当 [0, 1] 列为 1 时才显示该运行总计。

\n

请注意,在以后的帖子中,我们会将数据提供为我们可以复制的表格,而不是屏幕截图。

\n

匹配数据中隐藏列第 3 行的行(F 是此处的隐藏列):

\n
=IF(B3=1, IF(B4 = 1, C3, D4+C3), IF(B4 = 1, C3, C3+D4))\n
Run Code Online (Sandbox Code Playgroud)\n

将其复制到 F 列下方。

\n

在显示列的第 3 行(此处为 G):

\n
=IF(B3 = 1, F3, "")\n
Run Code Online (Sandbox Code Playgroud)\n

当然,将其复制到 G 列中。

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n
\xc2\xa0ACG
1\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0
2\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0
3\xc2\xa01第202章323
4\xc2\xa0047\xc2\xa0
5\xc2\xa0074\xc2\xa0
6\xc2\xa011997年1997年
7\xc2\xa0149
8\xc2\xa003\xc2\xa0
9\xc2\xa002\xc2\xa0
10\xc2\xa0122
11\xc2\xa0155
12\xc2\xa011981年1981年
13\xc2\xa01311
14\xc2\xa008\xc2\xa0
\n