Excel性能 – INDEX-MATCH组合
我正在使用Excel来创build稍后在vba应用程序中使用的数据集。 我正在使用这个公式:
=INDEX(BaseData!$L$2:$L$10000;MATCH(DataSet!D5&DataSet!E5&DataSet!K5;INDEX(BaseData!$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))