今回は作成した、もしくはすでに作成済みのグラフのデータ範囲を変更する方法をご説明します。
埋め込み済みのグラフを操作するには、グラフを取得する必要があります。
グラフの取得や、その他グラフ作成方法、詳細設定方法については次の記事をご覧ください。
- グラフ操作 グラフの作成と詳細設定をする方法
- 折れ線グラフを作成する
- 棒グラフを作成する
- 散布図グラフを作成する
- 円グラフを作成する
- 複合グラフを作成する
- 2軸グラフを作成する
- 複合グラフに2軸設定する方法
- シートに作成済みの埋め込みグラフを取得する
1.グラフの範囲を変更する方法
埋め込み済みのグラフを変更する場合は、方法が2つあります。
「SetSourceData」メソッドでグラフの参照データを変更する方法と、「Formula」プロパティで参照データの数式を変更する方法です。
個人的には「SetSourceData」メソッドで操作する方がシンプルで簡単なため、こちらを使用する事をおすすめします。
次のようなデータとグラフを使用してサンプルコードをご説明します。
2018/01~2018/06までのデータを参照しています。
2.SetSourceDataでグラフ範囲を変更する
「Chart」オブジェクトのSetSourceDataメソッドでグラフのデータ範囲を指定します。
SetSourceDataメソッドで変更する場合は、グラフのデータ範囲をまるごと変更することになります。
上記の図のデータ範囲を2018/12に変更します。
Sub Sample1()
Dim ChartObj As Object
Set ChartObj = ActiveSheet.ChartObjects(1)
With ChartObj.Chart
.SetSourceData Range(Cells(1, 1), Cells(13, 5))
End With
End Sub
「Set ChartObj = ActiveSheet.ChartObjects(1)」でグラフを取得しています。
「Chart」オブジェクトの「.SetSourceData」を変更しています。
3.Formulaでグラフ範囲を変更する
Formulaプロパティでデータ範囲を変更する場合は、それぞれの系列の参照データの範囲を変更する事になります。
系列の参照データは「SeriesCollection」メソッドの参照データを変更します。
SeriesCollectionは「SeriesCollection(1)」の様に、系列の番号で指定して操作する事が出来ます。
下の図のように、各系列はデータ範囲を数式で参照しています。
「.Formula = “=SERIES(項目名,横軸範囲,データ範囲,系列番号)”」で指定します。
この数式の「SERIES」を変更する事で、データの参照範囲を変更できます。
「.Formula = “=SERIES(Sheet1!$D$1,Sheet1!$A$2:$A$7,Sheet1!$D$2:$D$7,3)”」の数式を
「.Formula = “=SERIES(Sheet1!$D$1,Sheet1!$A$2:$A$13,Sheet1!$D$2:$D$13,3)”」のように
項目軸とデータ範囲をそれぞれ変更しています。
Sub Sample3()
Dim ChartObj As Object
Set ChartObj = ActiveSheet.ChartObjects(1)
With ChartObj.Chart.SeriesCollection(3)
.Formula = "=SERIES(Sheet1!$D$1,Sheet1!$A$2:$A$13,Sheet1!$D$2:$D$13,3)"
End With
End Sub
4.ループで全系列のデータ範囲を変更する
項3の変更では系列の3番目しかデータ範囲を変更していません。
ですので、全ての系列を変更するにはループで変更します。
系列の数を取得するには「.SeriesCollection.Count」で取得出来ます。
ここでループする系列ごとにセルの列を変更する必要が出てきます。
そのため、Addressプロパティを使用して引数ExternalにTrueを指定します。引数ExternalにTrueを指定すると、Addressプロパティは、[ブック名]シート名!アドレス という形式になります。
Sub Sample4()
Dim ChartObj As Object
Dim i As Long
Set ChartObj = ActiveSheet.ChartObjects(1)
With ChartObj.Chart
For i = 1 To .SeriesCollection.Count
With .SeriesCollection(i)
.Formula = "=SERIES(" & Cells(1, i + 1).Address(External:=True) & "," & _
Range(Cells(2, 1), Cells(13, 1)).Address(External:=True) & "," & _
Range(Cells(2, i + 1), Cells(13, i + 1)).Address(External:=True) & "," & i & ")"
End With
Next i
End With
End Sub
「For i = 1 To .SeriesCollection.Count」で系列分のループをしています。
「With .SeriesCollection(i)」で取得した系列を操作します。
withの中の数式「=SERIES」で該当セルを「Addressプロパティ」を使用して指定しています。