サイトアイコン マメBlog

グラフを作成するVBAは難しい!【 多数のサンプル比較でわかりやすく紹介 】

豆父ちゃん

VBAを使ったグラフの作成は難しい。グラフ作成の基本的な知識は勉強したんだけど、なかなかうまくいかない。

そんな方のために、いろんなサンプルVBAを使って作り方を紹介します。


 

VBAによるグラフの作成が難しい理由

グラフの種類やタイトルの表示など、グラフ作成に必要な基本的な知識を身につけてもグラフの作成は難しい。

なぜなら、ネットや参考書でグラフ作成に関する資料が少ないからです。グラフの作り方を紹介しているものを見つけたとしても、紹介例の集計表とあたなが作ろうとしているグラフの集計表が少しでも異なるとVBAを大きく変更しなければなりません。

 

  • 集計表のセルが結合されていて取得したい値が隣同士にない
  • 取得した値のX軸とY軸を反転させたい
  • グラフの色を変更したい

このような処理をしたくてもなかなかうまくいきませんでした。

いろんなパターンのサンプルVBAがあればいろんな処理ができるようになります。私が作成したエクセル家計簿ではいろんなパターンのグラフを表示させているので、サンプルとして紹介します。

下記の記事では、VBAによるグラフ作成の基本的な方法について紹介しています。

豆父ちゃんエクセル作業でグラフの作成にかなり時間がかかっている。VBAを使って自動化したい。そんな方のために、VBAによるグラフ作成の基本的な操作方法を紹介します。 グラフの作成はVBAを使った方がいい理由私は、電気料金の集計をまとめる業務を毎月行っていて、その集計表にいつもグラフを添えて資料を作っていました。月に1回の作業なので手作業で行っていましたが、手間がかかりかなりの時間を使っていました。今では電気料金を入力すると、集計とグラフの作成を一瞬で処理するVBAを開発したので一瞬で作業を終えることが...
VBAを使ったグラフの作成【 初心者向けの基本事項を紹介 】 - mamemametochan.com

 

VBAによるグラフ作成 棒グラフ


エクセル家計簿では「集計シート表」から棒グラフを作成してます。

1 Sub 棒グラフ()
2 ‘変数の宣言
3 Dim Po As Range
4 Set Po = ActiveSheet.Cells(3, 22)
5 Dim Ta As Range
6 Dim Ta2 As Range
7 ‘オブジェクトの削除
8 For Each sa In ActiveSheet.Shapes
9 On Error Resume Next
10 If sa.TopLeftCell.Address >= ActiveSheet.Cells(1, 1).Address Then
11 sa.Delete
12 End If
13 If Err <> 0 Then
14 Err.Clear
15 End If
16 Next
17 ‘棒グラフの作成
18 With ActiveSheet.Shapes.AddChart.Chart
19 .ChartType = xlColumnClustered
20 .SetSourceData Source:=ActiveSheet.Range(“AN3:AN4,AQ3:AQ4”)
21 ‘タイトル追加
22 .HasTitle = True
23 .ChartTitle.Text = “収入・支出”
24 ‘表示位置の調整
25 .Parent.Top = Po.Top
26 .Parent.Left = Po.Left
27 ‘項目の表示設定
28 .HasLegend = False
29 .Axes(xlCategory).HasTitle = False
30 ‘色の調整
31 .FullSeriesCollection(1).Points(1).Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent2
32 .FullSeriesCollection(1).Points(2).Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent5
33 End With
34 End Sub

7行目から16行目まではオブジェクトを削除するプログラムです。この削除プログラムがなければVBAを実行するたびにグラフが表示され積み重ねられてしまいます。それを防ぐためにVBAを実行すると、Sheet内のオブジェクトを全て削除するプログラムを最初に記載します。

19行目はグラフの種類を選択しています。 .ChartType = xlColumnClusteredで棒グラフを作成するという意味です。

20行目のグラフの選択範囲でRange(“AN3:AN4,AQ3:AQ4”)になっているのは、集計表から参照した値がせるの結合により離れているためです。

参照したい値が隣通しになっていない場合に記載する方法で、よく使われるので覚えておくといいでしょう。

31行目と32行目は色の調整を行っています。エクセル家計簿では複数の項目でグラフを作成しているので、全体の見栄えをよくするために色の調整を行っています。

グラフの範囲指定で使われている関数Unionについて下記の記事で詳しく紹介しています。

union関数とはセルを複数選択して、なにかしらの処理をしたいときに便利なのがunion関数です。unionは「結合」や「融合」といった意味であり、union関数もこれと同様の働きをします。union関数を使えば複数のセル(Range)を一つのオブジェクトとして使用することができる。 基本構造 Dim オブジェクト As RangeSet オブジェクト = union(Range(),Range()) サンプル Dim Oj As RangeSet Oj  = union(Range("A3:C3"),Range("G4"),Range("K6"))Oj.Selectサンプルの結果は以下のように...
VBA union関数【 複数のセル選択はいろんなことに応用可能 】 - mamemametochan.com

 

