Excel 公式,计算动态数组各列值的乘积

Excel formula, calculate product of values in each column of dynamic array

我正在为一个 table 中的“结果”列编写一个公式,该公式根据主列中的某些条件在另一个 table 中查找数据,然后显示它。在我被难住的地方,它是 returning 一个动态二维数组(行 return 是可变的,取决于 FILTER/MATCH 查找)。示例(4 列 x 3 行)return 值:{1,2,3,4;1,2,3,4;1,2,3,4}

我想得到每一列中值的乘积,这样使用上面示例 return 值的公式的输出将是这样的:{1,8,27,64}

(相当于这样做:{1,2,3,4} * {1,2,3,4} * {1,2,3,4}

如何仅使用公式函数来完成此操作?

我的所有 google 搜索都返回了假设静态 table 大小的方法,将列相互相乘,and/or table“现有" 在 sheet 某处(但仍然没有给出我正在寻找的结果)。


我已经通过 VBA 解决了这个问题,但由于我使用 sheet 的方式的性质,等待通过 [= 更新到 运行 75=] 太慢了。这并不是说它需要永远——大约 60 行只需要 3-4 秒——而是我对查找 table 进行了更改,等待主 [=66= 中结果列的更新],检查结果,进行另一次更改,冲洗并重复 50 次奇数次,同时我微调事物以使其看起来像我想要的那样,并且延迟对我造成了影响。

我也不确定我是否可以使用助手 rows/columns,因为结果需要打包得太近,只会显示 #SPILL,这导致引用它的公式只显示同一件事情。所以看起来这需要自包含。

插件绝对没有。


(其他小编辑:糟糕,我把 INDEX/MATCH 放在上面,而我的意思是 FILTER/MATCH。)

编辑: 希望这有助于澄清?

这是我的主要 table 的结构,其中包含此公式:

My Formula 从 ColA 和 ColB 中获取单词并使用 FILTER/MATCH 进行查找 1) returns 多个结果,2) return 结果是整行,3) 是完全匹配(对于 ColA 和 ColB 中不存在于查找 table 中的单词,它 return 没有意义)。

这意味着,就公式的当前状态而言,我正在为主 table 中的大部分行取回二维数组。 AFAICT,我无法将它们粘贴到某个帮助列中,因为它们会重叠并导致 #SPILL 然后不会在任何公式中评估然后引用它们。

我需要将它们转换为 1 行 x 与源相同的列的一维数组,其中每列中的结果仅是该列内容的乘积。然后,我将继续使用更多公式从这个公式构建,以实现我的最终结果,该结果将很好地适合单个单元格。 (我已经解决了那个问题。它只是从 2D -> 1D 产品数组开始,我需要帮助。)

所以:

根据评论进行编辑: 如果 sumproduct 的顺序错误,那么备选方案很简单:

=SUMPRODUCT(D10:F10,D11:F11,D12:F12,D13:F13)


=sumproduct(A1:A4,B1:B4,C1:C4)

然后 A1:A4(和其他数组)可以是检索数据的匹配索引。

或者在其他单元格中有索引和匹配项,并在和积中使用这些结果。

有戏了,补了点资料:

在单元格 D88 中:

=INDEX($B:$H,MATCH($C10,$A:$A,0),MATCH(D,$B:$H,0))

在单元格 D15 中:

=SUMPRODUCT(D10:D13,E10:E13,F10:F13)

在单元格 D9:F9 中进行数据验证以选择列标题 A:G。

=LET(z,MyArray,a,INDEX(z,,1),b,INDEX(z,,2),c,INDEX(z,,3),d,INDEX(z,,4),CHOOSE({1,2,3,4},PRODUCT(a),PRODUCT(b),PRODUCT(c),PRODUCT(d)))

其中 MyArray 是 returns 您的二维数组的构造,例如

{1,2,3,4;1,2,3,4;1,2,3,4}

上面假设MyArray returns一个包含4列的数组。对于超出该数字的每一列,LET 函数中将需要一个额外的 namecalculation 参数。此外,应调整传递给 CHOOSE 的数组,使其包含从 1 到 MyArray.

返回的列数的整数数组

例如,如果 MyArray 返回:

{1,2,3,4,5;1,2,3,4,5;1,2,3,4,5}

所需的结构是:

=LET(z,MyArray,a,INDEX(z,,1),b,INDEX(z,,2),c,INDEX(z,,3),d,INDEX(z,,4),e,INDEX(z,,5),CHOOSE({1,2,3,4,5},PRODUCT(a),PRODUCT(b),PRODUCT(c),PRODUCT(d),PRODUCT(e)))

Edit:更好的方法是用 SEQUENCE 构造替换传递给 CHOOSE 的静态数组:

=LET(z,MyArray,a,INDEX(z,,1),b,INDEX(z,,2),c,INDEX(z,,3),d,INDEX(z,,4),e,INDEX(z,,5),CHOOSE(SEQUENCE(,COLUMNS(z)),PRODUCT(a),PRODUCT(b),PRODUCT(c),PRODUCT(d),PRODUCT(e)))