【VBA】グラフの自動作成(タイトル/軸/系列の設定方法も解説)

2022年3月5日

VBAでグラフを作成するのって、意外と難しいですよね。

グラフ難しいなって人のために、グラフを作成する基本的な方法と、タイトルなどの各種プロパティの設定方法を紹介します。

この記事はこんな人に向けて書いています。

  • VBAでグラフを作りたい
  • グラフの種類を設定したい
  • タイトルを設定したい
  • 軸を設定したい
  • 系列を個別に追加したい

VBAでグラフを作成する方法

VBAでグラフを作成する方法
VBAでグラフを作成する方法
Sub MakeGraph1()
    'グラフを作成
    'グラフを作る範囲
    Dim rng As Range
    Set rng = Range("E1").Resize(10, 6)
    
    'コンテナ(グラフの枠)の作成
    Dim ChartObj As ChartObject
    Set ChartObj = ActiveSheet.ChartObjects.Add(rng.Left, rng.Top, rng.Width, rng.Height)
    
    'コンテナ内のChart(グラフ)オブジェクトを取得
    Dim chartOne As chart
    Set chartOne = ChartObj.chart
    
    'グラフのプロパティを指定
    With chartOne
        .SetSourceData Source:=Range("A1:C5")  'データ範囲の指定
    End With
End Sub

A1~C5セルにデータを入れて、マクロを実行すると上の図のようにグラフが作成されます。

VBAでグラフを作る場合、最初にコンテナ(ChartObjectオブジェクト)を作成する必要があります。
この内容は下記の記事に記載しているため、まだご存知ない方は先に読んでください。

コンテナを作った後に、Chartオブジェクトを取得し、下記の部分でグラフにデータをセットしています。

.SetSourceData Source:=Range("A1:C5") 'データ範囲の指定

グラフを作る基本的な方法はこれだけです。

あとは、Chartオブジェクトのプロパティを設定して、グラフ種類やタイトル、軸の設定を行うだけです。

グラフの種類を設定する方法(ChartTypeプロパティ)

Sub MakeGraph2()
    'グラフの種類を設定
    'グラフを作る範囲
    Dim rng As Range
    Set rng = Range("E1").Resize(10, 6)
    
    'コンテナ(グラフの枠)の作成
    Dim ChartObj As ChartObject
    Set ChartObj = ActiveSheet.ChartObjects.Add(rng.Left, rng.Top, rng.Width, rng.Height)
    
    'コンテナ内のChart(グラフ)オブジェクトを取得
    Dim chartOne As chart
    Set chartOne = ChartObj.chart
    
    'グラフのプロパティを指定
    With chartOne
        .SetSourceData Source:=Range("A1:C5")  'データ範囲の指定
        .ChartType = xlXYScatter 'グラフの種類の指定(散布図)
    End With
End Sub

このコードではChartTypeプロパティを設定することで、グラフの種類を散布図に変更しています。

ChartType = xlXYScatterとしたため散布図になっていますが、この右側を変更すればグラフの種類を好きなものにすることができます。

下記のリンク先にグラフの種類の一覧表があるため、目的のものを選んでみてください。

https://docs.microsoft.com/ja-jp/office/vba/api/excel.xlcharttype

グラフのタイトルを設定する方法

Sub MakeGraph3()
    'グラフのタイトルを設定
    'グラフを作る範囲
    Dim rng As Range
    Set rng = Range("E1").Resize(10, 6)
    
    'コンテナ(グラフの枠)の作成
    Dim ChartObj As ChartObject
    Set ChartObj = ActiveSheet.ChartObjects.Add(rng.Left, rng.Top, rng.Width, rng.Height)
    
    'コンテナ内のChart(グラフ)オブジェクトを取得
    Dim chartOne As chart
    Set chartOne = ChartObj.chart
    
    'グラフのプロパティを指定
    With chartOne
        .SetSourceData Source:=Range("A1:C5")  'データ範囲の指定
        .HasTitle = True
        .ChartTitle.Text = "タイトル"
    End With
End Sub

グラフのタイトルを設定したい場合はHasTitleプロパティをTrueにしてから、ChartTitle.Textプロパティにタイトルを設定します。

