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
我有一个作品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