2020年6月18日木曜日

[VBA] 13. グラフの作成

セルの値を元に埋め込みグラフを作成する方法についてまとめる。グラフの作成に必要な基本的な記述方法について記載しているが、色の変更などの細かい設定については記載しない。



グラフの作成
以下の表のグラフを作成する。



Dim graphGhart As Object

'グラフを作成
Set graphGhart = ActiveSheet.Shapes.AddChart.Chart

'範囲を指定
graphGhart.SetSourceData Range("A2:C10")

.SetSourceData で指定した一番左の列がX軸となり、それ以外の列がY軸となる。
この記述でグラフの作成はできるのですが(私はこのやり方で作成していました...)、オブジェクトなんか作らずに With ステートメントで記述するのが一般的なようなので、以降は With ステートメントを使って記載していきます。
With ActiveSheet.Shapes.AddChart.Chart
    
    .SetSourceData Range("A2:C10")  '範囲
    
End With



ちなみに、AddChart を AddChart2 とするとグラフの見た目が変わります。見た目の好きな方でOK。パラメータが少し違うのですが、パラメータ名を省略しなければ問題ないと思う。タイトルや系列名の表示/非表示などについても、後述する .HasTitle / .HasLegend で変更できるので気にしなくて大丈夫。
With ActiveSheet.Shapes.AddChart2.Chart
    
    .SetSourceData Range("A2:C10")  '範囲
    
End With



AddChart と AddChart2 のパラメータはこのようになっているようです。参考まで。

expression.AddChart (XlChartType, Left, Top, Width, Height)
expression.AddChart2 (Style, XlChartType, Left, Top, Width, Height, NewLayout)


グラフの種類を指定
ChartType の値を指定する事で、グラフの種類を変更できる。以下の例では折れ線グラフを指定している。
With ActiveSheet.Shapes.AddChart.Chart

    .SetSourceData Range("A2:C10")  '範囲
    .ChartType = xlLine             'グラフの種類 (折れ線)

End With
もしくは AddChart のパラメータで指定する事も可能。
With ActiveSheet.Shapes.AddChart(XlChartType:=xlLine).Chart
    
    .SetSourceData Range("A2:C10")  '範囲
    
End With

以下に代表的なグラフの種類を示す。他の種類を知りたい人は こちら を参照してください。
設定 内容
xlLine 折れ線
xlLineMarkers マーカー付き折れ線
xlColumnClustered 縦棒
xlLineStacked [積み上げ] 折れ線
xlLineMarkersStacked [積み上げ] マーカー付き折れ線
xlColumnStacked [積み上げ] 縦棒
xlPie
xlXYScatter 散布図




グラフの範囲を指定
以下のようにグラフにしたい列が連続していなかった場合は、X軸の範囲とY軸の範囲をカンマ (,) で分けてに指定する。



With ActiveSheet.Shapes.AddChart.Chart

    .SetSourceData Range("A2:A10,C2:D10") '範囲 (X軸, Y軸)

End With


グラフの位置とサイズを指定
グラフの表示される位置とサイズを指定するには、AddChart のパラメータで指定できます。LeftとTopが位置で、WidthとHeightがサイズになります。
With ActiveSheet.Shapes.AddChart(Left:=200, Top:=0, Width:=300, Height:=200).Chart

    .SetSourceData Range("A2:C10")  '範囲

End With
以下のようにもできる。好きな方でOK。
With ActiveSheet.Shapes.AddChart
    
    .Left = 200      '座標 (横方向)
    .Top = 0         '     (縦方向)
    .Width = 300     'サイズ (横幅)
    .Height = 200    '       (縦幅)

    .Chart.SetSourceData Range("A2:C10")  '範囲 (.Chart がこっちに移動している点に注意)

End With


系列名と表示位置を指定する
AddChart2 の場合はデフォルトで系列名が非表示なので.HasLegend = True が必要。AddChart なら書かなくても問題ないと思う。
With ActiveSheet.Shapes.AddChart.Chart
    
    .SetSourceData Range("A2:C10")  '範囲
    
    '系列名の表示/非表示 (True/False)
    .HasLegend = True
    
    '系列名を指定
    .SeriesCollection(1).Name = "値1"          '系列1 (直接指定)
    .SeriesCollection(2).Name = Range("C1")    '系列2 (セルから取得)
    
    '系列名の表示位置
    .Legend.Position = xlLegendPositionBottom  '下に表示