グラフの軸を設定する方法

Sub MakeGraph4()
    'グラフの軸を設定
    
    'グラフを作る範囲
    Dim rng As Range
    Set rng = Range("E1").Resize(10, 6)
    
    'コンテナ(グラフの枠)の作成
    Dim ChartObj As ChartObject
    Set ChartObj = ActiveSheet.ChartObjects.Add(rng.Left, rng.Top, rng.Width, rng.Height)
    
    'コンテナ内のChart(グラフ)オブジェクトを取得
    Dim chartOne As chart
    Set chartOne = ChartObj.chart
    
    'グラフのプロパティを指定
    With chartOne
        .SetSourceData Source:=Range("A1:C5")  'データ範囲の指定
        
        '縦軸
        With .Axes(xlValue)
            '軸ラベルを設定
            .HasTitle = True
            .AxisTitle.Caption = "横軸ラベル"
            
            '最大値/最小値を設定
            .MinimumScale = 0
            .MaximumScale = 2000
            
            '目盛間隔を設定
            .MajorUnit = 1000
            
            '表示形式を設定
            .TickLabels.NumberFormatLocal = "#,###"
        End With
        
        '横軸
        With .Axes(xlCategory)
            '縦軸と同様に設定可能
        End With
    End With
End Sub
グラフの軸を設定する方法
グラフの軸を設定する方法

グラフのタイトルを設定したい場合は、Axesメソッドを使用して軸のオブジェクト(Axisオブジェクト)を取得します。
Axes(xlValue)とすると縦軸の、Axes(xlCategory)とすると横軸のオブジェクトが取得できます。

上のサンプルコードでは軸ラベル、最大値/最小値、目盛間隔、表示形式を設定する方法を記載しています。

Axisオブジェクトには多くのプロパティが存在するため、これ以外の設定を行いたい場合は、Axisオブジェクトのドキュメントから目的のプロパティを探してみて下さい。

Axisオブジェクトのドキュメント⇒https://docs.microsoft.com/ja-jp/office/vba/api/excel.axis(object)

系列を個別に追加する方法

ここまでのサンプルマクロではデータを横軸、縦軸含めてすべてRange(“A1:C5")に設定してきました。

データが綺麗に並んでいればいいのですが、そうでない時もあるかもしれません。

そうした場合は、.SetSourceData Source:=Range(“A1:C5")のように一気にデータ範囲を取得することができません。

その場合は、次のサンプルコードのように系列を個別に追加する必要があります。

Sub MakeGraph5()
    'グラフを作成(系列を個別に追加)
    'グラフを作る範囲
    Dim rng As Range
    Set rng = Range("E1").Resize(10, 6)
    
    'コンテナ(グラフの枠)の作成
    Dim ChartObj As ChartObject
    Set ChartObj = ActiveSheet.ChartObjects.Add(rng.Left, rng.Top, rng.Width, rng.Height)
    
    'コンテナ内のChart(グラフ)オブジェクトを取得
    Dim chartOne As chart
    Set chartOne = ChartObj.chart
    
    'グラフのプロパティを指定
    With chartOne
        '新しい系列を追加
        With .SeriesCollection.NewSeries
            '横軸のデータ
            .XValues = Range("A1").Resize(5)
            '縦軸のデータ
            .Values = Range("B1").Resize(5)
        End With
    End With
End Sub

このコードではSeriesCollectionで系列のコレクションを取得し、NewSeriesメソッドで新しい系列を個別に追加しています。

この方法ならば、横軸、縦軸のデータ位置をピンポイントで指定することができます。
(例えば、横軸のデータが右の方にあっても指定ができます)

《VBA中級者向けの本》
VBA上級者を目指したい人にはパーフェクトExcel VBA一択です。

created by Rinker
技術評論社
¥3,608 (2022/05/20 10:38:41時点 Amazon調べ-詳細)

自分で作るのが難しいと感じたら、プロに作ってもらう手もあります。
こちらの記事でおすすめのプログラマーを紹介しています

《IT未経験-特化型サービス》



他の「VBA」の記事はこちらからどうぞ

VBA

Posted by やろまい