我正在使用excel来创建稍后在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
,因为我的数据可能会有很长的差异,而且数据选择通常会有所不同。
但是,这会让我的擅长减速。我切换到手动计算,但是,当再次激活自动时,我的excel实例需要很长时间并经常崩溃。
我还尝试过去一些数据,但是在创建新数据集时,我必须再次将公式拉下来,有时候我的数据集会出现这种错误。
我可以做些什么来使INDEX-MATCH
公式更高效?
感谢您的回复!
更新
我想很多性能都会消失,因为索引匹配不会选择确切的范围,但也会计入空行。如何自动获得与索引匹配的精确范围?
答案 0 :(得分:2)
正如我在上面的评论中提到的,只要这是一个“常规”公式而不是数组公式,您可能会发现只需将“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说“评估一些特定的标准。它将创建一个单元格引用。现在查看该单元格引用。”在最简单的形式中,这可能是这样的:
=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”的名称(或更具体的名称)。
最终公式
现在,如果你想创建一个表的INDEX / MATCH,它会在你更改数据时自动增长/缩小,你的公式看起来就像这样[例如,这将从列B中选择列中的行A的编号为100]:
=INDEX(ID_COLUMN,MATCH(100, B_COLUMN, 0))