[Excel]VBAで重ね合わせインライングラフを作成する - FB post for mutter

[Excel]VBAで重ね合わせインライングラフを作成する

| コメント(0) | トラックバック(0)

ExcelのVBAでグラフを作成する作業を続けています。懸案の1つだった、重ね合わせグラフの作り方がなくとなく分かって来たので、記事にします。

基本的な仕様は、

[Excel]VBAでインライングラフを作成する
[Excel]VBAでインライングラフを作成する2

で紹介した物と同じです。前記の例では1つのグラフエリアに1つのグラフをプロットする単純なグラフ作成を行っていましたが、今回は1つのグラフエリアに3つのグラフ(全て、同じ形式のグラフです。)を重ね合わせて表示させる。と言うパターンです。

このパターンで解決しなければならない事は、

  • 1つのグラフエリアへ複数のデータソースをどの様に渡すのか。
  • X軸, Y軸を配列的に渡せないパターン(X軸とY軸に相当するカラムが離れている)で、どの様にデータを指定するのか。
  • 重ね合わせグラフをどの様に指定するのか。

まずは、短絡的に『マクロの記録』を使って手動で重ね合わせグラフを作成した時に作成されるマクロソースを取得してみました。
そのソースを基に、データシートと同じシートへ、セルに併せてグラフが作れれば良い訳です。

完成版

先ずは完成版です。A~F列がデータです。Cカラムには祝日判定の結果が入っています。祝日判定の結果はA, B列に条件付き書式を行うためだけに使っているので、非表示にしてあります。

データ1~データ3は適当に入力しました。意味はありませんので、適当なテストデータを作成して頂いて問題ありません。

まず、完成版のExcel画面です。

完成版のExcel画面

グラフ部分です。

グラフ部分

念のために使用したデータを掲載します。

データ1 データ2 データ3
105 120 94
124 94 74
99 108 104
104 128 123
122 141 144
134 89 97
90 102 114
104 114 87
117 124 104
122 128 98
121 131 111
104 112 124
108 128 118
101 98 99
98 94 108
90 87 92
94 101 89
97 108 114
101 114 128
107 108 109
112 120 94
114 124 78
121 114 124
118 100 108
104 97 108
100 111 89
109 90 94
94 108 124


当然、このデータを使用しないとならない訳ではありません。

完成版のソース

完成版のソースを示します。

Sub NewGraph1
    ' グラフの削除
    Dim i As Long
    For i = ActiveSheet.ChartObjects.Count To 1 Step -1
         ActiveSheet.ChartObjects(i).Delete
    Next i

    ' グラフエリア確保
    ActiveSheet.Shapes.AddChart.Select

    ' 折れ線グラフをつくる
    ActiveChart.ChartType = xlLine

    ' グラフは、J2~O22 の範囲に入れる
    ActiveChart.Parent.Top = ActiveSheet.Range("Sheet1!J2:O22").Top
    ActiveChart.Parent.Left = ActiveSheet.Range("Sheet1!J2:O22").Left
    ActiveChart.Parent.Height = ActiveSheet.Range("Sheet1!J2:O22").Height
    ActiveChart.Parent.Width = ActiveSheet.Range("Sheet1!J2:O22").Width

    ' データ1のグラフ
    ' データを取得するシートを明示する必要がある
    ActiveChart.SetSourceData Source:=Range("Sheet1!D2:D29")
    ActiveChart.FullSeriesCollection(1).Name = "=""データ1"""
    ActiveChart.FullSeriesCollection(1).XValues = "=Sheet1!A2:A29"

    ' データ2を重ね合わせて作成
    ' データを取得するシートを明示する必要がある
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.FullSeriesCollection(2).Name = "=""データ2"""
    ActiveChart.FullSeriesCollection(2).Values = "=Sheet1!E2:E29"

    ' データ3を重ね合わせて作成
    ' データを取得するシートを明示する必要がある
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.FullSeriesCollection(3).Name = "=""データ3"""
    ActiveChart.FullSeriesCollection(3).Values = "=Sheet1!F2:F29"

    ' カーソルをA1へ移動
    Range("A1").Select
End Sub

シート上にある、[グラフ作成]ボタンが押されると、このマクロが起動する様に設定してテストを行いました。
次に、ポイントを説明して行きます

グラフの削除

