从dynamic列select中删除INDIRECT

发帖之前我已经仔细研究过了,但还是无法弄清楚。

我目前有一个使用INDIRECT逻辑从一个工作表中收集信息到摘要工作表的文件。 该文件完美地工作。 但是我现在正在努力使它更有效率,因为如此巨大的波动,计算时间非常庞大。

在数据工作表中,我有很多列,每个列都有一个概念和分配给它的帐号。 所以,例如:

  5014255 5324232 5566544 Name Store Salary Taxes Other Benefit P1 Weight P2 Weight John Main 222222 50000 30000 0.4 0.6 Jane Annex 222224 50002 30004 0.3 0.7 

然后在摘要页面中,我使用SUMPRODUCT来收集每个帐户的每个商店的信息并按期间分隔,如下所示:

 Store Account Concept P1 P2 Main 5014255 Salary 88888.8 133333.2 Main 5324232 Taxes 20000.0 30000.0 Main 5566544 Other Benefit 12000.0 18000.0 Annex 5014255 Salary 66667.2 155556.8 Annex 5324232 Taxes 15000.6 35001.4 Annex 5566544 Other Benefit 9001.2 21002.8 

这当然只是一个基本的例子。 真正的文件有几个更多的validation和权重的几个类别用于不同的帐户。 为了提取信息,我有以下公式。

  =IFNA(SUMPRODUCT( INDIRECT(INDEX("'Sheet1'!"&ADDRESS(6,COLUMN($A$5)+MATCH($N5,Sheet1!$1:$1,0)-1,4)&":"&SUBSTITUTE(ADDRESS(1,COLUMN($A$5)+MATCH($N5,Sheet1!$1:$1,0)-1,4),"1","")&$AU$1,1,1)), --(Sheet1!$C$6:$C$1754=2018), --(Sheet1!$J$6:$J$1754=$I5), IF($G5=1,Sheet1!$BN$6:$BN$1754,IF($F5=1,Sheet1!$BA$6:$BA$1754,Sheet1!$AN$6:$AN$1754)) ),0) 

重要的一段代码是:

 INDIRECT(INDEX("'Sheet1'!"&ADDRESS(6,COLUMN($A$5)+MATCH($N5,Sheet1!$1:$1,0)-1,4)&":"&SUBSTITUTE(ADDRESS(1,COLUMN($A$5)+MATCH($N5,Sheet1!$1:$1,0)-1,4),"1","")&$AU$1,1,1)) 

这使用string操作来根据帐号生成列范围。 因此,例如,帐号5014255将生成Sheet1!$C$6:$C$1754 ,以便可以根据权重和validation收集该列中的值。

所以,我试图改变逻辑去除挥发物。 但到目前为止,我还没有做到这一点。

我基本上需要我的总结来find帐号所在的列,因此可以使用该列进行sumproduct计算。

任何想法或build议如何解决这个问题?

要获得完整的色谱柱而不使用挥发性物质:

 INDEX(Sheet1!$C$6:$E$1754,0,MATCH($N5,Sheet1!$C$1:$E$1,0)) 

这会将正确的列返回到SUMPRODUCT公式

很高兴听到你正在摆脱易失性函数。 有一段时间,我一直在讲他们的罪恶,包括这里: https : //chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/

我build议你再进一步:

  • 沟渠SUMPRODUCT如果可以,并使用SUMIF或SUMIFS来代替。
  • 完全消除公式,取消您的数据,并使用数据透视表来代替。

在以下问题中查看我的答案,以获得提高效率的方法: 优化Excel公式 – SUMPRODUCT与SUMIFS / COUNTIFS

如果你想更多的在unfivoting,看到我的答案在这里: 转换交叉表列表进行数据透视表

请注意,INDEX是半易失性的,这意味着它仍然在文件打开和保存时重新计算。