3

我需要从一列数字创建一个正在运行的产品(我可以使用一行,但在这里更容易演示一列。)输入可能是任意数组。事实上,在我要部署它的应用程序中,它不是一个范围,而是 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,stagr,-1), ), 1),
       almost, INDEX(m,v,h) * INDEX(m,v,h+1) * INDEX(m,v,h+2) * INDEX(m,v,h+3) * INDEX(m,v,h+4),
       result, INDEX( almost, , 1 ),
       result )

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

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

斯塔格

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

m 有错误

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

乘法矩阵

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

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

almost, INDEX(m,v,h) * INDEX(m,v,h+1) * INDEX(m,v,h+2) * INDEX(m,v,h+3) * INDEX(m,v,h+4)

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

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

为了清楚起见,结果必须是一个动态数组,该数组在没有辅助单元格或 CSE 下拉的情况下溢出。

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

4

2 回答 2

2

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

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

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

在此处输入图像描述

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

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

在此处输入图像描述

于 2021-07-30T18:56:52.353 回答
2

虽然不是每个人(还)都可以使用,但我们可以使用SCAN()

在此处输入图像描述

中的公式A1

=SCAN(1,{10,8,3,4,5},LAMBDA(a,b,a*b))
  • 第一个参数是我们的起始值,这意味着嵌套中的第一个计算LAMBDA()是'1 * 10'。
  • 第二个参数可以采用一维和二维数组(写入或范围引用)。
  • 第三个参数是嵌套LAMBDA()的,我们的递归函数的结果将用于第二次计算;'10 * 8'。第三个……等等。等等
  • 在上面的示例中,垂直数组被溢出,但是当使用水平输入时,这显然会导致水平溢出输出。当使用 2D 数组时,这将导致 2D 数组溢出。
于 2021-10-01T09:59:01.080 回答