1

我不是 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

在这个按比例缩小的版本上,它更有效,但在我的实际工作表上,它有更多的数据,它变慢了。

4

3 回答 3

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()在部件上使用直接获取详细信息。

编辑:把它刮掉了。有关这些部分的重要性,请参阅 barry houdini 的评论。

接下来,你有这个:

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

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

我猜它仍然很长并且需要一些时间,但我相信它应该比以前快一个档次:)

于 2013-09-27T18:00:35.723 回答
1

一个相对快速的解决方案是在列表 2 旁边的列中添加一个多单元格数组公式

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

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

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

于 2013-09-27T15:50:20.167 回答
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 列“exist in Old?”:测试新键(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).

于 2013-09-27T16:09:42.403 回答