问题描述
我需要从一列数字创建一个正在运行的产品(我可以使用一行,但在这里更容易演示一列。)输入可以是任何任意数组。事实上,在我将部署它的应用程序中,它不是一个范围,而是一个 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中。
下一步是创建一些用于处理这些数字的索引:v 是 a 和 中每个数字的垂直行序列h 是相同的序列,但被转置为列。 stagr 是由 v 和 h 创建的索引矩阵,稍后将用于处理 a 中的每个项目> 将其组成一个乘法矩阵。如果将最后一个 result 替换为 stagr,您可以看到 stagr 的形状。它只是将一列向下移动一行,直到它们一直向下移动。
现在我们通过简单地使用 INDEX 使用 stagr 创建乘法矩阵 m,如下所示:INDEX(a,stagr)
。但这并不是所需要的,因为它采用第一行值 (10) 并复制它,因为 0 的 INDEX 被视为与 1 相同。为了得到我们想要的,我通过使用内部 IF 语句强制错误,例如this: INDEX( a,-1) )
用 -1 替换 0 结果。即它会产生这个:
现在,使用 IFERROR 将错误替换为 1,这样就解释了 m 的创建方式及其原因。结果是这样的矩阵:
并且通过逐行乘以 m,我们得到了我们想要的输出,但是这是我失败的地方。
为了说明,我创建了一个变量几乎,它显示了我如何尝试进行行乘法。
almost,h+4)
你可以看到我粗略地将一列乘以下一列和下一列......并使用 h + offset 来达到目标。这会生成几乎矩阵,结果只提供该矩阵的第一列,其中包含答案。
虽然答案可能是动态调整大小的几乎的一个很好的替代品,但这不是我真正的问题。我想要一个正在运行的产品,我怀疑有一种完全不同的方法,而不是简单地替换我的几乎。
为了清楚起见,结果必须是一个动态数组,没有辅助单元或 CSE 下拉。
哦...没有VBA。 (@stackoverflow - 请添加一个非 VBA 标签)