Excelグラフ作成の遅さについて

このQ&Aのポイント
  • Excelのグラフ作成が遅い問題について質問させていただきます。データ処理やその他の処理は比較的早く終わるのですが、グラフ作成処理が非常に時間がかかってしまいます。具体的には、データ処理やその他の処理が2秒で終わるのに対して、グラフ作成処理だけが1分12秒もかかってしまいます。グラフの数や項目数の増加に伴い、さらに遅くなる傾向があります。このような問題を解決するために、効率的なグラフ作成の方法はありますか?
  • Excelで大量のグラフを作成する際に、グラフ作成処理が非常に遅くなってしまう問題が発生しています。具体的には、14個のグラフを作成する場合には1分12秒もかかってしまいます。この問題を解決するために、より効率的なグラフ作成の方法はありますか?データ処理やその他の処理は比較的早く終わるので、問題は主にグラフ作成処理にあります。可能であれば、より短時間でグラフを作成できる方法を教えていただければ幸いです。
  • Excelのグラフ作成処理が非常に遅いため、問題解決の方法を教えていただきたいです。現在、14個のグラフを作成しているのですが、グラフ作成処理だけが1分12秒もかかってしまいます。この問題の原因は分かりませんが、データ処理やその他の処理は比較的早く終わるため、グラフ作成処理の改善案があれば教えていただきたいです。より効率的にグラフを作成するための方法やテクニックがあるのであれば、ぜひ教えてください。
回答を見る
  • ベストアンサー

Excel グラフ自動作成が遅い VBA

いつもお世話になっております。 今回は、大量のグラフを作る際に動作が異常に遅いため質問させて頂きました。 http://okwave.jp/qa/q8384381.html 下記リンクにあるように、グラフを作成しています。 Function GlaphSetting() 'グラフ色などの設定 Dim C As ChartObject On Error Resume Next For Each C In ActiveSheet.ChartObjects C.Chart.Axes(xlCategory).TickLabels.Orientation = xlVertical '縦書き調整 C.Chart.ChartGroups.GapWidth = 70 '幅を70に C.Chart.ChartArea.Font.Size = 9 '全部のフォントサイズ C.Chart.PlotArea.Interior.ColorIndex = xlNone 'プロットエリア色なし C.Chart.PlotArea.Border.ColorIndex = xlNone '枠線なし C.Chart.Axes(xlValue).HasMajorGridlines = False 'メモリ見えなくする C.Chart.Axes(xlValue).MinimumScale = 0 'メモリ最小値 Next End Function 実行すると、データ量により物凄く遅くなります。 (グラフの数は14、項目数52)※今のところの最大量 実行すると、5分程度はかかるでしょうか・・・ ためしにメッセージボックスを使い、 ストップウォッチで計ってみました。 データ処理     :2秒 その他の処理   :2秒 グラフ作成処理  :1分12秒 グラフの編集    :4秒 でした。 グラフの作成処理をどうにか早くできないでしょうか? 回答よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.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 とする必要がありました。

satoron666
質問者

お礼

回答ありがとうございます! わざわざ確認作業までして頂き、ありがとうございます。 今はWindows7の2.6GHzを使用していますが、 やはり仕方の無いことなのですね… ありがとうございました!

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です 言葉足らずでした。 「カメラ」機能を用いた別のワークブックを同時に開いているだけでも、VBAの実行が遅くなる事があるそうです。 ご参考まで。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

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

satoron666
質問者

補足

回答ありがとうございます! カメラ機能というものは、使ったことがありません。 (使い方すら知りません) 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列目部分を データラベルとして表示したいのです。 どう変更したら、時間がかからなくなるでしょうか?

