2013-09-27 58 views
1

我不是Excel专家,经过一些研究后提出了这个公式,以查看来自不同时间的两组相同数据。然后显示新数据列表中的最新数据列表,但不包含在旧列表中。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=sharing

在这个缩小版的比较有效,但对我有很多更实际的数据表它减慢。

+1

你可以张贴一些示例数据应该比以前快了一个档次? – Jack

+0

我已经添加了一些示例数据 – BAS

+0

这些是否始终配对,或者可能n,3是否为新项目?如果按行标识,过滤/复制/粘贴结果是否可以接受? – pnuts

回答

2

好吧,我是打了一下周围,我认为这种工作方式相同,并没有第一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)))) 

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

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

接下来,你有这样的:

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

-ROW($B$1)+1总是回报0,所以我没有发现任何使用它和完全删除它。

它仍然很长,需要一段时间我想,但我相信:)

+2

Hey Jerry!使用'ROW($ B $ 1:$ B $ 2500)-ROW($ B $ 1)+ 1'就是说它更“健壮” - 例如,如果在工作表顶部添加两行, 'ROW($ B $ 3:$ B $ 2502)-ROW($ B $ 3)+ 1',因此会返回相同的数组 - 如果删除'ROW($ B $ 1)+ 1',则不起作用。如果第一个公式在F2 –

+0

@ barryhoudini中,ROW() - 1'在ROWS(F $ 2:F2)方面更为强大这确实改变了这些部分的视角,而且您是否意味着'ROW )-'没有健壮性?= P – Jerry

1

相对快速的解决方案是在一列增加一个多单元阵列式并排列表2

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

并过滤所得到的输出为#N/A。

(或参阅Compare.Lists vs VLOOKUP我的商业解决方案)

+0

... = MATCH($ A1 ...而不是... = MATCH($ A $ 1 ...?) – pnuts

+0

否:它不是单个单元格数组公式,而是一个多单元格数组公式:选择C1:C16在公式栏中输入公式,然后按下Control-Shift-Enter –

+0

Aha!谢谢你纠正我,后悔我-1'd(期待删除$然后反向投票) – pnuts

0

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

以下是我的方法来实现它,只使用简单的公式。如果只有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列 “旧存在吗?”:如果测试新的密钥(列F)在旧列表中存在(H列)

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

列d“ID”:每当一个新的项被发现由一个递增

=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)的排序列表。