- - PR -
【VB6】エクセルでコピーのループを行うと処理速度が遅くなる
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-24 15:37
VBのredimしなおすような感じ
同じ内容でもペーストするたびに扱うデータの容量が増えるので、徐々に遅くなっていくような感じ 自分で同じことをしたときに感じたことです また、その時に聞いた話ですが、メモリリークを起こすからコピペはやめてくれといわれ、 テンプレートっぽい部分を範囲のコピペでなく、 値、書式を1セル毎に代入する形で作り直した覚えがあります メモリリークの話は裏を取っていませんが、 クリップボードか何かの不安定な領域を使用するからリークしまくるだったと思います | ||||||||||||
|
投稿日時: 2006-08-24 15:42
そうだとしても、Copy メソッドを使う必要はなく、Range.Formula などで設定してあげれば良いと思うのです。 コピー先_Range.Formula = コピー元_Range.Formula のようにです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-08-25 01:56
改ページが絡むなら当然めちゃくちゃ遅くなるでしょうな。 というか、Excel君に印刷をやらせるのは、不得意中の不得意なことなので、Excelを利用するのが本当にいいのか?ってことから考え直したほうがよいかと。 | ||||||||||||
|
投稿日時: 2006-08-25 10:00
うーん…。いまだに処理が良く分かってなかったりする。
総ページ数はこの場合関係ないように見えるんですが…。 まずはループで内容を設定しつつ、「そのページに何行できるか」をカウントしておいて、 その後カウントした分の行を一括して書式コピー、でいいような気がするんですが。 場合によっては、オートフィルメソッドも使えます。 ともかく、ループ中1行1行コピーを取ることは馬鹿らしいです。 | ||||||||||||
|
投稿日時: 2006-08-25 10:32
るぱんです。
当時は素直にループして.valueに値突っ込んでたなぁ・・・。 汗 ページ数は、1ページに必ず●行とかって決め打ちじゃだめなんでしょうか? まぁ、その●行は設定にはじき出しますが。汗 あとは・・・エクセルVBAにマクロ張ってそっちで制御とか・・・? もう少し大きな枠組みでどんな処理かがわかれば もう少し力に慣れそうな気はしますが・・・。 (開発環境は持っていますので) | ||||||||||||
|
投稿日時: 2006-08-25 15:03
皆様、数々の返答ありがとうございます。
コピーの仕方をRangeオブジェクトを定義してCopyを実行する方法から 直接Range指定でCopyする様にしたところ 最初の方法だと1000件30分かかった処理時間が10分くらいになりました。 もちろんコピーの処理時間が遅くなる現象はそのままですが・・・。 実用できるかどうかの判断は自分では出来ないので、 この状態で上司の判断をあおいでみるつもりです。 >鶴屋さん セル単位だとテンプレートの罫線とかが上手く行かないうえ、 Borderとか色々代入してると結局同じくらい時間がかかってしまいました・・・。 >じゃんぬねっとさん 上にも書きましたが、テンプレートの罫線や書式をうまく渡す設定ができなくて 結局Copyに頼るしかないという状況になりました。 不勉強で申し訳ありません。 >ちゃっぴさん 私もそう思うのですが、上が決めたことなのでどうしようもありません。 なんでも帳票のデザインが変わった時にActiveReportだとプログラムが作り直しだが、 Excelだったらテンプレートの修正ですむとの判断らしいです。 >mioさん すみません、私の方の勘違いでした。 結局1ページ分の一括コピーという方法を使っています。 >るぱんさん 1ページに何行というのは決まっていますので、 1ページ分のシートを作ってそれをコピーするようにしました。 エクセルVBAは印刷する帳票が30種類ほどあるため、工数的にNGと言われました。 私自身エクセルのマクロの作成とかはあまりしたことはないんです。 皆様、本当にありがとうございました。 なるべく自分のスキルをあげてこういう基本的な質問は しなくてもすむようにしたいと思います。 | ||||||||||||
|
投稿日時: 2006-08-25 15:56
るぱんです。
よくやる手としては、テンプレートファイル(30個の帳票)のテンプレートを作って そこに対して30種類分の分岐を設けてやる方法なのですが、 それがNGであれば、VBだけでやるしかないですね。。。 まぁ、工数的にできたとしても、お客は理解できなくなりますけどね。 そういう意味で、要件定義で工数追加になりそう(笑) それは、さておき本題。 今回みたいに、 ・ページ制御 ・データコピー のような複数機能がある場合は一回切り分けてコメントだけで コーディングすると頭の中が整理されやすいです〜。 まぁ、当初は帳票印刷・・・と言う感じで一くくりだったんでしょうけど。汗 コメントだけでコーディングの感触がつかめると、 設計力が抜群に上がったりします。 なんたって、コメントだけ修正すれば、最後にまとめて突貫工事で ソースコードかけますから。 今回の例をとれば、
こんな感じでいかがでしょ? これやると、 大見出しの単位で関数作れるのでソースが整理できます。 頭を整理しながらやると、引数と戻り値もチェックできたりして、 保守性がさらにあがると思います。 めんどくさかったら分ければいいんです。 何より、混乱することがなくなりますんで。(笑) | ||||||||||||
|
投稿日時: 2006-08-25 15:59
何か全然流れを理解していない人がいるぞ。
|