Excel 数组公式中的整列引用太慢,不遵守 UsedRange?

Excel whole column reference in array formula too slow, not respecting UsedRange?

我有一个作品sheet,其中有许多数组公式引用了另一个有几行的小源数据sheet。公式如下:

{=INDEX(Source!$F:$F,MATCH(1, (Source!$A:$A=$B6)*(Source!$B:$B=H),0))}

计算运行非常缓慢。当我用 1000 个单元格的范围替换整个列引用时,工作簿计算速度显着加快。

{=INDEX(Source!$F:$F00,MATCH(1, (Source!$A:$A00=$B6)*(Source!$B:$B00=H),0))}

我检查了 Source sheet 上的 UsedRange,它没问题,只有几行(使用 ctrl+end)。 使用整个列引用是很正常的做法,但它在这里并不能很好地工作,因为它不尊重 UsedRange。

找到一篇关于此主题的文章: https://fastexcel.wordpress.com/2015/12/12/excel-full-column-references-and-used-range-good-idea-or-bad-idea/

表示:

But avoid array formula and SUMPRODUCT usage of whole column reference

但是为什么呢?我无法理解为什么 Excel 不能将数组公式的计算算法限制在使用的范围内?还有其他解决方法吗?

不确定您是否通过 VBA 构建它,但如果它只是您使用的公式,您可以尝试类似的方法:

=INDEX(Source!$F:$F00,MATCH(1,INDEX((Source!$A:INDEX(Source!$A:$A,COUNTA(Source!$A:$A))=$B6)*(Source!$B:INDEX(Source!$B:$B,COUNTA(Source!$B:$B))=H),),0))

看起来很长,但它基本上是一种将列引用限制为最后使用的行的动态方式。顺便说一句,@Chris 在评论中提出的另一个重要提示是使用实际的 table 来代替,这应该会加快速度。

顺便说一句,您不必再通过 CtrlShiftEnter 输入此内容由于第二个 INDEX