需要sumifs()/sum(filter())/sumproduct()的替代方案来提高性能 &g



我有一个包含几列的表单。行数可以达到几万行。有些行是下面行的小计。我有一个自动索引,工作原理如下:

i
i.i
i.i.i
i.i.j
j
j.i
j.j

i是所有I.I.X项的小计,而i.i.i是所有I.I.X项的小计,以此类推。

最低的索引总是项,它们有自己的值。

问题是,随着工作表的填充和行的添加,它变得越来越慢,以至于无法使用。

链接到脱敏表*在excel中打开,有命名公式不能在Google工作表中打开。

消耗处理能力的是小计。到目前为止,我使用了这两种方法:sumifs(), sum(filter()), sumproduct(), sum({array}*{array})来自动计算小计,所有选项的性能都很差。

我意识到使用常规的subtotal()会减少处理消耗,但是,另一方面,当在工作表中间添加新行时,需要进行大量调整来修复需要求和的范围。通常,我的团队在调整范围时犯了一些错误,导致错误的小计,并且在以后很难找到它,消耗了大量的工作时间

数据透视表不是一个选项,组小计也不是,因为我需要遵循原始工作表的结构和格式。

你们有什么更好的办法吗?

你不需要替代函数;你只需要减少冗余计算的数量:查看第7行,单元格O7:R7中的过滤器是所有相同的条件进行过滤(对于每个过滤器重新计算),因此不是4个单独的(但相关的,因为它们都使用相同的标准)过滤器,您可以简单地编写下面的公式

=LET(net,FILTER(O$2:R$465,(LEFT($I$2:$I$465,LEN($I7)+1)=$I7&".")*($J$2:$J$465<>0)*ISNUMBER(VALUE(RIGHT($I$2:$I$465,1))),0),MMULT(SEQUENCE(1,ROWS(net),1,0),net))

(即。对4列范围应用一个单个过滤器,一次,并为每列生成一个总和)

单元格O7

中的,并查看它是否生成相同的总数

类似地(仍然在第7行),单元格X7:GI7中的所有过滤器也使用相同的标准(即相同的标准被计算168次(!)),这样您就可以在

下面写下公式
=LET(net,N(FILTER(X$2:GI$465,(LEFT($I$2:$I$465,LEN($I7)+1)=$I7&".")*($J$2:$J$465<>0),0)),MMULT(SEQUENCE(1,ROWS(net),1,0),net))

(同样,一个单个过滤器,一次,多列范围,计算每列的总和)

单元格X7

中的,并消除X7:GI7

中的冗余计算进行这些更新将导致FILTER()函数的使用减少170次,每个小总计行(以及不再重复的标准计算),因此我预计这将在一定程度上提高性能。

最新更新