関連するQ&A

  • VBA 全グラフに適応されない理由

    お世話になっております。 Excel2003を使用しております。 1400個のグラフを自動作成しております。 -------------------------------- Function GlaphSetting() 'グラフ色などの設定 Dim C As ChartObject On Error Resume Next For Each C In ActiveSheet.ChartObjects ' C.RoundedCorners = True C.Chart.AutoScaling = False C.Chart.PlotArea.Interior.ColorIndex = xlNone C.Chart.PlotArea.Border.ColorIndex = xlNone 'プロットエリアの色を消す C.Chart.Axes(xlValue).MaximumScale = 5 'メモリ最大値 C.Chart.Axes(xlValue).MinimumScale = 0 'メモリ最小値 C.Chart.Axes(xlValue).MajorUnit = 1 'メモリ間隔 If ComboBox4.Text <> "" Then '氏名が入ってると、メモリ-1にしたい! C.Chart.Axes(xlValue).MinimumScale = -1 'メモリ最小値 C.Chart.PlotArea.Top = 50 C.Chart.PlotArea.Width = 100 C.Chart.PlotArea.Height = 100 C.Chart.PlotArea.Left = 50 End If If ComboBox4.Text = "" Then '氏名が空のとき C.Chart.Axes(xlValue).HasMajorGridlines = False End If C.Chart.ChartArea.Font.Size = 8 '全部のフォントサイズ Next End Function ---------------------------- 上記方法でフォントサイズの設定等を行っているのですが、 全グラフの文字サイズが8になっていなく、 ActiveSheet.ChartObjectsの個数は制限があるのか?なんて思っております。 間にプログレスバーの表示を行っておりますが、 しっかり全部動いているみたいであり、 1400個中、33個目くらいまでしか フォントサイズが変わっておりません。 ステップインで確認してみましたが、 ステップインだと33個以上も大丈夫な気がします。 何か、理由をご存知の方がいらっしゃいましたら 回答をお願い致します。

  • 新しいグラフを作成すると、既存グラフが新しいグラフと同一になってしまう。

    Excel2003のVBAにて次のマクロを作成し、実行したところ、 新しいグラフを作成すると、既存グラフが新しいグラフと同一になってしまいます。 グラフは月度毎に作成します。 1月度のグラフを作成すると、 11月度のグラフ・12月度のグラフが、1月度のグラフと同じものになってしまいます。 マクロ作成時には、グラフ要素データの変化が小さく気が付かなかったのですが、グラフ要素データの変化が大きくなった時点で気が付きました。 解決方法をご存じの方、是非ともご教授願います。 'A:グラフを作成するシートの番号 'Sheets("Positions"):グラフを作成する位置データ保管庫 'L,T,W,H:グラフの位置データ(グラフを作成する都度指定) 'E:グラフ要素仕訳標 'F:作成したグラフの名前の保管場所標(グラフ要素変更時にグラフを更新するため)   Sheets(A).Select NN = Sheets(A).Name With Sheets(A).ChartObjects.Add(L, T, W, H)'L .Chart.ChartType = xlDoughnut If E = 0 Then .Chart.SetSourceData Source:=Sheets("Positions").Range("Q1:Q11"), PlotBy:=xlColumns Else .Chart.SetSourceData Source:=Sheets("Positions").Range("R1:R11"), PlotBy:=xlColumns End If .Chart.Location Where:=xlLocationAsObject, Name:=NN .Chart.HasTitle = False .Chart.HasLegend = False .Chart.ChartArea.Border.LineStyle = 0 .Chart.ChartArea.Interior.ColorIndex = xlNone .Chart.PlotArea.Border.LineStyle = xlNone .Chart.PlotArea.Interior.ColorIndex = xlNone End With R = Sheets(A).ChartObjects.Count Sheets("Positions").Cells(F, 3) = Sheets(A).ChartObjects(R).Name

  • Excelでのグラフ作成用マクロについて。

    「新しいマクロを記録する」でグラフ作成用のマクロを作りました。 内容は、 1.sheet1のBC列を散布図でsheet2に出力。(4つほど別々のグラフを作成) 2.プロットエリアの拡大 3.図の位置調整・図の大きさ調整。(4つが重ならないように) というものです。 一応出来たのですが、何故か選択列を変更して(マクロ内の列選択を変更)出力・プロットエリア拡大までは出来るのですが、3が出来ません。 それで、分からないなりにマクロ内を覗いてみたところ、図の位置を調整する際に、対象となる図が ActiveSheet.Shapes("グラフ 17").IncrementLeft -177.75 などと言うように、グラフ17を参照してしまっているためにうまく動かないのだと思いました。 (そもそも、名前なんて付けていないはず・・・と思って調べていたら、どうやら「グラフウインドウ」で見ることが出来る名前を参照しているようでした。) いっそのこと、グラフをクリック・ドラッグで移動させるのではなく、出力する際に整然と並ぶように設定したいです。どうすればよいでしょう? 一応、作成したものを載せておきます。 ・1~2 Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B1:C32158"), _ PlotBy:=xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet2" With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "mass" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "counts" End With ActiveChart.HasLegend = False ActiveChart.PlotArea.Select With Selection.Interior .ColorIndex = 2 .Pattern = xlSolid End With Selection.Top = 1 Selection.Width = 323 Selection.Height = 180 Selection.Left = 15 Selection.Width = 334 Selection.Height = 194 ActiveChart.Axes(xlCategory).Select With ActiveChart.Axes(xlCategory) .MinimumScale = 0 .MaximumScale = 50 .MinorUnitIsAuto = True .MajorUnit = 5 .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone End With End Sub 3. ActiveSheet.Shapes("グラフ 17").IncrementLeft -182.25 ActiveSheet.Shapes("グラフ 17").IncrementTop -105.75 End Sub

  • Excelでのグラフ作成用マクロについて

    Excelで、グラフ作成をするマクロを作りました。 sheet1のBC列選択→sheet2に出力→プロットエリア拡大まではうまくいったのですが、肝心の「図の位置調整・サイズ調整」が出来ませんでした。 中身を見たところ、「グラフ12」とかいう名前が勝手についていたらしく、何回やってもその名前を変更することが出来ませんでした。 参照する列を変更してグラフを作成しようとすると、次のグラフが「グラフ13」となってしまい、図の位置調整のところでエラーになります。 マクロは次のようなものなのですが、どうすれば「グラフ12」ではなく、「先ほど作ったばかりのグラフ」を参照してくれるのでしょうか? グラフ12という部分に任意の名前さえつけられれば、何とかなりそうなのですが・・・ グラフ12というものは、「グラフウインドウ」で見られるもののようです。 Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B1:C32158"), _ PlotBy:=xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet3" With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With ActiveSheet.Shapes("グラフ 12").IncrementLeft -182.25 ActiveSheet.Shapes("グラフ 12").IncrementTop -105.75 ActiveSheet.Shapes("グラフ 12").ScaleWidth 1.48, msoFalse, msoScaleFromTopLeft ActiveSheet.Shapes("グラフ 12").ScaleHeight 1.21, msoFalse, msoScaleFromTopLeft ActiveChart.Axes(xlCategory).Select ActiveChart.Axes(xlValue).MajorGridlines.Select ActiveChart.PlotArea.Select Selection.Top = 1 Selection.Width = 526 Selection.Height = 242 End Sub

  • 自動グラフ作成マクロの作り方に関してアドバイスを下さい

    Sub Macro4() For i = 4 To 8 Charts.Add ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=zero!R13C1:R1013C1" ActiveChart.SeriesCollection(1).Values = "=zero!R13C" & i & ":R1013C" & i ActiveChart.SeriesCollection(1).Name = "=zero!R12C" & i ActiveChart.Location Where:=xlLocationAsNewSheet With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "x axis" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "y axis" End With Next End Sub これはzeroというシートから自動的に複数のグラフを作成するマクロなのですが、 これを現在選択しているシートにするためにはどうすれば良いのでしょうか? それと作成するグラフの名称を自分で設定したセルの内容にしたいのですが、 どうすれば良いのでしょうか? よろしくお願い致します。

  • [VBA]グラフを作りたいです!(^-^v

    教えて下さい。 テキストファイルの内容を元に自動的グラフを作りたいです。 【C:\Temp\data.csv】の中身 ----------------------------------- 1回目,10.50% 2回目,30.45% 3回目,70.45% ----------------------------------- 横軸には「n回目」の文字列を、縦軸には「n%」数値を入れたいです。 なんとか静的にグラフを作ることは出来ましたが、これを自動化したいと思っています。 【サンプルvba】 ----------------------------------- Private Const LOGFILE = "C:\Temp\data.csv" Private Sub CommandButton1_Click() ' グラフオブジェクト作成(位置,サイズ) With Sheet1.ChartObjects.Add(10, 50, 400, 150).Chart .ChartType = xlLine ' 折れ線グラフ .Axes(xlValue).MaximumScale = 100 ' 縦軸最大値 .Axes(xlValue).MinimumScale = 0 ' 縦軸最小値 ' グラフデータ内容 With .SeriesCollection.NewSeries ' グラフ名 .Name = "テスト" ' 縦軸 (ここに%数値を入れたい) .Values = "={10.50,30.45,70.45}" ' 横軸 (ここに回数を入れたい) .XValues = "={""1回目"",""2回目"",""3回目""}" End With End With End Sub ----------------------------------- テキストファイルの内容は一定間隔で更新されるため自動的に取り込みたいです。 すいませんがよろしくおねがいします、、。(T▽T)ノ

  • エクセルVBAのグラフに関することです!助けてください!

    先日にも質問させていただいているのですが、ブック内のシート全てにグラフがあります。そのグラフの大きさを統一したいのですが、初心者でなかなかうまくいかず、どこをどのようにかえたらいいかもわかりません。サイトをみて参考に作ってみたマクロでは、一枚のシートだけうまく表示されてしまいます。私のような素人にどなたか教えていただけないでしょうか。。たいへん困っています。 Sub グラフ1() Dim ws As Variant Const MYRNG As String = ("a11:a58,d11:g58") 'データ範囲 For Each ws In ActiveWorkbook.Worksheets Charts.Add With ActiveChart .ChartType = xlXYScatterLines .SetSourceData Source:=ws.Range(MYRNG), _ PlotBy:=xlColumns .Location Where:=xlLocationAsObject, Name:=ws.Name End With With ActiveChart.PlotArea '仕切りなおし With .Border .ColorIndex = 16 .Weight = xlThin .LineStyle = xlContinuous End With .Interior.ColorIndex = xlNone End With Next ws End Sub

  • ExcelのVBAについて(グラフ操作)

    現在、会社の端末がOffice2010と2003が混在している状態にあります。今のところ2003で作成されたファイルがほとんどです。 そこで問題が出てきたのですが、2003で作成したBookに埋め込みグラフとそれを操作するVBAがあり、そのVBAを2010のインストールされた端末で実行するとエラーが出てしまいます。コードは以下の通りです。 エラーの内容は、「'MinimumScale'メソッドは失敗しました: 'Axis'オブジェクト」 となります。Withの中すべてで同様のエラーが出ます。 ・ ・ ・ With ActiveChart.Axes(xlValue) .MinimumScale = 0 .MaximumScale = Data '事前に計算した値 .MinorUnitIsAuto = True .MajorUnitIsAuto = True .Crosses = xlAutomatic .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone End With ・ ・ ・ 理由がよくわからなかったので、2010で同様のグラフを作成し、上記の操作をマクロに記録したところ、同様のコードが記録されました。 グラフ自体が2003と2010では違うものなのでしょうか? 解決方法がありましたら教えていただきたいです。

  • Excel2003マクロ(グラフ)が2007エラー

    お世話になります。 Excel2003で作成したマクロ(グラフの縦軸を調整)が2007でエラーになり困っています。 マクロは既に作成されているグラフの縦軸の最大値、最小値、目盛間隔を変更するものです。 マクロの記録を元に作成しました。 ActiveSheet.ChartObjects("lv" & chart_count).Activate (ここまではエラーにならず、グラフが選択された状態になりました。) With ActiveChart.Axes(xlValue) ←この行でエラーになります .MinimumScale = lower_limit .MaximumScale = upper_limit .MinorUnitIsAuto = True .MajorUnit = interval .Crosses = xlCustom .CrossesAt = lower_limit   .ReversePlotOrder = False .ScaleType = xlLinear .DisplayUnit = xlNone End With 2007でもマクロの記録をして、何も変更せずに実行してみたのですが ActiveChart.Axes(xlValue).select のところでエラーになりました。 何も変更せず、記録したまま実行してもエラーになるので、何が悪いのか全く分からず困っています。 どなたかマクロに詳しい方、教えて頂けませんでしょうか。

  • EXCEL VBA:埋め込みグラフオブジェクトの命名方法について (続き1)

    http://oshiete1.goo.ne.jp/qa3258443.html の質問の続きです。 ------------------------------------------------------------- Sub sample() Dim myRange As Range Set myRange = Range("A1:D2") With Worksheets("Sheet1").ChartObjects.Add(50, 50, 300, 200).Chart .ChartType = xlPie .SetSourceData Source:=myRange, PlotBy:=xlRows .ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent, LegendKey:=False, HasLeaderLines:=True End With End Sub ------------------------------------------------------------- この手法でグラフ作成した場合について、 1. グラフ作成時に以下と同じように NumberFormatLocal を設定する方法はありますか? (通常の記述例) ActiveChart.SeriesCollection(1).DataLabels.Select Selection.NumberFormatLocal = "0.0%" といいますのは、現在作成しているマクロはユーザーの操作によっては 円グラフと棒グラフが順不同に作成される場合があり、 SeriesCollection の INDEX番号 が分からない場合があるためです。 または、グラフの名前等を指定することなどにより、 SeriesCollection の INDEX番号 を取得する事が可能でしたら その方法を教えて頂きたいのですが・・・。 2. 同じく、グラフ作成時にデータラベルのフォントを設定する方法はありますか? (通常の記述例) With Selection.Font .Name = "MS Pゴシック" .Size = 10 End With 3. 同じく、横棒グラフ作成時に、以下と同じ事はできますか? '反転 ActiveChart.Axes(xlCategory).Crosses = xlMaximum ActiveChart.Axes(xlCategory).ReversePlotOrder = True '横軸100% ActiveChart.Axes(xlValue).MaximumScale = 1 以上、何卒ご教授のほど、よろしくお願い致します。

専門家に質問してみよう