Excel VBA 複数のグラフをまとめて複合グラフ(Chart)を作成する

グラフ作成/操作

今回は1つのグラフに複数の種類のグラフを使用して作成する方法をご説明します。

例えば棒グラフと折れ線グラフを1つのグラフに表示するということです。

複合グラフとは別に2軸グラフというのもあります。

2軸グラフの作成方法や、その他グラフの作成方法から詳細設定は次の記事をご覧下さい。

1.複合グラフとは

複合グラフとは複数のグラフの種類を、1つのグラフにまとめて表示したグラフの事です。

どんな時に使用するかというと、複数の項目を明確に分けて表示したい時などに使用します。

下図の様に1つのグラフエリアに棒グラフと折れ線グラフを一緒に表示させます。

また、複合グラフと合わせて、よく利用されるのが2軸グラフという表示方法もあります。

どんな時に使用するかと言いますと、グラフに表示したい項目で数値の桁が違いすぎるとき等に使用します。

次のような「売上」と「受注件数」のデータを1つのグラフで表示しようとすると、「受注件数」の数値が小さすぎてほとんどわかりません。

このような場合に2軸グラフを使用します。

複合ではないグラフの場合でも、項目の桁が大きく違う場合には2軸グラフを使用します。

2軸グラフの詳細は「2軸グラフを作成する」をご覧下さい。

上記の図を2軸グラフにしたのが下の図です。

2.複合グラフの作成方法

複合グラフを作成するには、各系列(データ)を個別に作成する方法と、グラフをまとめて作成してから、個別に系列のグラフの種類を指定する方法があります。

それぞれ順にご説明します。

系列を個別に作成する

まずはグラフをアクティブシートに作成します。

1つ目の系列の棒グラフを作成します。

そのあとに、新しい系列を折れ線グラフで追加します。

Sub Sample1()

Dim ChartObj    As Object

'■■■新しいグラフを作成■■■
With ActiveSheet.Shapes.AddChart.Chart

    .ChartType = xlColumnClustered '棒グラフを指定
    .SetSourceData Range(Cells(1, 1), Cells(13, 2)) 'データ範囲を指定

End With

'■■■作成したグラフを格納■■■
Set ChartObj = ActiveSheet.ChartObjects(1)

'■■■グラフに新しい系列(データ)を追加■■■
With ChartObj.Chart

    .SeriesCollection.NewSeries '新しい系列追加
    
    With .SeriesCollection(2) '新しい系列は2番目となる
        
        .ChartType = xlLine '2つ目の系列のグラフの種類を折れ線に指定
        
        .Values = Range("C2:C13") 'データ範囲を指定
        
        .Name = Range("C1") '項目名を指定
        
    End With


End With

End Sub

ActiveSheet.Shapes.AddChart.Chart」でグラフを作成します。

.ChartType = xlColumnClustered」で作成したグラフの種類を指定しています。

.SetSourceData Range(Cells(1, 1), Cells(13, 2)) 」でデータ範囲を指定していますが、A~B列のみ指定しています。

「Set ChartObj = ActiveSheet.ChartObjects(1)」で作成したグラフを変数に格納して、詳細設定を指定します。

Chart」オブジェクトに「.SeriesCollection.NewSeries」で作成したグラフに新しい系列(データ)を追加しています。

追加した系列は2つ目となるので「With .SeriesCollection(2)」と指定して、詳細設定します。

.ChartType」でグラフの種類を選択し、「.Values」でデータ選択をしています。

.Name」で系列の名前を指定しています。

グラフ作成後に系列の種類を変更する

グラフをアクティブシートに作成します。

まとめて一括でグラフを作成してから、系列の種類を変更しています。

上記の個別に系列を作成するよりもシンプルになりました。

Sub Sample2()

Dim ChartObj    As Object

'■■■新しいグラフを作成■■■
With ActiveSheet.Shapes.AddChart.Chart

    .ChartType = xlColumnClustered '棒グラフを指定
    .SetSourceData Range(Cells(1, 1), Cells(13, 3)) 'データ範囲を指定

End With

'■■■作成したグラフを格納■■■
Set ChartObj = ActiveSheet.ChartObjects(1)

'■■■グラフの既存系列(データ)の種類を変更■■■
With ChartObj.Chart
    
    With .SeriesCollection(2) '系列の2番目を指定
        
        .ChartType = xlLine '2つ目の系列のグラフの種類を折れ線に指定
        
    End With

End With

End Sub

ActiveSheet.Shapes.AddChart.Chart」でグラフを作成します。

.ChartType = xlColumnClustered」で作成したグラフの種類を指定しています。

.SetSourceData Range(Cells(1, 1), Cells(13, 3)) 」でデータ範囲を指定していますが、A~C列と全て指定しています。

「Set ChartObj = ActiveSheet.ChartObjects(1)」で作成したグラフを変数に格納して、詳細設定を指定します。

種類を変更したい系列は2つ目となるので「With .SeriesCollection(2)」と指定して、詳細設定します。

.ChartType」でグラフの種類を選択し、「.Values」でデータ選択をしています。

.Name」で系列の名前を指定しています。

こちらの方が系列を追加するコードがないためシンプルになりました。

3.よりシンプルに複合グラフを作成するコード