End With

表示位置の設定値を以下に示す。
設定 内容
xlLegendPositionBottom グラフの下
xlLegendPositionCorner グラフの輪郭線の右上隅
xlLegendPositionCustom 任意の位置
xlLegendPositionLeft グラフの左
xlLegendPositionRight グラフの右
xlLegendPositionTop グラフの上




タイトルを指定する
グラフのタイトル、X軸/Y軸のタイトルを指定するサンプル。
Axes(xlCategory) がX軸を示し、Axes(xlValue) がY軸を示す。
With ActiveSheet.Shapes.AddChart.Chart
    
    .SetSourceData Range("A2:C10")  '範囲
    
    'グラフのタイトルを指定
    .HasTitle = True                                    '表示/非表示 (True/False)
    .ChartTitle.Text = "グラフのタイトル"               'タイトル値

    'X軸のタイトルを指定
    .Axes(xlCategory).HasTitle = True                   '表示/非表示 (True/False)
    .Axes(xlCategory).AxisTitle.Text = "X軸のタイトル"  'タイトル値

    'Y軸のタイトルを指定
    .Axes(xlValue).HasTitle = True                      '表示/非表示 (True/False)
    .Axes(xlValue).AxisTitle.Text = "Y軸のタイトル"     'タイトル値

End With




グラフに表示する最大値/最小値を指定する
例として 最大値 90, 最小値 20 に設定してみます。
With ActiveSheet.Shapes.AddChart.Chart
    
    .SetSourceData Range("A2:C10")  '範囲
    
    'Y軸の最大値を指定
    .Axes(xlValue).MaximumScale = 90
    
    'Y軸の最小値を指定
    .Axes(xlValue).MinimumScale = 20

End With



目盛の幅を指定する
目盛の幅を指定するサンプル。
With ActiveSheet.Shapes.AddChart.Chart
    
    .SetSourceData Range("A2:C10")  '範囲
    
    'X軸の目盛幅を指定
    .Axes(xlCategory).MajorUnit = 2

    'Y軸の目盛幅を指定
    .Axes(xlValue).MajorUnit = 10

End With



また、目盛の表示する向きを指定する事もできる。指定する値を 0 にすると水平になります。
    'X軸の目盛表示を右へ90度回転
    .Axes(xlCategory).TickLabels.Orientation = -90


第2軸の指定
以下のように値に差がある場合、1つのグラフで表示するには第2軸を使うと思います。



AxisGroup で系列毎に主軸か第2軸かを指定することができる。
SeriesCollection(2) は系列2を示す。見やすくするために系列2は折れ線グラフにした。
主軸グループであることを指定したい場合は xlSecondary ではなく xlPrimary となる。

With ActiveSheet.Shapes.AddChart.Chart
    
    .SetSourceData Range("A2:C10")  '範囲
    
    '系列2を編集
    .SeriesCollection(2).AxisGroup = xlSecondary  '第2軸グループに指定
    .SeriesCollection(2).ChartType = xlLine       '折れ線
    
End With




2つの表から散布図を作成する
以下のような2つの表から散布図を作成する。



'グラフ種別を散布図 (xlXYScatter) にする
With ActiveSheet.Shapes.AddChart(XlChartType:=xlXYScatter).Chart
    
    '系列1
    .SeriesCollection.NewSeries                     '新しい系列を作成
    .SeriesCollection(1).XValues = Range("A2:A10")  'X軸
    .SeriesCollection(1).Values = Range("B2:B10")   'Y軸
    
    '系列2
    .SeriesCollection.NewSeries                     '新しい系列を作成
    .SeriesCollection(2).XValues = Range("D2:D10")  'X軸
    .SeriesCollection(2).Values = Range("E2:E10")   'Y軸
    
End With




グラフを削除する
アクティブシート内にあるすべてのグラフを削除します。
'グラフがあるかチェック
If (ActiveSheet.ChartObjects.Count > 0) Then
    ActiveSheet.ChartObjects.Delete  '削除
End If


0 件のコメント:

コメントを投稿