1

私はエクセルの専門家ではありません。いくつかの調査の結果、異なる時間の同じデータの 2 つのセットを調べるためのこの式が思いつきました。次に、データの最新リストにあるが古いリストにはない新しいエントリを表示します。

これは私の式です:

  {=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 と 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」: 新しいアイテムが見つかるたびに 1 ずつ増加します

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

の 2 番目の部分は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 に答える