1

完了するのに長い時間がかかる配列計算を実行しています。数式をもう少し最適化したいと思います。すべての数式は同じ性質のものです。値の列全体で高レベルの関数(平均、勾配、最小、最大)を実行します。ただし、列内のすべてのセルが配列に含まれているわけではありません。複数のIF基準を使用して、含めるセルを選択します。すべての比較は現在の行に対して行われます。データの例を次に示します。

     A             B                C            D          E
1    Company       Generation       Date         Value      ToCalculate
2    Abc           1                1/1/2010     5.6          
3    ...           ...              ...          ...        ...

Eは次のようになります

{=Average(If(A2=A2:A1000, If(B2=B2:B1000, If(C2 > C2:C1000, D2:D1000))))}

したがって、E2が計算されたら、列Eを自動入力する必要があります。列F、G、H、...同じアプローチを使用して、操作する別の値または実行する別の関数を選択します。私のデータセットは非常に大きく、これらのいくつかだけで、スプレッドシートの計算に1時間以上かかります。時々、4番目の基準を追加します。他のすべての基準は同じです。

効率はありますか?いくつかの考え:

  1. 列ごとに数千ではなく、列ごとに単一の配列を使用できますか?
  2. 最初の3つの基準を要約して、出力が行番号になるようにすることはできますか?おそらく、後続の数式は複数の基準を検索する必要はありませんが、関数を実行するだけで済みますか?
  3. またはどういうわけかcrtieriaを構築しますか?したがって、新しい列は、会社が同じであるすべての行を返します。別の列は、世代が同じである最初の列からのすべての行を返します...など...
4

2 に答える 2

1

Average の場合、配列なしで実行できます。

 =AVERAGEIFS(D2:D$1000,A2:A$1000,A2,B2:B$1000,B2,C2:C$1000,"<="&C2)  

COUNTIFS と SUMIFS もあるので、勾配も同じように計算できると思います。

残りの関数 (最大、最小など) については、ケースバイケースで分析する必要があります。

私はわずかなパフォーマンス テストを行いましたが、これは明らかに優れていますが、もちろん、私のデータセットは単にモックされています。

チッ!

注: Excel 2007 以降のみ!

編集- コメントへの回答。

問題の規模を知らずにアドバイスを与えることは困難ですが、とにかく危険を冒します。

次のような VBA 関数を作成できます。

1) 会社と世代のペアごとに新しいシートを生成する
2) これらのシートのデータを日付順に並べ替える
3) これらのシートに数式を追加する (このコンテキストでは条件は必要ありません)
4) それらの数式から結果を再計算して取得し、入力します
5) 補助シートを削除 する

于 2010-10-30T16:32:17.070 に答える
1

行をキャプチャして再利用するには、次のアプローチを試してください
。会社と世代でデータを並べ替えます。
企業と世代の一意のリストを作成します (高度なフィルター、一意のみ、コピーを使用)
リスト内の各企業世代のペアに対して、2 列の数式を作成します。
最初の列はこのペアのデータの行数を示し (COUNTIFS を使用)、2 番目の列はこのペアのデータの最初の行を示します (= 前のペアの最初の行 + 前のペアの行数)。
次に、OFFSET のような関数を使用して、Company-Generation ペアのデータ行のみを返し、これを最終的な関数/配列式 (AVERAGEIFS など) 内に埋め込む
ことができます。必要に応じて、この並べ替えとカウントのアプローチを拡張して日付を含めることができます。
都市と世代のリストが変更された場合、一意のリストと関連する数式を変更する必要があるという欠点があります。
このアプローチの例は、私の Web サイト
http://www.decisionmodels.com/optspeedk.htm
http://www.decisionmodels.com/optspeedj.htmにあります。

于 2010-10-31T12:03:37.560 に答える