Excel性能-索引-匹配组合



我使用excel创建在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,因为我的数据可以不同的长度,并且在数据选择中经常变化。

然而,这大大降低了我的excel速度。我切换到手动计算,但是,当再次激活自动计算时,我的excel实例需要很长时间并且经常崩溃。

我也试图过去一些数据,但是当创建一个新的数据集时,我必须再次拉下公式,有时通过这个错误发生在我的数据集中。

有什么建议,我可以做些什么,使INDEX-MATCH公式更性能?

感谢您的回复!

我猜很多性能会消失,因为index-match没有选择精确的范围,但也在空白行中计数。如何获得准确的范围与索引匹配自动?

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

计算你想要的范围

对于下面的例子,我假设:列A只包含一个数字形式的索引键;A栏不包括标题及以上的数字;并且索引行是连续的,没有间断。从下面的公式开始:

 =COUNT(A:A)

如果我上面的假设成立,那么这将返回表中数据元素的数量。一旦我们知道了数据的起始位置,我们就可以使用COUNT来确定数据的结束位置。假设标题在第2行。(我喜欢包含标题,这样如果你在标题下面插入一行,Excel就会发现你想在公式中包含新行)。考虑到这一点,这个公式将创建excel样式的引用,查找列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)

返回文本字符串结果"$A$2:$A$53",这是对唯一ID值的完整索引的引用。如果您插入任何行或列,它将自动移动,就像您通常期望的那样。现在假设对于INDEX,您希望提取相同的数据,但要针对列B。公式将完全相同,除了上面我有"COLUMN(A2)"的地方,替换为"COLUMN(B2)"。

引用计算范围

现在你有了合适的有限列的地址——但是你如何在公式中引用这些区域呢?通过使用INDIRECT函数。间接表示"评估一些具体的标准。它将创建一个单元格引用。现在看看那个细胞参考。"其最简单的形式可能如下所示:

=INDIRECT(A1)

假设A1保存值"B5"。间接将拾取值"B5",而不是显示"B5",它将转到B5,并在那里拾取值。因此,要将其与上面的内容一起使用,请将整个内容包装在INDIRECT函数中。而不是拿起文本字符串"$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的特定单元格中使用它。不要在单元格中输入这些公式(尽管您可以这样做),我建议您转到公式功能区->名称管理器->新名称。调用A索引的名称"ID_COLUMN"。调用"B_COLUMN"索引的名称(或更具体的名称)。

<

最终公式/strong>

现在,如果您想为您的表创建一个INDEX/MATCH,它会随着您更改数据而自动增长/缩小,您的公式将看起来像这样[例如,这将从B列中选择A列的数字为100的行]:

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

最新更新