- ベストアンサー
エクセルVBAでグラフが描かれない理由と解決法
- エクセルVBAを使用してグラフを描こうとしていますが、動作が安定しません。特に、マクロ実行時にSeriesCollectionメソッドが失敗することがあります。セルの選択状態やデータの範囲などが原因となっている可能性があります。正常終了するためには、以下の点に注意する必要があります。
- まず、マクロ実行時に空欄のセルが選択されている場合、エラーが発生します。セルの選択範囲を適切に設定することが重要です。また、グラフ描画に使用するデータの範囲も適切に指定する必要があります。
- さらに、マクロ実行時にグラフ描画用のワークブックが正しく開かれているかも確認してください。ワークブックの名前やシート名などが間違っている場合、エラーが発生する可能性があります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「マクロ実行時に空欄のセルが選択されている」→系列(Series)に操作すべきデータがない→データがない系列の操作はできない→エラーになる たとえば、x-yでグラフデータとしては1セットなので、デフォルトではy=1がセットされている(={1})。これを削除する(新しい空のデータ系列にする)とx軸のセットをしようとしてもエラーになる、手動でやってもエラーになりますよね。 ということでしょう。 回避策 Chartの操作をする前に事前になにか1つでもデータを入れるコードを追加する。たとえば0を邪魔にならないところに入れるか、すぐ上書きされてしまうところに入れる。 というようなことか。
その他の回答 (3)
- mitarashi
- ベストアンサー率59% (574/965)
#1です。 あくまで想像ですが、 .SeriesCollection.NewSeries で新しいSeriesCollectionオブジェクトが生成され、これがインデックス1で参照できる訳ですが、 SeriesCollectionオブジェクトが無い状態でいきなり .SeriesCollection(1).XValues =hoge を実行すると、本来オブジェクトが無いというエラーになって然るべきですが、 エクセルが気を利かせて選択されているセルから生成してくれようとし、 選択セルが空だとエラーになるのではないでしょうか。 ご参考まで。
- xls88
- ベストアンサー率56% (669/1189)
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
お礼
ありがとうございます。 自動マクロを参考にしたため、Charts.addを使用してます。 URLも参考にゆっくり考えてみます。
補足
.Range(xdata, ydata) セル範囲の指定ですが、並んだC列D列ならばこの方式で可能ですが、例えばX軸:C列、y軸:E列などの場合はどうやって指定するのでしょうか?
- mitarashi
- ベストアンサー率59% (574/965)
セルが空かどうかが影響してくる理由は分かりませんが、 .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
お礼
ありがとうございます。 SeriesCollection.NewSeries マクロの自動記録時にはありましたが、不要かと思って削除した覚えがあります。確認します。
お礼
ありがとうございます。 グラフを描く際にはxdataで列指定するのに、指定以前の初期値に影響されるということでしょうか。 意外でした。
補足
色々試しましたが、charts.add時にどのセルが選択されてるかが大きく影響するようです。 他回答のSetSourceDataも試しましたが今度はセル空欄時に正常終了します。 回避として、どこかのセル値を変数に代入した後空欄にして、そのままグラフを描いた後セル値を元に戻すことにしました。こんなエラー、どこのURLにも書いてません。