VBAでグラフを作成する方法!フレキシブルな棒グラフ編

エクセルでグラフを作成するとき、どのような操作をしてますか?

データを選択して、リボンからグラフを挿入して・・・という感じが多いでしょうか。

これで思う通りのグラフになればよいですが、「それは横軸のデータなんだよな」なんて、手直しが必要になることもありますよね。

よく作るグラフであれば、マクロで組んでしまった方が楽だったりします。

この記事では、グラフの種類を棒グラフに絞って、「VBAでグラフを作成する方法」について解説します。

1.ワークシート上の準備

こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。

今回は「よく使う棒グラフを手間をかけずに作りたい!」、「データを入力して実行するだけのフレキシブルなマクロを組みたい!」というコンセプトで進めていきます。

まずはデータを入力する欄をワークシート上に用意します。

表

図の赤線で囲った部分はタイトルを入力するセルです。

図の青線で囲った部分には横軸のデータを入力します。A列が名称で、B列から右にデータを入力します。今回はデータ数が何個でもよいような仕様を考えましょう。

図のオレンジ線で囲った部分にはグラフにしたいデータを入力します。A列に凡例、B列から右にデータを入力します。こちらもデータ数が何個でもよいような仕様を考えていきます。またデータの系列数も何個でもよいような仕様とします。

この表にデータを入力すれば、どんなデータ数であっても棒グラフにしちゃうマクロを作成したい、ということです。

2.グラフを作成するVBAコード

それではVBAコードを紹介します。

コメントとしてコード中に記述していますが、すでにグラフがある場合(2回目以降)はそのグラフを削除することとしました。

[B]部分でグラフを作成しますが、アクティブセルの位置によっては空でなくデータ系列が入ってしまいますので、これは削除することとしています。

[C]部分では表に入力された系列数とデータ数を検出します。

[E]部分で1系列ずつ追加していきますので、[D]部分のように系列数だけループさせます。

[F]部分がグラフの設定になります。グラフの種類と横軸、データ、凡例を設定しています。

Sub 棒グラフ()
Dim i, p, q As Long
Dim chrt As Shape

'[A]すでにグラフがある場合は削除します
For Each chrt In ActiveSheet.Shapes
    chrt.Delete
Next chrt

'[B]空のグラフを作成します
'  データ系列が設定されてしまった場合は削除します
ActiveSheet.Shapes.AddChart.Chart.ChartType = xlColumnClustered
ActiveSheet.ChartObjects(1).Activate
ActiveChart.ChartArea.ClearContents

'[C]データ系列数と各系列のデータ数を検出します
p = Range("B2").End(xlDown).Row - 2
q = Range("B2").End(xlToRight).Column

'[D]データ系列数だけ繰り返します
For i = 1 To p

'[E]グラフにデータ系列を作成します
    ActiveSheet.ChartObjects(1).Chart.SeriesCollection.NewSeries

'[F]データ系列の設定を行います
    With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(i)
        .ChartType = xlColumnClustered  '棒グラフに設定
        .XValues = Range(Cells(2, 2), Cells(2, q))  '横軸の値を設定
        .Values = Range(Cells(2 + i, 2), Cells(2 + i, q))   'データを設定
        .Name = Cells(2 + i, 1) '系列名を設定
    End With

Next i

End Sub

3.実行結果の例

実行結果を示します。

2系列の場合も3系列の場合も、上記コードで棒グラフ化できました。データ数も変えていますが、しっかりグラフになっていますね。

2系列
3系列

4.まとめ

この記事では、「VBAでグラフを作成する方法」について解説しました。

よく使う棒グラフを取り上げてみましたが、いかがでしたか?

よく使うグラフはこのような作成用のマクロを組んでおくと便利ですね。