- PR -

【VB6】エクセルでコピーのループを行うと処理速度が遅くなる

投稿者投稿内容
鶴屋さん
会議室デビュー日: 2006/08/11
投稿数: 7
投稿日時: 2006-08-24 15:37
VBのredimしなおすような感じ
同じ内容でもペーストするたびに扱うデータの容量が増えるので、徐々に遅くなっていくような感じ
自分で同じことをしたときに感じたことです

また、その時に聞いた話ですが、メモリリークを起こすからコピペはやめてくれといわれ、
テンプレートっぽい部分を範囲のコピペでなく、
値、書式を1セル毎に代入する形で作り直した覚えがあります

メモリリークの話は裏を取っていませんが、
クリップボードか何かの不安定な領域を使用するからリークしまくるだったと思います
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-24 15:42
引用:

SICさんの書き込み (2006-08-24 15:03) より:

テンプレートと言う言い方で誤解を与えてしまいすみません。
出力用のファイルに印刷する内容1ページ分のシートを用意しておき、
改ページの度にそれを貼り付けるという方法でやっていました。
なのでコピーの処理時間が問題となっています。


そうだとしても、Copy メソッドを使う必要はなく、Range.Formula などで設定してあげれば良いと思うのです。
コピー先_Range.Formula = コピー元_Range.Formula のようにです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-08-25 01:56
引用:

SICさんの書き込み (2006-08-24 09:33) より:
2次元配列やレコードカウントを用いた場合改ページの処理がうまく行かず断念しました。



改ページが絡むなら当然めちゃくちゃ遅くなるでしょうな。

というか、Excel君に印刷をやらせるのは、不得意中の不得意なことなので、Excelを利用するのが本当にいいのか?ってことから考え直したほうがよいかと。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-08-25 10:00
うーん…。いまだに処理が良く分かってなかったりする。
総ページ数はこの場合関係ないように見えるんですが…。

まずはループで内容を設定しつつ、「そのページに何行できるか」をカウントしておいて、
その後カウントした分の行を一括して書式コピー、でいいような気がするんですが。
場合によっては、オートフィルメソッドも使えます。
ともかく、ループ中1行1行コピーを取ることは馬鹿らしいです。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-08-25 10:32
るぱんです。

当時は素直にループして.valueに値突っ込んでたなぁ・・・。


ページ数は、1ページに必ず●行とかって決め打ちじゃだめなんでしょうか?
まぁ、その●行は設定にはじき出しますが。汗

あとは・・・エクセルVBAにマクロ張ってそっちで制御とか・・・?
もう少し大きな枠組みでどんな処理かがわかれば
もう少し力に慣れそうな気はしますが・・・。
(開発環境は持っていますので)
SIC
会議室デビュー日: 2005/09/01
投稿数: 14
投稿日時: 2006-08-25 15:03
皆様、数々の返答ありがとうございます。
コピーの仕方をRangeオブジェクトを定義してCopyを実行する方法から
直接Range指定でCopyする様にしたところ
最初の方法だと1000件30分かかった処理時間が10分くらいになりました。
もちろんコピーの処理時間が遅くなる現象はそのままですが・・・。

実用できるかどうかの判断は自分では出来ないので、
この状態で上司の判断をあおいでみるつもりです。

>鶴屋さん
セル単位だとテンプレートの罫線とかが上手く行かないうえ、
Borderとか色々代入してると結局同じくらい時間がかかってしまいました・・・。

>じゃんぬねっとさん
上にも書きましたが、テンプレートの罫線や書式をうまく渡す設定ができなくて
結局Copyに頼るしかないという状況になりました。
不勉強で申し訳ありません。

>ちゃっぴさん
私もそう思うのですが、上が決めたことなのでどうしようもありません。
なんでも帳票のデザインが変わった時にActiveReportだとプログラムが作り直しだが、
Excelだったらテンプレートの修正ですむとの判断らしいです。

>mioさん
すみません、私の方の勘違いでした。
結局1ページ分の一括コピーという方法を使っています。

>るぱんさん
1ページに何行というのは決まっていますので、
1ページ分のシートを作ってそれをコピーするようにしました。
エクセルVBAは印刷する帳票が30種類ほどあるため、工数的にNGと言われました。
私自身エクセルのマクロの作成とかはあまりしたことはないんです。


皆様、本当にありがとうございました。
なるべく自分のスキルをあげてこういう基本的な質問は
しなくてもすむようにしたいと思います。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-08-25 15:56
るぱんです。

よくやる手としては、テンプレートファイル(30個の帳票)のテンプレートを作って
そこに対して30種類分の分岐を設けてやる方法なのですが、
それがNGであれば、VBだけでやるしかないですね。。。

まぁ、工数的にできたとしても、お客は理解できなくなりますけどね。
そういう意味で、要件定義で工数追加になりそう(笑)

それは、さておき本題。
今回みたいに、
・ページ制御
・データコピー

のような複数機能がある場合は一回切り分けてコメントだけで
コーディングすると頭の中が整理されやすいです〜。

まぁ、当初は帳票印刷・・・と言う感じで一くくりだったんでしょうけど。汗

コメントだけでコーディングの感触がつかめると、
設計力が抜群に上がったりします。

なんたって、コメントだけ修正すれば、最後にまとめて突貫工事で
ソースコードかけますから。

今回の例をとれば、
コード:
ver1
public Sub Test()
    '帳票印刷
End Sub



コード:
ver2
public Sub Test()
    '帳票印刷
        '1.データ取得
        '2.エクセル出力
        '3.ユーザー操作によるプリンター出力(以後ユーザー操作なので無視)

End Sub


コード:
ver3
public Sub Test()
    '帳票印刷
        '1.データ取得
            '1−1.ADO接続
            '1−2.結果取得
            '1−3.取得結果の整形

        '2.エクセル出力
            '2−1.テンプレート取得
            '2−2.データ書き込み
            '2−3.ページ制御

End Sub



こんな感じでいかがでしょ?

これやると、
大見出しの単位で関数作れるのでソースが整理できます。
頭を整理しながらやると、引数と戻り値もチェックできたりして、
保守性がさらにあがると思います。

めんどくさかったら分ければいいんです。
何より、混乱することがなくなりますんで。(笑)
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-08-25 15:59
何か全然流れを理解していない人がいるぞ。

スキルアップ/キャリアアップ(JOB@IT)