VBA

【案外簡単】エクセル上でグラフをVBAで作ってみよう

記事内に商品プロモーションを含む場合があります
このページでわかること

グラフ作成を段階的に分けて、簡単に作る方法がわかります。

フェーズを分けて考えよう

グラフを作る際、一気に考えるのではなく、
段階を踏んで処理すると案外簡単です。

具体的な段階を下記に整理しました。

  1. 新規でグラフを追加しよう   
    このとき位置も決めちゃおう
  2. グラフの参照範囲を指定しよう
  3. グラフの種類を指定しよう
  4. 編集しよう(必要なとこだけ)   
    系列と項目を変更しよう   
    タイトルを編集しよう   
    スケール(数値の目盛り)を変えよう   
    見栄えを変えてみよう
    凡例を消してみよう 

作り方1.新規でグラフを追加しよう(このとき位置も決めちゃおう)

新規でグラフを作るのは簡単です。
先ずグラフの受け皿となるChartOjectsオブジェクトを追加します。
このとき、位置と大きさも決めましょう。

後で決める方法もありますが、
どうせ決めるんだからここで指定しましょう。

シートオブジェクト.ChartObjects.Add 左端の位置, 上端の位置, 横幅, 高さ

作り方2.グラフの参照範囲を指定しよう

グラフの範囲を決めましょう。
ほとんどの場合が表をグラフ化すると思いますので、
Currentregionかテーブルを使うのがいいかと思います。

ChartObject.Chart.SetSourceData 範囲

作り方3.グラフの種類を指定しよう

グラフはたくさんありますね。

ChartObjects(1).Chart.ChartType = グラフの種類
定数意味
xl3DArea3-D 面
xl3DAreaStacked3-D 積み上げ面
xl3DAreaStacked100100% 積み上げ面
xl3DBarClustered3-D 集合横棒
xl3DBarStacked3-D 積み上げ横棒
xl3DBarStacked1003-D 100% 積み上げ横棒
xl3DColumn3-D 縦棒
xl3DColumnClustered3-D 集合縦棒
xl3DColumnStacked3-D 積み上げ縦棒
xl3DColumnStacked1003-D 100% 積み上げ縦棒
xl3DLine3-D 折れ線
xl3DPie3-D 円
xl3DPieExploded分割 3-D 円
xlArea
xlAreaStacked積み上げ面
xlAreaStacked100100% 積み上げ面
xlBarClustered集合横棒
xlBarOfPie補助縦棒グラフ付き円
xlBarStacked積み上げ横棒
xlBarStacked100100% 積み上げ横棒
xlBubbleバブル
xlBubble3DEffect3-D 効果付きバブル
xlColumnClustered集合縦棒
xlColumnStacked積み上げ縦棒
xlColumnStacked100100% 積み上げ縦棒
xlConeBarClustered集合円錐型横棒
xlConeBarStacked積み上げ円錐型横棒
xlConeBarStacked100100% 積み上げ円錐型横棒
xlConeCol3-D 円錐型縦棒
xlConeColClustered集合円錐型縦棒
xlConeColStacked積み上げ円錐型縦棒
xlConeColStacked100100% 積み上げ円錐型縦棒
xlCylinderBarClustered集合円柱型横棒
xlCylinderBarStacked積み上げ円柱型横棒
xlCylinderBarStacked100100% 積み上げ円柱型横棒
xlCylinderCol3-D 円柱型縦棒
xlCylinderColClustered集合円錐型縦棒
xlCylinderColStacked積み上げ円錐型縦棒
xlCylinderColStacked100100% 積み上げ円柱型縦棒
xlDoughnutドーナツ
xlDoughnutExploded分割ドーナツ
xlLine折れ線
xlLineMarkersマーカー付き折れ線
xlLineMarkersStackedマーカー付き積み上げ折れ線
xlLineMarkersStacked100マーカー付き 100% 積み上げ折れ線
xlLineStacked積み上げ折れ線
xlLineStacked100100% 積み上げ折れ線
xlPie
xlPieExploded分割円
xlPieOfPie補助円グラフ付き円
xlPyramidBarClustered集合ピラミッド型横棒
xlPyramidBarStacked積み上げピラミッド型横棒
xlPyramidBarStacked100100% 積み上げピラミッド型横棒
xlPyramidCol3-D ピラミッド型縦棒
xlPyramidColClustered集合ピラミッド型縦棒
xlPyramidColStacked積み上げピラミッド型縦棒
xlPyramidColStacked100100% 積み上げピラミッド型横棒
xlRadarレーダー
xlRadarFilled塗りつぶしレーダー
xlRadarMarkersデータ マーカー付きレーダー
xlStockHLC高値 – 安値 – 終値
xlStockOHLC始値 – 高値 – 安値 – 終値
xlStockVHLC出来高 – 高値 – 安値 – 終値
xlStockVOHLC出来高 – 始値 – 高値 – 安値 – 終値
xlSurface3-D 表面
xlSurfaceTopView表面 (トップ ビュー)
xlSurfaceTopViewWireframe表面 (トップ ビュー – ワイヤーフレーム)
xlSurfaceWireframe3-D 表面 (ワイヤーフレーム)
xlXYScatter散布図
xlXYScatterLines折れ線付き散布図
xlXYScatterLinesNoMarkers折れ線付き散布図 (データ マーカーなし)
xlXYScatterSmooth平滑線付き散布図
xlXYScatterSmoothNoMarkers平滑線付き散布図 (データ マーカーなし)

