Excel公式优化

时间:2013-09-27 14:24:37

标签: excel optimization excel-2007 formula

我不是一位优秀的专家,经过一些研究后我们想出了这个公式,从不同的时间看两组相同的数据。然后,它会显示最新数据列表中的新条目,但不会显示在旧列表中。

这是我的公式:

  {=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

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

3 个答案:

答案 0 :(得分: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,所以我没有找到任何用处并完全删除它。

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分: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“存在于Old?”:测试新键(列F)是否存在于旧列表中(列H)

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

列D“ID”:每当找到新项目时递增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)的排序列表。

相关问题