上記ではわかりやすく、グラフを作成する部分と系列を操作する部分を分けてコーディングしました。

それをまとめると次のように、よりシンプルに記述できます。

どちらもグラフ作成時にまとめて操作します。

結果はどちらも上記で紹介した方法と同じになります。

シンプルに系列を個別に作成する

Sub Sample3()

'■■■新しいグラフを作成■■■
With ActiveSheet.Shapes.AddChart.Chart

    .ChartType = xlColumnClustered '棒グラフを指定
    .SetSourceData Range(Cells(1, 1), Cells(13, 2)) 'データ範囲を指定
    
    .SeriesCollection.NewSeries '新しい系列追加
    
    With .SeriesCollection(2) '新しい系列は2番目となる
        
        .ChartType = xlLine '2つ目の系列のグラフの種類を折れ線に指定
        
        .Values = Range("C2:C13") 'データ範囲を指定
        
        .Name = Range("C1") '項目名を指定
        
    End With

End With

End Sub

シンプルにグラフ作成後に系列の種類を変更する

Sub Sample4()

'■■■新しいグラフを作成■■■
With ActiveSheet.Shapes.AddChart.Chart

    .ChartType = xlColumnClustered '棒グラフを指定
    .SetSourceData Range(Cells(1, 1), Cells(13, 3)) 'データ範囲を指定

    With .SeriesCollection(2) '系列の2番目を指定
        
        .ChartType = xlLine '2つ目の系列のグラフの種類を折れ線に指定
        
    End With
    
End With

End Sub

4.複合グラフサンプルコード

最後に複合グラフのサンプルコードをご紹介します。

折れ線と棒グラフの複合グラフ

折れ線グラフと棒グラフの複合グラフです。

少し長くて、各グラフのオブジェクトのWithで入れ子になっていますので、どのオブジェクトを操作しているか注視してコードを見てください。

Sub Sample5()

'■■■新しいグラフを作成■■■
With ActiveSheet.Shapes.AddChart

    .Top = 10 'グラフのトップ位置
    .Left = 200 'グラフの左の位置
    .Width = 400 'グラフ幅
    .Height = 200 'グラフの高さ
    .Name = "Chart1" 'グラフの名前

    With .Chart

        .ChartType = xlColumnClustered '棒グラフを指定
        .SetSourceData Range(Cells(1, 1), Cells(13, 2)) 'データ範囲を指定
        
        .SeriesCollection.NewSeries '新しい系列追加
        
        With .SeriesCollection(2) '新しい系列は2番目となる
            
            .ChartType = xlLine '2つ目の系列のグラフの種類を折れ線に指定
            
            .Values = Range("C2:C13") 'データ範囲を指定
            
            .Name = Range("C1") '項目名を指定
            
        End With
        
        .HasTitle = True 'タイトル設定
        .ChartTitle.Text = "年間売上/受注件数グラフ" 'タイトル文字列
        
        With .ChartTitle.Format.TextFrame2.TextRange.Font
        
            .Size = 10 'タイトル文字サイズ
            .Fill.ForeColor.ObjectThemeColor = 6 'タイトル文字色
            
        End With
        
        .HasLegend = True '凡例表示
        .Legend.Position = xlLegendPositionRight '凡例表示位置(右側)
    
        With .Legend.Format.Fill
        
            .Visible = msoTrue '塗りつぶし設定
            .ForeColor.RGB = RGB(217, 217, 217) '色指定
        
        End With
        
    End With

End With

End Sub

面と棒グラフの複合グラフ

面グラフと棒グラフの複合グラフです。

変更された点は「.ChartType = xlLine」を「.ChartType = xlArea」と円グラフに変更しただけです。

Sub Sample6()

'■■■新しいグラフを作成■■■
With ActiveSheet.Shapes.AddChart

    .Top = 10 'グラフのトップ位置
    .Left = 200 'グラフの左の位置
    .Width = 400 'グラフ幅
    .Height = 200 'グラフの高さ
    .Name = "Chart1" 'グラフの名前

    With .Chart

        .ChartType = xlColumnClustered '棒グラフを指定
        .SetSourceData Range(Cells(1, 1), Cells(13, 2)) 'データ範囲を指定
        
        .SeriesCollection.NewSeries '新しい系列追加
        
        With .SeriesCollection(2) '新しい系列は2番目となる
            
            .ChartType = xlArea '2つ目の系列のグラフの種類を円に指定
            
            .Values = Range("C2:C13") 'データ範囲を指定
            
            .Name = Range("C1") '項目名を指定
            
        End With
        
        .HasTitle = True 'タイトル設定
        .ChartTitle.Text = "年間売上/受注件数グラフ" 'タイトル文字列
        
        With .ChartTitle.Format.TextFrame2.TextRange.Font
        
            .Size = 10 'タイトル文字サイズ
            .Fill.ForeColor.ObjectThemeColor = 6 'タイトル文字色
            
        End With
        
        .HasLegend = True '凡例表示
        .Legend.Position = xlLegendPositionRight '凡例表示位置(右側)
    
        With .Legend.Format.Fill
        
            .Visible = msoTrue '塗りつぶし設定
            .ForeColor.RGB = RGB(217, 217, 217) '色指定
        
        End With
        
    End With

End With

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