作り方4.編集しよう(必要なところだけ)

ここまでで表は完成したはずです。
ただ、微妙に修正しなければいけないところとかあると思います。
そのあたりの修正を考えて見ましょう。

系列、項目を編集しよう

グラフの横軸や縦軸で表示したくないところが表示している場合です。
参照範囲を変更するのが簡単かと思います。

unionを使って参照したいところだけ範囲をくっつけちゃいましょう。
テーブルでやるとすごく簡単ですよ。

タイトルを編集しよう

タイトルを編集するには

シートオブジェクト.ChartObjects(1).Chart.HasTitle = True
シートオブジェクト.ChartObjects(1).Chart.ChartTitle.Text = タイトル名

となります。

スケールを編集しよう

縦軸(y軸)の最大値最小値を変える方法です。

  • 最大値:
    シートオブジェクト.ChartObjects(1).Chart.Axes(xlValue).MaximumScale = 数値
  • 最大値:
    シートオブジェクト.ChartObjects(1).Chart.Axes(xlValue).MinimunScale = 数値

見栄えを変えてみよう

これは多岐にわたるのでここでは紹介しきれませんが、
おそらくよく使うであろう系列の色変更についてご紹介します。

系列全部色を変える
シートオブジェクト.ChartObjects(1).Chart .SeriesCollection(インデックス番号).Format.Fill.ForeColor.RGB=RGB形式で色指定

系列の一部色を変える
シートオブジェクト.ChartObjects(1).Chart .SeriesCollection(インデックス番号).Points(インデックス番号).Format.Fill.ForeColor.RGB=RGB形式で色指定

凡例を消してみよう

系列が複数の色で色分けされているとき凡例が表示されると思いますが、
いらない場合、消しましょう。

シートオブジェクト.ChartObjects(1).Chart.Legend.Delete

実際にグラフを作ってみよう

さて、今までの項目を全て利用すると結構見やすいグラフ作れます。

下記にネットから引っ張て来た東京都の令和からの人口動態のグラフがあります。

これを使って棒グラフを作ってみました。

Sub グラフ()
Dim table As ListObject 'テーブル変数
Dim leftPnt As Integer 'グラフの作成位置取得変数

Set table = ActiveSheet.ListObjects(1)
'テーブルの最右列の二つ隣のセルの左上の端っこのポイントを取得
leftPnt = table.ListColumns(table.ListColumns.Count).Range(1).Offset(, 2).Left

'ActiveSheet.ChartObjects.Add(leftPnt, 20, 400, 300)でChartObjectsを返してくれるので、
'その後ろにChartをつける。
'ほとんどがChartオブジェクトをいじることになるので、Withでつなげる。
With ActiveSheet.ChartObjects.Add(leftPnt, 20, 400, 300).Chart
    .SetSourceData table.Range 'グラフの範囲をざっくりとる(いきなりちゃんととってももちろんいいです)
    .ChartType = xlColumnClustered 'グラフの種類を決める
    'グラフにするデータをブラッシュアップする(必要なとこだけとる)
    .SetSourceData Union(table.ListColumns("年月").Range, table.ListColumns("東京都人口").Range)
    .ChartTitle.Text = "令和東京都の人口動態" 'グラフのタイトルを変える
    .Axes(xlValue).MaximumScale = 14200000 'スケールの最大値を変える
    .Axes(xlValue).MinimumScale = 13960000 'スケールの最小値を変える
    .SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(244, 176, 132) '系列の色を全部変える
    .SeriesCollection(1).Points(12).Format.Fill.ForeColor.RGB = RGB(68, 114, 196) '系列の色を一部変える
    .Legend.Delete '凡例を消す
End With

End Sub

どうでしょうか。
背景変えたり、線を消したりまだおしゃれにするポイントあると思いますが、
まあまあなグラフができたんじゃないでしょうか。

グラフの作成する位置をテーブルの大きさによって変わるようにしかけました。
7行目のところですね。
解説すると長いのでまた別の機会にしますが、
ざっくりいうとセルの位置をポイントで取得する方法があります。

また別途記事書きます。

2020年4月にすごい増えてますね
新年度だから?