- PR -

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

投稿者投稿内容
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 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件あっても一瞬ですが。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-08-25 18:02
こんなコンポーネントもありますよ。高速って書いてあるし、体験版もダウンロードできるみたいですから、試してみてはいかがでしょう?
SIC
会議室デビュー日: 2005/09/01
投稿数: 14
投稿日時: 2006-08-26 14:09
皆様、返信ありがとうございます。

>るばんさん
助言ありがとうございます。
ソースが面倒くさいとかそういうことはないんです。
ただ単に出来る限り簡単なソースコードにしても
処理に時間がかかるのが問題なだけであって・・・。

>mioさん
説明不足で申し訳ありません。
帳票にはヘッダーとフッターが存在していまして、
その部分にもデータの貼り付けがあるため
エクセルのヘッダー、フッター機能は使えないと判断しました。

そのため改ページの必要が生じたら
1ページ分の書式(ヘッダー、フッターを含めて)のコピーという方法をとっています。

>ぼのぼのさん
そういうコンポーネントもあるんですね。
ただコンポーネントの購入は許可が下りないと思います。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-08-26 20:51
引用:

SICさんの書き込み (2006-08-26 14:09) より:
>ぼのぼのさん
そういうコンポーネントもあるんですね。
ただコンポーネントの購入は許可が下りないと思います。


こうしてSICさんが調査している作業時間に対してもお金は発生しているわけですから、トータルの工数を考えるとコンポーネントを導入することで却って安く済む可能性もあるわけで。

別にこのコンポーネントが売れることで私が得するわけではないので無理にとは言いませんが、頭っからあきらめてしまうのは勿体ないですよ。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 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
SIC
会議室デビュー日: 2005/09/01
投稿数: 14
投稿日時: 2006-08-30 11:46
>ぼのぼのさん
以前工数を減らすために
紹介いただいたコンポーネントと価格が同じくらいの帳票ソフトの購入を
提案しましたが、あっさり却下されましたので購入は無理かとコメントしました。
今回のコンポーネントの件も普通にスルーされましたしね

>mioさん
わざわざソースまで書いていただき本当にありがとうございました。
参考にさせていただきたいと思いますm(_ _)M

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