[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『再計算によるパフォーマンス低下のための改善方法について』(せいやん)
初めて質問いたします。
こちらのサイトを参考に2つの条件に一致する値の合計値を計算するのに
「SUMPRODUCT(($I$2:$I$21=B$2)*($J$2:$J$21=$A4),K$2:$K$21)」
を使ったのですが、これを2000行×70列にセット
したためか、データーを入力するたびに再計算が実行され、
パフォーマンスが低下しています。
これを回避するために自動計算を手動計算に変える以外で
パフォーマンス向上の方法はあるのでしょうか?
一部セル(200行×70列)にSUMPRODUCT+SUMPRODUCTと
2つの関数の足し算を入れているのですが、このことが
影響しているのでしょうか?
Excel2000,WindowsXPを使用しています。
よろしくお願い致します。
質問の主旨が理解できません。
範囲、I2:K21 はどのようになっているのでしょう I列、J列に重複データがあるのでしょうか?
>データーを入力するたびに再計算が実行され、 再計算されると言うことは、範囲、I2:K21 のデータをたびたび変更すると言うことですか?
他に原因がありそうな気がしますが・・・
>これを2000行×70列にセット どの範囲に入力しているのでしょう 提示された式をコピーしているとは思えませんが・・・
まず、原因を調べた方がいいかな(提示された式が原因と思われませんので)
編集 10:25 >データーを入力するたびに再計算が実行され 揮発性の関数が使用されていると思われます
表全体について説明した方がいいと思います
考え方だけアドバイス
リアルタイムに集計結果が必要で、且つ、速さを求めるのであれば、 作業列に各行個別の計算値を出しておいて、その作業列を単純にSUMする という仕組みの方が、 普通に考えて再計算に必要なコストは最小で済みます。
セルの消費を抑えるのか、 計算コストを抑えるのか、 優先すべきはどっちでしょうか? ということ。(DB管理でINDEXを貼るか悩むのに似ている・・・かな)
リアルタイムに結果が必要なければ、 私は、 1000行単位のデータを相手にするときは、 配列関数や配列数式を使用する場合でなかったとしても、 1行目だけ数式を残して、後は数値化し、 最新の計算結果が欲しくなったらフィルダウンして再度数値化。 というやり方をしています。
都度フィルダウンが困難な場合(レイアウトが複雑とか)なら、
例えば、 SUMIFを大量に配置しており、その元データが定期的に変更される場合などは、 一つのセルをSUMIF発動スイッチとして定義して、 =IF(発動スイッチ,SUMIF(...),) という数式にしておけば、 発動スイッチがFALSEの間は、SUMIF再計算にコストは掛りませんので、 元データの編集がスムーズに行えます。
(白茶)
@今やりたいこと
下記のような複数のDB(品名、日付の項目はすべて
共通で持っていますが、数量の部分がDB@、DBAでは一致していません)
から下記のような品名、日付の一致するもののマトリックスを
つくりたいということです。
================
5/1 5/2(←日付です)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
品名 条件
a DB@より 3 4(←DB@の中で一致するものの合計量です) a DBAより 5 6(←DBAの中で一致するものの合計量です) a DBA+DBBより 6 5(←DBAとDBBの中で一致するものの合計量です) b DB@より b DBAより ・ ・ ・ ・ ================ 1つのDBですとピポットテーブルを使えばいいと思うのですが、 複数のDBから共通である品名、日付の部分を使って、1つの ピポットテーブルをつくりたいといったイメージです。
A実際やったこと
DBは実際はすべてで4つありますが、上記表、以下の説明では
簡略化のためDB3つで説明します。
まず、A列に品名(品名数:2000種)、1行目に
日付(とりあえず5/1〜7/10)のマトリックス表を作り、
品名:a、条件:DB@の部分は前述のSUMPRODUCT関数を使って
日付と品名の一致する時の数式をセットしました。
また品名:a、条件:DBA+DBBの部分は
(SUMPRODUCT関数+SUMPRODUCT関数)の数式をセットしました。
なお、DB@、A、Bともに日々更新していきます。
B結果
処理自体はうまくいったのですが、自動計算の設定にしておくと
作業ごとになぜか再計算の処理が発生し、砂時計の待ちの状態に
なってしまいます。
この処理の時間をなんとか早くしたいというのが今回
ご相談したいことです。
今まで複雑な関数を使うことがなく、色々調べながら作業をしており、
ご相談の趣旨が本当にわかりにくくてすみませんでした。
(マトリックス表の表現がうまくいかないかもしれませんが、すみません
日付のあとの−−−は罫線のつもりです。)
よろしくお願い致します。
それは確かに重いですね・・・
「ピボット使えるのならその方が良い」とお考えでしたら、 4っつのDBをテーブルID付きの1テーブルに縦継ぎし、 そいつに対してピボットかける。
という方向ではダメでしょうか?
現状、SUMPRODUCT使ってるってことは、 各DBには集計上のデータ数上限があるってことなので、 4っつのDBを縦に継ぎ足したテーブルは、容易に作成可能と思いますが? (テーブルID列作って、元データから「=」で参照するだけ)
「DBを編集する度に再計算待ちになるのがイヤなだけで、 最終的な結果を計算する時はいくらでも待ちますよ」 という事であれば、 先程申しました発動スイッチで逃げれると思います。
(白茶)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.