查找从单个连接列(不是单元格区域)达到总和的行
Find Row Where Sum is Reached from Single Joined Column (not a range of cells)
我正在尝试 运行 一个公式来确定在哪一行中达到了总和。
当我有整个范围的单元格可供使用时,我已经能够进行该计算,但是,我正在进行过滤/连接计算,因为我需要从一个单独的行中进行所有数据而不是整个单元格范围。
Here is an example google sheet (EDITABLE - feel free) 您可以在其中查看范围和工作公式(均在下方)。帮助从顶部的单单元版本中获取它会非常有帮助。我在 row() 和 index() 公式中得到的错误是 "argument must be a range".
如果除了我拥有的不需要引用范围(例如使用 FILTER)的单个单元格之外还有其他方法可以做到这一点,那么我愿意接受它。
我想要的结果是能够在达到总和时提取第二列(日期)(可以通过我使用的 INDEX & MATCH 公式或替代方法)。这将告诉我输入所需总和的最早日期。
是的,不幸的是你不能用 SUMIFS 做这个技巧来获得 运行 总数,除非被汇总的列是一个实际范围。
我知道的唯一方法是将连续值乘以三角形数组,如下所示:
1 0 0 ...
1 1 0 ...
1 1 1 ...
所以你只得到第一个值、前 2 个值、然后 3 个值的总和,直到 n。
这是F5中的公式:
=ArrayFormula(match(E14,mmult(IF(ROW(A1:INDEX(A1:ALL1000,COUNT(split(A5,",")),COUNT(split(A5,","))))>=
COLUMN(A1:INDEX(A1:ALL1000,COUNT(split(A5,",")),COUNT(split(A5,",")))),1,0),TRANSPOSE(SPLIT(A5,",")))))
而F6中的公式就是
=to_date(INDEX(TRANSPOSE(SPLIT(B5,",")),F5,1))
编辑
您可能已经猜到上面的公式改编自 Excel,您在其中尽量避免像 Offset 和 Indirect 这样的不稳定函数。
发布此答案后我意识到可以通过两种方式对其进行改进:
(1) 通过使用 Offset 或 Indirect,从而避免需要定义任意大小的范围,如 A1:ALL1000
(2) 通过比较行向量和列向量来暗示二维数组,而不是实际定义二维数组。这会在 F5 中给你这样的东西:
=ArrayFormula(match(E14,mmult(IF(ROW(indirect("A1:"&address(COUNT(split(A5,",")),1)))>=
COLUMN(indirect("A1:"&address(1,COUNT(split(A5,","))))),1,0),TRANSPOSE(SPLIT(A5,",")))))
可以进一步简化为:
=ArrayFormula(match(E14,mmult(IF(ROW(indirect("A1:A"&COUNT(split(A5,","))))>=
COLUMN(indirect("A1:"&address(1,COUNT(split(A5,","))))),1,0),TRANSPOSE(SPLIT(A5,",")))))
我正在尝试 运行 一个公式来确定在哪一行中达到了总和。
当我有整个范围的单元格可供使用时,我已经能够进行该计算,但是,我正在进行过滤/连接计算,因为我需要从一个单独的行中进行所有数据而不是整个单元格范围。
Here is an example google sheet (EDITABLE - feel free) 您可以在其中查看范围和工作公式(均在下方)。帮助从顶部的单单元版本中获取它会非常有帮助。我在 row() 和 index() 公式中得到的错误是 "argument must be a range".
如果除了我拥有的不需要引用范围(例如使用 FILTER)的单个单元格之外还有其他方法可以做到这一点,那么我愿意接受它。
我想要的结果是能够在达到总和时提取第二列(日期)(可以通过我使用的 INDEX & MATCH 公式或替代方法)。这将告诉我输入所需总和的最早日期。
是的,不幸的是你不能用 SUMIFS 做这个技巧来获得 运行 总数,除非被汇总的列是一个实际范围。
我知道的唯一方法是将连续值乘以三角形数组,如下所示:
1 0 0 ...
1 1 0 ...
1 1 1 ...
所以你只得到第一个值、前 2 个值、然后 3 个值的总和,直到 n。
这是F5中的公式:
=ArrayFormula(match(E14,mmult(IF(ROW(A1:INDEX(A1:ALL1000,COUNT(split(A5,",")),COUNT(split(A5,","))))>=
COLUMN(A1:INDEX(A1:ALL1000,COUNT(split(A5,",")),COUNT(split(A5,",")))),1,0),TRANSPOSE(SPLIT(A5,",")))))
而F6中的公式就是
=to_date(INDEX(TRANSPOSE(SPLIT(B5,",")),F5,1))
编辑
您可能已经猜到上面的公式改编自 Excel,您在其中尽量避免像 Offset 和 Indirect 这样的不稳定函数。
发布此答案后我意识到可以通过两种方式对其进行改进:
(1) 通过使用 Offset 或 Indirect,从而避免需要定义任意大小的范围,如 A1:ALL1000
(2) 通过比较行向量和列向量来暗示二维数组,而不是实际定义二维数组。这会在 F5 中给你这样的东西:
=ArrayFormula(match(E14,mmult(IF(ROW(indirect("A1:"&address(COUNT(split(A5,",")),1)))>=
COLUMN(indirect("A1:"&address(1,COUNT(split(A5,","))))),1,0),TRANSPOSE(SPLIT(A5,",")))))
可以进一步简化为:
=ArrayFormula(match(E14,mmult(IF(ROW(indirect("A1:A"&COUNT(split(A5,","))))>=
COLUMN(indirect("A1:"&address(1,COUNT(split(A5,","))))),1,0),TRANSPOSE(SPLIT(A5,",")))))