重ね合わせグラフを作成すると、重ねたグラフの数分のグラフオブジェクトが出来上がる様です。
そのため、1つづつグラフオブジェクトを指定して削除する必要があります。

Dim i As Long
For i = ActiveSheet.ChartObjects.Count To 1 Step -1
     ActiveSheet.ChartObjects(i).Delete
Next i

ActiveSheet.ChartObjects.Countでグラフオブジェクトの数を取り出し、ループして削除しているだけです。
重ね合わせグラフだけではなく、シート上に複数のグラフを作成した場合も、本来この方法で削除するべきの様です。
当然、グラフを1つだけ配置した場合も、この方法で削除可能です。

グラフエリア確保

ActiveSheet.Shapes.AddChart.Select

単純なグラフを作成した時と全く同じです。

グラフの種類を指定

ActiveChart.ChartType = xlLine

今回は、折れ線グラフを使います。

グラフの設置場所

ActiveChart.Parent.Top = ActiveSheet.Range("Sheet1!J2:O22").Top
ActiveChart.Parent.Left = ActiveSheet.Range("Sheet1!J2:O22").Left
ActiveChart.Parent.Height = ActiveSheet.Range("Sheet1!J2:O22").Height
ActiveChart.Parent.Width = ActiveSheet.Range("Sheet1!J2:O22").Width

単純なグラフを作成した時と全く同じです。

1つの目データの場所を指定する

ここからが大切なポイントです。

ActiveChart.SetSourceData Source:=Range("Sheet1!D2:D29")

基本的には、単純なグラフを作成する場合と同じです。 ただし、データを取得するシートを明示しないとエラーになる様です。
マクロ記録では、$D$2:$D$29 の様に絶対指定がされていましたが、上記の様に相対指定でも問題はありませんでした。

1つの目データ名の指定

データ軸の名称を指定するための指定です。

ActiveChart.FullSeriesCollection(1).Name = "=""データ1"""

FullSeriesCollection(1)は1番目のグラフを指定する物です。<

横軸の指定

横軸のデータエリアの指定です。A列の日付を指定しています。

ActiveChart.FullSeriesCollection(1).XValues = "=Sheet1!A2:A29"

X軸の値なので、XValuesなのですね。
FullSeriesCollection(1)に対して設定していますが、他のグラフで指定しても問題は無いようです。マクロ記録ではFullSeriesCollection(3)に指定されていました。
X軸の値は、各グラフへ指定する必要はありません。この辺りは、Excelの画面で重ね合わせグラフを作成する時の要領と同じですね。

次のグラフ作成開始

ActiveChart.SeriesCollection.NewSeries

SeriesCollectionに対して、NewSeriesを指定すると、次のグラフ開始の指示を示す事ができる様です。
この指定が、重ね合わせグラフのポイントらしいです。

2つ目のグラフの情報を指定する

ActiveChart.FullSeriesCollection(2).Name = "=""データ2"""
ActiveChart.FullSeriesCollection(2).Values = "=Sheet1!E2:E29"

項目名とデータの位置です。
2つ目のグラフなので、FullSeriesCollection(2)に対して指定します。
1番目のグラフでは、

ActiveChart.SetSourceData Source:=Range("Sheet1!D2:D29")

を使用してデータの場所を指定しましたが、2番目以降は、

ActiveChart.FullSeriesCollection(2).Values = "=Sheet1!E2:E29"

の様に、Values を使用してデータの場所を指定します。
シート指定を忘れない様に。指定しないとエラーになります。

3つ目以降のグラフの情報も同様に指定する

今回は、3つのグラフを重ねましたが、4つ以降も同じ要領で重ねられます。

ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(3).Name = "=""データ3"""
ActiveChart.FullSeriesCollection(3).Values = "=Sheet1!F2:F29"

ここまで来ると、サクサクですね。

 

トラックバック(0)

トラックバックURL:

コメントする

サムネイル

[Excel]VBAで重ね合わせインライングラフを作成する - FB post for mutter
RSS 0.91
RSS 0.92
RSS 1.0
RSS 2.0
ATOM

twitter

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。
Powered by Movable Type 6.3.3

このブログ記事について

このページは、いまい やすゆきが2017年1月31日 23:20に書いたブログ記事です。

ひとつ前のブログ記事は「[Excel]VBAでインライングラフを作成する2」です。

次のブログ記事は「[Excel]VBAで近似曲線グラフを重ねる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。