SSブログ

エクセルVBAの弱点 [システムトレード]

エクセルVBAは高機能であり非常に有用なのですが、大きな弱点があります。それは、ワークシートへの書き出しが異常に遅いということです。

例えば、プロシージャに「Range("B5").Value="銘柄名"」などと記述してマクロを実行すると、アクティブなシートのB5セルに、「銘柄名」と入力されるわけですが、同様にして数10個のセルにデータの書き出しを行うと、信じられないくらい時間が掛かります。

実際に、高々70個程度のセルにデータを書き出したところ、30秒近くも掛かってしまいました。これは、データを逐次書き出していっても、一旦、配列に収納して、それをまとめて書き出しても、同じでした。

しかし、よくよく考えてみると、データ取得マクロでも同様の処理を行っており、こちらはそんなにノタノタした動きはしていません。
いったいどこが違うのか、現時点ではよく分かりません。数字の書き出しなら速いというわけでもなさそうです。

冒頭の処理は、システムのパラメータを抽出して、それを他のブック上のワークシートに書き出すというものなのですが、さすがに30秒近く掛かってしまうのは困りものです。
そこで、データをこまめにコピーしていったところ、半分程度の処理時間で済みました。

見栄えは大層悪いマクロになってしまいましたが、背に腹は変えられません。他に有効な方法が見つかるまで、この方法で行きたいと思います。


6月13日 追記

原因が分かりました。詳細はコメントをご覧ください。エクセルに罪はありません。お騒がせして申し訳ありませんでした。

nice!(0)  コメント(4)  トラックバック(0) 
共通テーマ:

nice! 0

コメント 4

悪魔くん

こんばんは。
セル範囲とかセルそのものに名前を定義したりしてませんか?

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1316572713
by 悪魔くん (2008-06-12 22:31) 

Kフロー

悪魔くん、こんにちは。いつもありがとうございます。

原因が分かりました。システムのパラメータを新しいブックのワークシートにコピーする際、元のシステムを開いたままにしていたため、データ書き出しの度に元のシステムで再計算が発生していたようです。

マクロの冒頭に、Application.Calculation=xlManual を記述することで、データ書き出しが瞬時に終了できました。

アクティブなブックは新しく作成したブックなので、元のブックに再計算が発生していたなんて思いもよりませんでした。
よく考えてみれば、マクロの所在は元のブックにあるわけで、当たり前の話ですね。

大変お騒がせいたしました。今後ともよろしくお願いいたします。

by Kフロー (2008-06-13 09:20) 

獏

大量の書き出しをするときは、やっぱり時間がかかります。
たとえば、500行×20列をセル毎にLoopで回して書き出すと、
少し遅いPCなら10分以上かかります。

こんな時は、タブと改行で区切ったテキストを作成し、
クリップボード経由で左上のセルにペーストすると、
一瞬で書き出せます。
by 獏 (2008-07-04 13:41) 

Kフロー

獏さん、こんにちは。アドバイス、ありがとうございます。
今後の参考にさせていただきます。

by Kフロー (2008-07-07 09:02) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。