• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBA グラフが描けない)

エクセルVBAでグラフが描かれない理由と解決法

このQ&Aのポイント
  • エクセルVBAを使用してグラフを描こうとしていますが、動作が安定しません。特に、マクロ実行時にSeriesCollectionメソッドが失敗することがあります。セルの選択状態やデータの範囲などが原因となっている可能性があります。正常終了するためには、以下の点に注意する必要があります。
  • まず、マクロ実行時に空欄のセルが選択されている場合、エラーが発生します。セルの選択範囲を適切に設定することが重要です。また、グラフ描画に使用するデータの範囲も適切に指定する必要があります。
  • さらに、マクロ実行時にグラフ描画用のワークブックが正しく開かれているかも確認してください。ワークブックの名前やシート名などが間違っている場合、エラーが発生する可能性があります。

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

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

「マクロ実行時に空欄のセルが選択されている」→系列(Series)に操作すべきデータがない→データがない系列の操作はできない→エラーになる たとえば、x-yでグラフデータとしては1セットなので、デフォルトではy=1がセットされている(={1})。これを削除する(新しい空のデータ系列にする)とx軸のセットをしようとしてもエラーになる、手動でやってもエラーになりますよね。 ということでしょう。 回避策 Chartの操作をする前に事前になにか1つでもデータを入れるコードを追加する。たとえば0を邪魔にならないところに入れるか、すぐ上書きされてしまうところに入れる。 というようなことか。

noname#154650
質問者

お礼

ありがとうございます。 グラフを描く際にはxdataで列指定するのに、指定以前の初期値に影響されるということでしょうか。 意外でした。

noname#154650
質問者

補足

色々試しましたが、charts.add時にどのセルが選択されてるかが大きく影響するようです。 他回答のSetSourceDataも試しましたが今度はセル空欄時に正常終了します。 回避として、どこかのセル値を変数に代入した後空欄にして、そのままグラフを描いた後セル値を元に戻すことにしました。こんなエラー、どこのURLにも書いてません。

その他の回答 (3)

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

#1です。 あくまで想像ですが、 .SeriesCollection.NewSeries で新しいSeriesCollectionオブジェクトが生成され、これがインデックス1で参照できる訳ですが、 SeriesCollectionオブジェクトが無い状態でいきなり .SeriesCollection(1).XValues =hoge を実行すると、本来オブジェクトが無いというエラーになって然るべきですが、 エクセルが気を利かせて選択されているセルから生成してくれようとし、 選択セルが空だとエラーになるのではないでしょうか。 ご参考まで。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

SetSourceDataでもいいかもしれません。 maxRow=Range("A6500").End(xlUp).Row DSname=ActiveSheet.Name xdata="C1:C" & maxRow ydata="D1:D" & maxRow Charts.Add With ActiveChart .ChartType=xlXYScatter .SetSourceData Source:=Worksheets(DSname).Range(xdata, ydata), PlotBy:=xlColumns .Location Where:=xlLocationAsObject, Name:=DSname End With あとご存知かもしれませんが Charts.Add でグラフシートが作成され、次に .Location Where:=xlLocationAsObject, Name:=DSname でワークシート上に移動しています。 これは無駄な作業になります。 .ChartObjects.Add(.Left, .Top, .Width, .Height) とすれば最初からワークシート上に作成することが出来ます。 ≪参考≫ グラフ操作関連のテクニック http://moug.net/tech/exvba/0021.htm

noname#154650
質問者

お礼

ありがとうございます。 自動マクロを参考にしたため、Charts.addを使用してます。 URLも参考にゆっくり考えてみます。

noname#154650
質問者

補足

.Range(xdata, ydata) セル範囲の指定ですが、並んだC列D列ならばこの方式で可能ですが、例えばX軸:C列、y軸:E列などの場合はどうやって指定するのでしょうか?

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

セルが空かどうかが影響してくる理由は分かりませんが、 .SeriesCollection.NewSeries を付け加えると良い様です。ご参考まで。 Sub test() Dim xdata, ydata, DSname As String Dim maxRow As Long maxRow = Range("A6500").End(xlUp).Row DSname = ActiveSheet.Name xdata = "C1:C" & maxRow ydata = "D1:D" & maxRow Charts.Add With ActiveChart .ChartType = xlXYScatter '下記を加えると良い様です。 .SeriesCollection.NewSeries .SeriesCollection(1).XValues = Worksheets(DSname).Range(xdata) 'この行で動作不安定 .SeriesCollection(1).Values = Worksheets(DSname).Range(ydata) .Location Where:=xlLocationAsObject, Name:=DSname End With End Sub

noname#154650
質問者

お礼

ありがとうございます。 SeriesCollection.NewSeries マクロの自動記録時にはありましたが、不要かと思って削除した覚えがあります。確認します。

関連するQ&A

専門家に質問してみよう