- ベストアンサー
大量の図変換でVBAが遅い
- Excel2007を使用している場合、ActiveXコントロール「Microsoftバーコードコントロール 9.0」を使用してバーコードを生成しているVBAコードで処理が遅くなる問題が発生しています。
- サブルーチンでの再描画停止や手動計算への切り替えも行っていますが、処理速度は改善されていません。
- 処理時間は最初の10個/秒から最後の2秒/個まで低下し、環境によっては700個で240秒かかってしまいます。速度改善の方法を探しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> 画像Pasteのみ1万回で10秒、処理速度は一定でした Excel2003使ってた・・・ 確かに、2007だと異様なペースで遅くなっていきますね(--; OLEObjects.AddもPictures.Pasteも遅いんじゃ、代替手段が・・・ あ、あった! なぜか、セルごとコピペすれば遅くならない。 1. 他シートの適当なセルに、PasteSpecial 2. 1で画像を貼った"セル"をCopy (画像ごと取れる) 3. 目的の位置に、"セル"をPaste (画像ごと貼れる) よく思いついたと褒めてほしいですw
その他の回答 (3)
- ap_2
- ベストアンサー率64% (70/109)
画像Pasteのみ1万回で10秒、処理速度は一定でした 遅くなるものとばかり・・・自分のプログラムも見直しそうかな(--; 「画像が多いとPasteSpecialが遅い」なら、一度他シートで画像化とか 原因箇所&条件が分かれば、工夫の余地もあるかも。 時間測定関数を添付します、いろいろ試してみてください。 Private Declare Function timeGetTime Lib "winmm.dll" () As Long 'イミディエイトウィンドウに時間(ミリ秒)とログを出力 Sub DevLog(str) Static t& Debug.Print Right(" " & timeGetTime() - t, 7) & " : " & str t = timeGetTime() End Sub Sub test() Dim r, c Application.ScreenUpdating = False ActiveSheet.Shapes("Picture 1").Copy DevLog "---> test start" For r = 1 To 100 DevLog "Row = " & r For c = 1 To 100 ActiveSheet.Cells(r, c).Select ActiveSheet.Paste Next Next End Sub
お礼
Function部分でCopyとDelete、 メイン部分でPasteSpecialのみ実施するように変更しています。 一つのバーコードを複数貼り付ける場合があるため、 この方法でも少し速度改善しています。 上記PasteSpecial部分のみコメントアウトすると、 速度は一定で10秒ほどで完了します。 試しに、700枚ほどのバーコード付きの完成したシートに対して、 追加する形でコードを実行したところ、 最初からマクロ実行速度は遅かったです。 やはり、画像が多くなるに連れ処理速度は低下してしまうものなのでしょうか。
- ap_2
- ベストアンサー率64% (70/109)
毎回Addせず、オブジェクトを使い回してみては? Add&Deleteを繰り返すと、内部でどーなっちゃうのか・・・ Sheetsだとファイルサイズが増えていったり、信用できない部分です。 速度に関係なく、避けたい気はします。。 コレクション(~s)は要素数によって徐々に遅くはなるんですが、 700程度じゃ僅かです。描画を止めてるなら、他要因だと思いますよ。
お礼
一度Addしたものをひな形に、 Valueを変更してコピーする方法に変えてみたところ、 半分ぐらいの実行時間に改善されました。 どうもありがとうございます。 それでも700個で120秒ほどかかり、 後半に行くに従い遅くなっていきました。
- nicotinism
- ベストアンサー率70% (1019/1452)
試したわけではないので効果は不明ですが、 ' バーコードを削除 myShp1.Delete Set myShp1 = Nothing Application.cutcopymode = false だとどうでしょ? メモリにゴミが溜まって遅くなっているような気がします。 藪医者の診たてなので、期待しないでください (^^ゞ
お礼
回答有難う御座います。 実行して見ましたが速度改善は見られませんでした。 同シート内にオブジェクトを貼り付け過ぎなのが原因と思われますので明確な改善方法が見つかりません。 でも、回答嬉しかったです。
お礼
引き続きの回答有難う御座います! ご指摘の方法で3倍早くなりました! どういう仕様なんでしょうかね。。。 とりあえず一旦高速化はこれでよしとします。 長いお付き合いありがとうございました!