複数の分類(支店・担当者・商品カテゴリなど)ごとに、
グラフを一括で自動生成したい
というニーズは実務で非常に多くあります。
例えば「支店別売上」をグラフ化する場合、
- 支店が 5 つならグラフ 5 個
- 支店が 20 ならグラフ 20 個
を手作業で作成するのは大変です。
本記事では、
分類項目ごとに自動でグラフを量産する VBA の作り方
を、初心者でもわかりやすく、かつ実務で使える形で解説します。
目次
1. データ構造と自動生成の考え方
まず大前提として、データが以下のような構造であることを想定します。
| A列:支店名 | B列:売上 |
|---|---|
| 東京 | 100 |
| 大阪 | 150 |
| 名古屋 | 120 |
| 東京 | 80 |
| 大阪 | 90 |
このデータを基に、
支店ごとに売上をまとめ、支店単位でグラフを自動作成
します。
自動生成の流れは以下のとおりです。
- 支店名一覧を抽出する
- 支店ごとのデータ範囲を抽出
- グラフを自動作成
- 名前を付けて管理する(後工程で便利)
2. 支店ごとにグラフを自動生成する VBA(完成版)
以下は、支店ごとに縦棒グラフを自動作成するコードです。
- データは Sheet1
- グラフは同じシートに縦に並べて生成
- グラフ名は「Chart_支店名」
Sub CreateBranchCharts()
Dim ws As Worksheet
Dim lastRow As Long
Dim dict As Object
Dim i As Long
Dim branch As Variant
Dim posTop As Long
Dim chartObj As ChartObject
Dim rngX As Range
Dim rngY As Range
Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'支店一覧を辞書で抽出
Set dict = CreateObject("Scripting.Dictionary")
For i = 2 To lastRow
If Not dict.Exists(ws.Cells(i, "A").Value) Then
dict.Add ws.Cells(i, "A").Value, True
End If
Next i
'グラフを縦に並べて配置する初期位置
posTop = 20
'支店ごとにグラフを作成
For Each branch In dict.Keys
'支店ごとの行を抽出(X軸=行番号、Y軸=売上)
Set rngX = ws.Range("A1:A" & lastRow)
Set rngY = ws.Range("B1:B" & lastRow)
'グラフを追加
Set chartObj = ws.ChartObjects.Add(Left:=20, Top:=posTop, Width:=350, Height:=220)
With chartObj.Chart
.ChartType = xlColumnClustered '縦棒グラフ
.SetSourceData Source:=ws.Range("A1:B" & lastRow)
'支店名でデータをフィルタリング
.SeriesCollection(1).XValues = "=" & ws.Name & "!A2:A" & lastRow
.SeriesCollection(1).Values = "=" & ws.Name & "!B2:B" & lastRow
'余計なデータを除外するために系列のポイントを判定
Dim p As Long
For p = .SeriesCollection(1).Points.Count To 1 Step -1
If ws.Cells(p + 1, "A").Value <> branch Then
.SeriesCollection(1).Points(p).ApplyDataLabels '一時的に使用
.SeriesCollection(1).Points(p).Delete '対象外を削除
End If
Next p
'タイトル設定
.HasTitle = True
.ChartTitle.Text = branch & " 支店売上"
End With
'グラフに名前を付ける
chartObj.Name = "Chart_" & branch
'次のグラフ位置をずらす
posTop = posTop + 250
Next branch
End Sub
3. このコードの動き(解説)
● 支店一覧を辞書で取得
データの重複を除いて支店名だけを抽出します。
● グラフを縦に並べて自動配置
posTop を使い、グラフが重ならないように並べて表示します。
● 該当支店以外のデータを削除してグラフ化
SeriesCollection のポイントを削除することで、
支店単体のグラフだけを生成します。
● グラフに名前を付ける
例:
- Chart_東京
- Chart_大阪
- Chart_名古屋
あとで検索・更新しやすくなります。
4. 応用:グラフを横並びにするレイアウトも可能
例えば支店数が少ない場合は、横に並べる方が見やすいです。
Left:=20 + (col * 350)
とすることで、横方向に並べられます。
5. 応用:売上推移(時系列)グラフにも応用できる
支店名の代わりに:
- 商品カテゴリ
- プロジェクト名
- 担当者
- 年月
- 製品ライン
- 顧客区分
などを分類キーにするだけで、
どんなグループ単位のグラフも自動生成できます。
6. まとめ
- 支店別・担当者別などのグラフは VBA で一括自動生成できる
- 辞書(Dictionary)で分類一覧を抽出
- 検索→抽出→グラフ生成をループで自動化
- グラフに名前を付けると後から管理しやすい
コメント