- ベストアンサー
Excelグラフ作成の遅さについて
- Excelのグラフ作成が遅い問題について質問させていただきます。データ処理やその他の処理は比較的早く終わるのですが、グラフ作成処理が非常に時間がかかってしまいます。具体的には、データ処理やその他の処理が2秒で終わるのに対して、グラフ作成処理だけが1分12秒もかかってしまいます。グラフの数や項目数の増加に伴い、さらに遅くなる傾向があります。このような問題を解決するために、効率的なグラフ作成の方法はありますか?
- Excelで大量のグラフを作成する際に、グラフ作成処理が非常に遅くなってしまう問題が発生しています。具体的には、14個のグラフを作成する場合には1分12秒もかかってしまいます。この問題を解決するために、より効率的なグラフ作成の方法はありますか?データ処理やその他の処理は比較的早く終わるので、問題は主にグラフ作成処理にあります。可能であれば、より短時間でグラフを作成できる方法を教えていただければ幸いです。
- Excelのグラフ作成処理が非常に遅いため、問題解決の方法を教えていただきたいです。現在、14個のグラフを作成しているのですが、グラフ作成処理だけが1分12秒もかかってしまいます。この問題の原因は分かりませんが、データ処理やその他の処理は比較的早く終わるため、グラフ作成処理の改善案があれば教えていただきたいです。より効率的にグラフを作成するための方法やテクニックがあるのであれば、ぜひ教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 古いWinXPのノートを引っ張り出してやってみました。 PentiumM 1.3GHzで2003年発売のものです。xl2000です。 結論から言うと再現されました。 DataLabelを生かしたとき。 グラフ作成 146.841sec グラフ修飾 3.635sec DataLabel設定をコメントアウトしたとき グラフ作成 3.815sec グラフ修飾 0.521sec .DataLabel.Text = myRange.Columns(3).Cells(i).Valueのところをセルアクセスでなく、Variant配列に入れてやってみましたが、1秒強くらい速くなっただけで焼け石に水でした。 申し訳ありませんが、昔のシステムにとっては重い処理らしいので時間がかかるのは仕方がないとしか言えません。 なお、今となってはあまり役に立たない情報ですが、xl2000では .ApplyDataLabels ShowValue:=True がエラーとなり、単に .ApplyDataLabels とする必要がありました。
その他の回答 (2)
- mitarashi
- ベストアンサー率59% (574/965)
#1です 言葉足らずでした。 「カメラ」機能を用いた別のワークブックを同時に開いているだけでも、VBAの実行が遅くなる事があるそうです。 ご参考まで。
- mitarashi
- ベストアンサー率59% (574/965)
1.下記のコードを試してみました。 http://okwave.jp/qa/q8384381.html GraphMakeの最後に、GlaphSettingも実行させて、それぞれの段階でWindowsAPIのGetTickCountで計測しています。 乱数で、Max100要素のデータを26個分生成して試験しました。試験データ作成コードは後に載せます。 当方の環境はCore i5-3470 CPU 3.20GHz、xl2010です。 グラフ作成 4.446 秒 ← 分の間違いではありません、秒です グラフ設定 0.031秒 最初に Application.ScreenUpdating = False、最後にApplication.ScreenUpdating = Trueを入れた場合 グラフ作成 0.39 秒 グラフ設定 0.016 秒 ただ、Application.ScreenUpdating = Trueにした後の画面描画に数秒かかります。 という訳でたとえ数年前のPCであっても数分もかかるとは思えません。 「カメラ」機能を用いていると、VBAの実行が著しく遅くなる現象が発生するそうですが、該当しませんか? あるいは、膨大な数式が入っていて、ソーティング後に再計算がかかって時間を食ったりしていませんか? ご検討下さい。 2.リンク先のコードで気付いた点 ・C列でのtargetRangeのソーティングは、下記の一行で良いと思います。 targetRange.Sort key1:=targetRange.Range("C1"), order1:=xlAscending ・For Each myArea In dataRange.SpecialCells(xlCellTypeConstants).Areasのループ中で、graphColumnsを変化させておかしな事になりませんか。 3.試験データ生成コード Sub makeTestData() Dim i As Long, j As Long, dataCount As Long Dim mycell As Range Dim myCollection As Collection Dim pickUp As Long 'Collectionにアルファベット大文字26文字を収納 Set myCollection = New Collection For i = 1 To 26 myCollection.Add Item:=Chr(64 + i) Next i Randomize Time ThisWorkbook.Sheets(1).Cells.Clear Set mycell = ThisWorkbook.Sheets(1).Range("A1") For i = 1 To 26 ' pickUp = Int(Rnd() * myCollection.Count) + 1 mycell.Value = myCollection(pickUp) myCollection.Remove pickUp Set mycell = mycell.Offset(1, 0) dataCount = Int(100 * Rnd()) + 1 For j = 1 To dataCount mycell.Value = j mycell.Offset(0, 1).Value = 20 * Rnd mycell.Offset(0, 2).Value = Chr(65 + Int(Rnd() * 26)) Set mycell = mycell.Offset(1, 0) Next j Set mycell = mycell.Offset(1, 0) Next i End Sub
補足
回答ありがとうございます! カメラ機能というものは、使ったことがありません。 (使い方すら知りません) Application.ScreenUpdating=False に設定してあります。 もうリンクの所は削除してしまったのですが、 グラフを作る際に '======================-- Sub makeGraph(myRange As Range, myChartObj As ChartObject) Dim mySeries As Series Dim i As Long With myChartObj.Chart Set mySeries = .SeriesCollection.NewSeries mySeries.XValues = myRange.Columns(1) mySeries.Values = myRange.Columns(2) .ChartType = xlColumnClustered .HasTitle = True .HasLegend = False .ChartTitle.Text = myRange.Cells(1).Item(0).Value .ApplyDataLabels ShowValue:=True End With For i = 1 To mySeries.Points.Count With mySeries.Points(i) .HasDataLabel = True .DataLabel.Text = myRange.Columns(3).Cells(i).Value End With Next i End Sub '======================-- (内側上にデータラベルはあとから追加しました。) 上記の方法を使っていましたが、 For i = 1 To mySeries.Points.Count With mySeries.Points(i) .HasDataLabel = True .DataLabel.Text = myRange.Columns(3).Cells(i).Value End With Next i 上記部分がとても時間がかかっている事がわかりました。 これをコメントアウトすると、 時間が4分の1以下になり、重くならずにすみました。 上記部分でやりたいことは、 targetrangeの3列目部分を データラベルとして表示したいのです。 どう変更したら、時間がかからなくなるでしょうか?
お礼
回答ありがとうございます! わざわざ確認作業までして頂き、ありがとうございます。 今はWindows7の2.6GHzを使用していますが、 やはり仕方の無いことなのですね… ありがとうございました!