Excel性能 – INDEX-MATCH组合

我正在使用Excel来创build稍后在vba应用程序中使用的数据集。 我正在使用这个公式:

=INDEX(BaseData!$L$2:$L$10000;MATCH(DataSet!D5&DataSet!E5&DataSet!K5;INDEX(B‌​aseData!$B$2:$B$10000&BaseData!$C$2:$C$10000&BaseData!$D$2:$D$10000;0);0)) 

通常范围从f.ex: A2 - A10000 ,因为我的数据可能会不同,并且在数据select上经常会有所不同。

不过,这会让我的Excel变慢。 我切换到手动计算,但是,当再次激活时,我的Excel实例需要非常长,经常崩溃。

我也尝试过一些数据,但是当创build一个新的数据集时,我不得不再次拉下公式,有时候通过这个错误发生在我的数据集中。

任何build议,我可以做什么使INDEX-MATCH公式更高性能?

我很感激你的回复!

UPDATE

我想大量的性能会消失,因为索引匹配不会select确切的范围,但也会计算在空行中。 如何自动获得索引匹配的确切范围?

正如我在上面的评论中提到的,只要这是一个“常规”公式,而不是一个数组公式,你可能会发现成功简单地用“A:A”代替“A1:A10000”。 不过除此之外,您可以创build一个单元格,它将计算引用您拥有的数据行数,然后使用该单元格间接引用包含数据的完整列。

计算您所需的范围

对于下面的例子来说,我认为:列A包含一个只有数字forms的索引键; 列A在头部和上面不包括数字; 并且索引行是连续的,没有中断。 从以下公式开始:

  =COUNT(A:A) 

如果我的假设成立,那么这将返回表中数据元素的数量。 一旦我们知道这个数据开始的位置,我们可以使用这个COUNT来确定它的结束位置。 假设你的头在第2行(我喜欢包括头,所以如果你在头下插入一行,Excel会提示你想在你的公式中包括新的一行)。考虑到这一点,创buildExcel风格的引用,它查找列A中包含数据的最后一个单元格:

 =ADDRESS(ROW(A2)+1+COUNT(A:A),COLUMN(A2),1,1) 

假设有50行数据[从第3行开始,在标题下面]以及上述所有其他假设,此公式将返回文本结果“$ A $ 53”。

如果你想做同样的事情,而是返回数据存在的列A的全部范围(从标题到行53),你可以这样做:

 =ADDRESS(ROW(A2),COLUMN(A2),1,1)&":"&ADDRESS(ROW(A2)+1+COUNT(A:A),COLUMN(A2),1,1) 

这将返回文本string结果“$ A $ 2:$ A $ 53”,这是对唯一ID值的完整索引的引用。 如果您插入任何行或列,它将自动移动,正如您通常所期望的那样。 现在假定您的INDEX是要提取相同的数据,而是用于B列。 公式将完全相同,除了我上面的“COLUMN(A2)”,replace为“COLUMN(B2)”。

参考您的计算范围

所以,现在你有适当的,有限的专栏的地址 – 但你怎么实际上参考公式中的这些领域? 通过使用INDIRECTfunction。 INDIRECT说:“评估一些特定的标准,它会创build一个单元格引用,现在看那个单元格引用。 最简单的forms是这样的:

 =INDIRECT(A1) 

假设A1保持值“B5”。 间接接收值“B5”,而不是显示“B5”,它将到达B5,并在那里提取值。 所以要使用上面的这个,将整个事情包装在INDIRECT函数中。 而不是拿起文本string“$ A $ 1:$ A $ 53”,它实际上现在会正确引用该范围。 像这样:

 =INDIRECT(ADDRESS(ROW(A2),COLUMN(A2),1,1)&":"&ADDRESS(ROW(A2)+1+COUNT(A:A),COLUMN(A2),1,1)) 

使用命名的范围

但是这是一个非常长的公式,你不希望在一个特定的单元格内使用它来进行简单的INDEX / MATCH。 而不是在单元格中input这些公式(尽pipe你可以),我build议你去公式function区 – >名称pipe理器 – >新名称。 调用“ID_COLUMN”索引的名称。 调用“B_COLUMN”(或更具体的)索引的名称。

最终的公式

现在,如果你想创build一个你的表的INDEX / MATCH,当你改变数据时它会自动增长/缩小,你的公式看起来像这样[例如,这会从列B号码100]:

 =INDEX(ID_COLUMN,MATCH(100, B_COLUMN, 0))