VBA

VBAのグラフで使用するChartObjectsとShapesを整理してみました。

記事内に商品プロモーションを含む場合があります
このページでわかること

グラフを作る基本的な操作がわかります。

覚えること
  1. Shapesはグラフを含む図全体。ChartObjectsはグラフのみ
  2. グラフ追加は
    Shapes:Shapes.AddChart
    ChartObjects:ChartObjects.Add(左の位置,上の位置,横幅,高さ)←引数省略不可

グラフはオブジェクトの構造が難しい

例えばブックなら
workbookオブジェクト→Worksheetオブジェクト→Rangeオブジェクト
という感じで大きい範囲からだんだん小さく絞っていく様子がわかると思います。
また、これらは視覚的にも分かりやすいので迷うことはないと思います。

グラフはちょっと複雑です。
シートの図形はShapesコレクションが包括的に扱っているのですが、
例えばグラフを一個作成した場合、
Shapes(1)でグラフを取得することが出来ます。
ところが同じグラフをChartObjects(1)でも扱うことが出来ます。

また
ShapesとChartObjectsでは同じようなメソッドが微妙に違うコマンドになっていたり
(グラフの追加はShapes.AddChart、ChartObjects.Addとちょっと違う…)

このあたりがとてもややこしく、グラフを扱うのを敬遠する方が多い理由ではないでしょうか。

でも整理するととっても簡単だということがわかりました。

グラフのオブジェクトはこういう構造だ!

イメージを書きました。

実験してみます。
オートシェイプから楕円の図形とグラフを一つずつ作りました。
このシート内にShapesは何個、ChartObjectsは何個あるのか数えてみました。

Sub shapesとchartobjects()

Debug.Print ActiveSheet.Shapes.Count
Debug.Print ActiveSheet.ChartObjects.Count

End Sub
Shapesだと図形すべて。ChartObjectsだとグラフだけ。

Shapesコレクションはグラフも含め図形全てを扱えます。
一方、ChartObjectsコレクションはグラフのみの取扱です。

注意するべき点

階層構造はShapes→ChartObjectsではありません。
Shapes.ChartObjects(1)はエラーです。

上段にも書きましたが、メソッドも若干違います。
Shapes.addChartはありますが、
ChartObjects.addChartはありません。
変わりにChartObjects.addです。
名前ややこしいですね!
どうせならChartObjectsとShapesは扱うオブジェクトを全く別にして
すみ分ければいいのに!!

名前だけでなく、 Shapes.addChart は引数省略してもエラーでませんが、
ChartObjects.add は引数(位置と大きさ)を省略できません。

っもう!!

Shapesを使ったグラフの作り方

ShapesとChartObjectsの関係性わかりましたでしょうか。
最後にそれぞれでグラフを作って見ます。

Sub Shapesコレクション()

ActiveSheet.Shapes.AddChart
ActiveSheet.Shapes(1).Chart.ChartType = xlPie
ActiveSheet.Shapes(1).Chart.SetSourceData Range("A1:C25")

End Sub

ChartObjectsを使ったグラフの作り方

Sub ChartObjectsコレクション()

ActiveSheet.ChartObjects.Add 50, 400, 700, 400
ActiveSheet.ChartObjects(1).Chart.ChartType = xlPie
ActiveSheet.ChartObjects(1).Chart.SetSourceData Range("A1:C25")

End Sub

基本同じだけどちょっと違いますね。
結果としてはどちらも同じようなものができますね。

まとめ

いかがでしょうか。

マニアックな内容かも知れませんが、結構重要なことだと思い、記事にしました。

  • Shapesはグラフを含む図全体。ChartObjectsはグラフのみ
  • グラフ追加は
    Shapes:Shapes.AddChart
    ChartObjects:ChartObjects.Add(左の位置,上の位置,横幅,高さ)←引数省略不可
  • どちらでもグラフ作れます。

では、どちらを使えばよいでしょうか。
グラフの作り方を検索するとShapesを使ってグラフを作成し、ChartObjectsを使って編集しているブログが多いかと思います。
パイオニアの方がそちらで先ずブログ作って他の人がそれで学習したからじゃないかと推測しています。

私は案外、ChartObjectsありじゃないかと思っています。
いくつか理由がありますが、

  • 先ず名称がChartObjectsというので、グラフと連想しやすく、覚えやすい。
  • どちらか一方で作るようにしたほうが理解しやすい。
  • オートシェイプ等を扱っていた際、何かの拍子でそちらを操作したり、エラーを起こしたりする危険性をさけることができる。
    (実際に私もこの記事を作るとき色々実験しましたが、図がすごい邪魔をしてきました。)

ChartObjectsは引数必須で面倒ですが、やっつけで作るマクロでない限り
どうせ生成位置は指定すると思います。

ShapesもいいけどChartObjectsもいいよって記事でした。

ではでは。