Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7631 / 13645 ツリー ←次へ | 前へ→

【37856】シートのコピーの高速化 Jun 06/5/21(日) 1:27 質問[未読]
【37864】Re:シートのコピーの高速化 Kein 06/5/21(日) 15:19 回答[未読]

【37856】シートのコピーの高速化
質問  Jun  - 06/5/21(日) 1:27 -

引用なし
パスワード
   こんばんわ。
さて、シートのコピーの高速化について質問なのですが、
『雛形となるシートをコピーし、コピーしたシートを編集する』という
作業を繰り返すマクロを作っています。そのとき、雛形になるシートに
グラフが多用されており、シートのコピーに非常に時間がかかっています。
対策として
 ・マクロ実行中の再描画をやめる(Application.ScreenUpdating = False)
 ・マクロ実行中は、再計算を「自動」から「手動」に切り替える
をマクロに組み込んだんですが飛躍的な改善がありません・・・・(ToT)

どなたか、いい方法やアドバイスがあれば教えてください。
  

【37864】Re:シートのコピーの高速化
回答  Kein  - 06/5/21(日) 15:19 -

引用なし
パスワード
   グラフを Copy するのでなく、Duplicate した方が処理は速くなります。
以下のようなコードでテストしてみて下さい。

Sub MySheet_Copy()
  Dim Sh As Worksheet, Sh2 As Worksheet
  Dim Ch As ChartObject
  Dim Se As Series
  Dim Fom As String, Nm1 As String, Nm2 As String
 
  Application.ScreenUpdating = False
  Set Sh = ActiveSheet
  Set Sh2 = Worksheets.Add(After:=Sh)
  Nm1 = Sh.Name: Nm2 = Sh2.Name
  Sh.Cells.Copy Sh2.Range("A1")
  If Sh.ChartObjects.Count = 0 Then GoTo ELine
  For Each Ch In Sh.ChartObjects
   Ch.Duplicate.Chart.Location xlLocationAsObject, Nm2
  Next
  For Each Ch In Sh2.ChartObjects
   For Each Se In Ch.Chart.SeriesCollection
     Fom = Se.Formula
     Se.Formula = Replace(Fom, Nm1, Nm2)
   Next
  Next
ELine:
  Sh2.Range("A1").Select
  Set Sh = Nothing: Set Sh2 = Nothing
  Application.ScreenUpdating = True
End Sub

新規シートに移動した ChartObject に対して、最初のループの中に
系列の数式を置換するループをネストしてしまえば、もっと効率良く
なりそうな気がしますが、それだとなぜかコピー元のシートのセル
範囲をリンクしたままになっているので、あらためてコピー先シート
のセル範囲を参照するように、コピー先シート内の ChartObject を
ループしています。ただ、そのような回りくどいコードになっても、
単純なグラフのコピーより速いはずです。

7631 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free