Excel动态数组公式创建列的运行产品

问题描述

我需要从一列数字创建一个正在运行的产品(我可以使用一行,但在这里更容易演示一列。)输入可以是任何任意数组。事实上,在我将部署它的应用程序中,它不是一个范围,而是一个 LAMBDA 公式中的另一个动态数组。以下是数字输入列和公式中所需输出的示例:

输入 预期的动态数组输出
10 10
8 80
3 240
4 960
5 4800

公式会溢出结果。

有很多用于运行总计的解决方案,但我没有找到用于运行产品的解决方案。我尝试了几种不同的方法包括 SUBTOTAL 和 AGGREGATE,但都没有成功。我还构建了许多获得结果的方法,但被硬编码为固定数量的行。我需要公式来适应任何任意大小的行数。以下公式是我目前得到的最接近的公式。

这个 LET 公式提供了结果,但是,如您所见,固定为 5 行:

=LET( a,{10;8;3;4;5},v,SEQUENCE( ROWS(a) ),h,TRANSPOSE( v ),stagr,(v - h + 1) * (v >= h),m,IFERROR(INDEX( a,IF(stagr>0,-1),),1),almost,INDEX(m,h) * INDEX(m,h+1) * INDEX(m,h+2) * INDEX(m,h+3) * INDEX(m,h+4),result,INDEX( almost,1 ),result )

输入的任意数字数组放在变量a中。

下一步是创建一些用于处理这些数字的索引:va 中每个数字的垂直行序列h 是相同的序列,但被转置为列。 stagr 是由 vh 创建的索引矩阵,稍后将用于处理 a 中的每个项目> 将其组成一个乘法矩阵。如果将最后一个 result 替换为 stagr,您可以看到 stagr 的形状。它只是将一列向下移动一行,直到它们一直向下移动。

stagr

现在我们通过简单地使用 INDEX 使用 stagr 创建乘法矩阵 m,如下所示:INDEX(a,stagr)。但这并不是所需要的,因为它采用第一行值 (10) 并复制它,因为 0 的 INDEX 被视为与 1 相同。为了得到我们想要的,我通过使用内部 IF 语句强制错误,例如this: INDEX( a,-1) ) 用 -1 替换 0 结果。即它会产生这个:

m with errors

现在,使用 IFERROR 将错误替换为 1,这样就解释了 m 的创建方式及其原因。结果是这样的矩阵:

multiplication matrix

并且通过逐行乘以 m,我们得到了我们想要的输出,但是这是我失败的地方

为了说明,我创建了一个变量几乎,它显示了我如何尝试进行行乘法。

almost,h+4)

你可以看到我粗略地将一列乘以下一列和下一列......并使用 h + offset 来达到目标​​。这会生成几乎矩阵,结果只提供该矩阵的第一列,其中包含答案。

虽然答案可能是动态调整大小的几乎一个很好的替代品,但这不是我真正的问题。我想要一个正在运行的产品,我怀疑有一种完全不同的方法,而不是简单地替换我的几乎

为了清楚起见,结果必须是一个动态数组,没有辅助单元或 CSE 下拉。

哦...没有VBA。 (@stackoverflow - 请添加一个非 VBA 标签

解决方法

我能找到的唯一方法是将 DPRODUCT 与 OFFSET 一起使用,但这需要标题行。标题行中的内容无关紧要(甚至可以为空),只要包含它即可。

=DPRODUCT(OFFSET(A1,SEQUENCE(COUNT(A:A),2)),1,$ZZ1:$ZZ2)

$ZZ1:$ZZ2 可以是任何空单元格引用。

enter image description here

如果 A 中的值是动态的,那么我们可以这样做:

=DPRODUCT(OFFSET(A1,SEQUENCE(ROWS(A2#),$ZZ:$ZZ)

enter image description here