- - PR -
【VB6】エクセルでコピーのループを行うと処理速度が遅くなる
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-08-25 16:47
全体像がいまだ見えないので、全然違うことしているのかも知れませんが。
dataに抽出結果が展開されていて、mがその件数だとすると、 template.Rows(1).Copy data.Select data.Rows("1:" & m).Select Selection.PasteSpecial Paste:=xlPasteFormats data.Cells(1, 1).Select ' とりあえずA列B列をキーとしてbreakする For i = 2 To m If data.Cells(i, 1).Value <> data.Cells(i - 1, 1).Value _ Or data.Cells(i, 2).Value <> data.Cells(i - 1, 2).Value Then data.HPageBreaks.Add before:=Rows(i) End If Next こんな感じのものではない…んでしょうか。 1000件あっても一瞬ですが。 | ||||
|
投稿日時: 2006-08-25 18:02
こんなコンポーネントもありますよ。高速って書いてあるし、体験版もダウンロードできるみたいですから、試してみてはいかがでしょう?
| ||||
|
投稿日時: 2006-08-26 14:09
皆様、返信ありがとうございます。
>るばんさん 助言ありがとうございます。 ソースが面倒くさいとかそういうことはないんです。 ただ単に出来る限り簡単なソースコードにしても 処理に時間がかかるのが問題なだけであって・・・。 >mioさん 説明不足で申し訳ありません。 帳票にはヘッダーとフッターが存在していまして、 その部分にもデータの貼り付けがあるため エクセルのヘッダー、フッター機能は使えないと判断しました。 そのため改ページの必要が生じたら 1ページ分の書式(ヘッダー、フッターを含めて)のコピーという方法をとっています。 >ぼのぼのさん そういうコンポーネントもあるんですね。 ただコンポーネントの購入は許可が下りないと思います。 | ||||
|
投稿日時: 2006-08-26 20:51
こうしてSICさんが調査している作業時間に対してもお金は発生しているわけですから、トータルの工数を考えるとコンポーネントを導入することで却って安く済む可能性もあるわけで。 別にこのコンポーネントが売れることで私が得するわけではないので無理にとは言いませんが、頭っからあきらめてしまうのは勿体ないですよ。 | ||||
|
投稿日時: 2006-08-26 21:29
templateのシートをそのまま使うマクロを考えてみたり。
ヘッダとフッタは入ってないけど、追加することは難しくはないはず。 あんまり検証してないので境界条件が間違ってる可能性はあります。 result.Select For i = 2 To m If data.Cells(i, 1).Value <> data.Cells(i - 1, 1).Value _ Or data.Cells(i, 2).Value <> data.Cells(i - 1, 2).Value Then splitPage data, result, start, i, page start = i End If Next splitPage data, result, start, i, page template.Rows("1:" & PAGE_SIZE).Copy result.Rows(1 & ":" & (page * PAGE_SIZE - 1)).PasteSpecial Paste:=xlFormats result.Cells(1, 1).Select Private Sub splitPage(ByVal data As Worksheet, ByVal result As Worksheet, ByVal start As Long, ByVal i As Long, ByRef page As Long) Dim j As Long Dim m As Long m = CLng((i - start) / PAGE_SIZE) - 1 For j = 0 To m data.Rows(start & ":" & (start + PAGE_SIZE)).Copy result.Cells(page * PAGE_SIZE + 1, 1).PasteSpecial Paste:=xlValues page = page + 1 start = start + PAGE_SIZE Next If start < i Then data.Rows(start & ":" & (i - 1)).Copy result.Cells(page * PAGE_SIZE + 1, 1).PasteSpecial Paste:=xlValues page = page + 1 End If End Sub | ||||
|
投稿日時: 2006-08-30 11:46
>ぼのぼのさん
以前工数を減らすために 紹介いただいたコンポーネントと価格が同じくらいの帳票ソフトの購入を 提案しましたが、あっさり却下されましたので購入は無理かとコメントしました。 今回のコンポーネントの件も普通にスルーされましたしね >mioさん わざわざソースまで書いていただき本当にありがとうございました。 参考にさせていただきたいと思いますm(_ _)M |
«前のページへ
1|2|3