VBAによるグラフ作成 積み上げ棒グラフ


エクセル家計簿では「項目別集計シート表」から積み上げ棒グラフを作成してます。

1 Sub 積み上げ棒グラフ()
2 ‘変数の宣言
3 Dim Po As Range
4 Set Po = ActiveSheet.Cells(15, 22)
5 Dim Ta As Range
6 ‘オブジェクトの削除
7 For Each sa In ActiveSheet.Shapes
8 On Error Resume Next
9 If sa.TopLeftCell.Address >= ActiveSheet.Cells(1, 1).Address Then
10 sa.Delete
11 End If
12 If Err <> 0 Then
13 Err.Clear
14 End If
15 Next
16 ‘積み上げ棒グラフの作成
17 With ActiveSheet.Shapes.AddChart.Chart
18 .ChartType = xlColumnStacked
19 Set Ta = Union(Range(Cells(3, 47), Cells(34, 47)), Range(Cells(3, 48), Cells(34, 51)))
20 .SetSourceData Source:=Ta
21 .FullSeriesCollection(1).Delete
22 ‘タイトル追加
23 .HasTitle = True
24 .ChartTitle.Text = “項目別支出”
25 ‘表示位置の調整
26 .Parent.Top = Po.Top
27 .Parent.Left = Po.Left
28 End With
29 End Sub

19行目と20行目はグラフの選択範囲を示すプログラムです。Union関数でRange(Cells(3, 47), Cells(34, 47))の範囲と Range(Cells(3, 48), Cells(34, 51))の範囲を合体し、変数Taに格納するということ意味です。格納した変数Taをグラフの参照範囲とすればグラフが作成されます。

21行目は凡例の項目を1つ削除するという意味です。このプログラムを記載しなければ、範囲指定した一番左上の「日付/項目」が凡例で表示されてしまいます。

 

VBAによるグラフ作成 円グラフ

エクセル家計簿では「細目別集計シート表」から円グラフを作成してます。

1 Sub 円グラフ()
2 ‘変数の宣言
3 Dim Po As Range
4 Set Po = ActiveSheet.Cells(38, 22)
5 Dim Ta As Range
6 Dim Ta2 As Range
7 ‘オブジェクトの削除
8 For Each sa In ActiveSheet.Shapes
9 On Error Resume Next
10 If sa.TopLeftCell.Address >= ActiveSheet.Cells(1, 1).Address Then
11 sa.Delete
12 End If
13 If Err <> 0 Then
14 Err.Clear
15 End If
16 Next
17 With ActiveSheet.Shapes.AddChart.Chart
18 .ChartType = xlPie
19 Set Ta = Range(Cells(37, 48), Cells(37, retu2))
20 Set Ta2 = Range(Cells(69, 48), Cells(69, retu2))
21 .SetSourceData Source:=Union(Ta, Ta2)
22 ‘タイトル追加
23 .HasTitle = True
24 .ChartTitle.Text = “細目別支出”
25 .Parent.Top = Po.Top
26 .Parent.Left = Po.Left
27 .DataLabels.ShowPercentage = True
28 .SeriesCollection(1).DataLabels.ShowPercentage = True
29 .SeriesCollection(1).ApplyDataLabels ShowPercentage:=True, ShowValue:=False
30 End With
31 End Sub

 

グラフの作成はVBAによる自動化がおすすめ

グラフの作成作業は決められた一覧表から作成する場合がほとんどですよね。

私の職場では、ここからここまでのセルを選択して、「Alt」+「F1ボタン」で…!のようなグラフを作成する説明書が作られていて、その通り資料を作るということをしていました。

説明書の通りのVBAを作ってしまえばこの仕事は一瞬で処理することができます。

グラフ作成のような機械的なエクセル業務はVBAを使って自動化してしまいましょう。

下記の記事でエクセル業務のシステム化について紹介しています。エクセル業務の効率をあげたいという方は是非チェックしてみてください。

豆父ちゃんエクセル業務の効率をもっとあげたい!なんかいい方法はないのか。こんな疑問に答えます。結論から言うと、Excel VBAを導入してシステム化を行うこと!です。システム化というと、難しいことをしなければいけない!と思われがちですがそうではありません。簡単に言うと、いくつものVBAを組み合わせて効率を上げる仕組み作りをする!ということです。エクセル業務のシステム化について順を追って説明します。 (adsbygoogle = window.adsbygoogle || ).push({});エクセル業務システム化①【 Excel VBAの導入 】エクセル業...
エクセル業務のシステム化【 デスクワークの効率を上げる方法 】 - mamemametochan.com
モバイルバージョンを終了