Excel VBA 作成済みのグラフ(Chart)のデータ範囲を変更する

グラフ作成/操作

今回は作成した、もしくはすでに作成済みのグラフのデータ範囲を変更する方法をご説明します。

埋め込み済みのグラフを操作するには、グラフを取得する必要があります。

グラフの取得や、その他グラフ作成方法、詳細設定方法については次の記事をご覧ください。

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プロパティ」を使用して指定しています。

タイトルとURLをコピーしました