Excel公式优化

我不是专家,经过一番研究,拿出这个公式从不同的时间看两组相同的数据。 然后显示最新的数据列表中的新条目,但不显示在旧列表中。

这是我的公式:

{=IF(ROWS(L$4:L8)<=(SUMPRODUCT(--ISNA(MATCH($E$1:$E$2500,List1!$E$1:$E$2500,0)))), INDEX(E$1:E$2500, SMALL(IF(ISNA(MATCH($E$1:$E$2500&$F$1:$F$2500,List1!$E$1:$E$2500&List1!$F$1:$F$2500,0)), ROW($F$1:$F$2500)-ROW($F$1)+1),ROWS(L$4:L8))),"")} 

有什么优化技术可以用来加速计算吗?

按照要求一些示例数据(链接到电子表格): https : //docs.google.com/file/d/0B186C84TADzrMlpmelJoRHN2TVU/edit?usp =分享

在这个缩小的版本,它更有效率,但在我的实际工作表上有更多的数据,它放缓。

那么,我玩了一下,我认为这是一样的,没有第一次IF声明:

 =IFERROR(INDEX(A$1:A$2500,SMALL(IF(ISNA(MATCH($A$1:$A$2500&$B$1:$B$2500,List1!$A$1:$A$2500&List1!$B$1:$B$2500,0)),ROW($B$1:$B$2500)-ROW($B$1)+1),ROWS(F$2:F2))),"") 

样本数据中的这一部分:

 ROWS(F$2:F2)<=(SUMPRODUCT(--ISNA(MATCH($A$1:$A$2500,List1!$A$1:$A$2500,0)))) 

根据我的理解,只能看到input公式的行号低于“新”项的数量,但它不起任何作用,因为当您拖动公式超过要求时,仍然会得到错误,而不是预期的空白。 所以我认为它可以完全删除(尝试用COUNTA()代替它),并使用直接获取细节部分的IFERROR()

编辑:划掉了。 见巴里霍迪尼评论这些部分的重要性。

接下来,你有这个:

 ROW($B$1:$B$2500)-ROW($B$1)+1 

-ROW($B$1)+1 总是返回0 ,所以我没有find任何用处并将其彻底清除。

这还是相当长的,我需要一些时间,但我相信它应该比以前更快一些:)

相对较快的解决scheme是在列表2旁边的列中添加多单元格数组公式

{=MATCH($A$1:$A$16,List1!$A$1:$A$11,0)}

并过滤#N / A的结果输出。

(或者查看我的商业解决scheme的Compare.Lists vs VLOOKUP )

数组公式很慢。 当你有数千个数组公式时,它会使速度非常慢。 因此,关键是要避免任何数组公式。

以下将是我的方法来实现它,只使用简单的公式。 如果只有2500行,它应该足够快。

  • 列F和H是“键”,通过连接你的2列(原来的公式中的E和F)
  • 假设第一行数据在第3行。

数据:

 | A | B | | D | E | F | | H | | index | final value | | ID | exist in Old? | Key (New) | | Key (Old) | -------------------------------------------------------------------------------- | 1 | XXX-33 | | 0 | 3 | OOD-06 | | OOC-01 | | 2 | ZZZ-66 | | 0 | 1 | OOC-01 | | OOC-02 | | 3 | ZZZ-77 | | 1 | N/A | XXX-33 | | OOD-06 | | 4 | | | 1 | 4 | OOE-01 | | OOE-01 | | 5 | | | 1 | 2 | OOC-02 | | OOF-03 | | 6 | | | 2 | N/A | ZZZ-66 | | | | 7 | | | 3 | N/A | ZZZ-77 | | | 

E列“存在于旧?”:testing旧列表(列H)中是否存在新的键(列F)

 =MATCH(F3, $H$3:$H$2500, 0) 

D列“ID”:每当find新的项目时增加1

 =IF(ISNA(E3), 1, 0)+IF(ISNUMBER(D2), D2, 0) 

ISNUMBER的第二部分只是第一行,只使用D2会导致错误

列A“索引”:从1开始的一个普通系列(直到新列F列的长度)

B列“最终值”:通过将列A与列D相匹配来查找新密钥。

 =IF(A3>MAX($D$3:$D$2500), "", INDEX($F$3:$F$2500, MATCH(A3, $D$3:$D$2500, 0)) 

此列B将成为您想要的列表。

如果它仍然太慢,则存在一些肮脏的技巧来加速计算,例如通过利用MATCH( , , 1)而不是MATCH( , , 0)的sorting列表。