グラフの自動作成
「毎回のグラフ作りをボタンひとつで終わらせたい」——基本から応用まで、使い回せるテンプレをまとめました。棒・折れ線・円、複数系列、テーブル連動、カテゴリごとに量産、レイアウト・書式の自動調整まで、初心者でも壊れない形で説明します。
最短テンプレ:範囲からグラフを作る
Sub CreateBarChart_Basic()
'A1:B10のデータを棒グラフ化
Dim ws As Worksheet: Set ws = ActiveSheet
Dim ch As ChartObject
Set ch = ws.ChartObjects.Add(Left:=100, Top:=60, Width:=400, Height:=300)
With ch.Chart
.ChartType = xlColumnClustered '棒グラフ
.SetSourceData Source:=ws.Range("A1:B10")
.HasTitle = True
.ChartTitle.Text = "売上データ"
.Axes(xlValue).HasTitle = True
.Axes(xlValue).AxisTitle.Text = "金額"
.Axes(xlCategory).HasTitle = True
.Axes(xlCategory).AxisTitle.Text = "カテゴリ"
End With
End Sub
VB- ポイント: ChartObjects.Addで領域を作り、ChartTypeとSetSourceDataを指定すれば最短で完成。タイトルや軸ラベルは最初に一緒に設定すると毎回整う。
種類別テンプレ:折れ線・円・複合
Sub CreateLineChart()
Dim ws As Worksheet: Set ws = ActiveSheet
Dim ch As ChartObject: Set ch = ws.ChartObjects.Add(120, 60, 420, 280)
With ch.Chart
.ChartType = xlLine '折れ線
.SetSourceData ws.Range("A1:C13") '日付×複数系列など
.HasTitle = True
.ChartTitle.Text = "月次推移"
.Axes(xlCategory).CategoryType = xlCategoryScale
End With
End Sub
Sub CreatePieChart()
Dim ws As Worksheet: Set ws = ActiveSheet
Dim ch As ChartObject: Set ch = ws.ChartObjects.Add(560, 60, 320, 320)
With ch.Chart
.ChartType = xlPie '円グラフ
.SetSourceData ws.Range("A1:B6")
.HasLegend = True
.HasTitle = True
.ChartTitle.Text = "構成比"
End With
End Sub
Sub CreateComboChart_BarLine()
'棒+折れ線の複合(第2軸使用)
Dim ws As Worksheet: Set ws = ActiveSheet
Dim ch As ChartObject: Set ch = ws.ChartObjects.Add(100, 380, 520, 320)
With ch.Chart
.SetSourceData ws.Range("A1:C13") 'A=カテゴリ/日付, B=数量(棒), C=単価(線)
.ChartType = xlColumnClustered
.HasTitle = True
.ChartTitle.Text = "数量と単価"
'2系列目を折れ線+第2軸
.SeriesCollection(2).ChartType = xlLine
.SeriesCollection(2).AxisGroup = xlSecondary
.Axes(xlValue, xlSecondary).HasTitle = True
.Axes(xlValue, xlSecondary).AxisTitle.Text = "単価"
End With
End Sub
VB- ポイント: ChartTypeを変えるだけで主な種類は作れる。複合はSeriesCollectionで系列ごとにタイプ・軸を切り替える。
元データをテーブル化して自動拡張に対応
Sub CreateChart_FromTable()
'データをテーブル化→行追加でも自動追従
Dim ws As Worksheet: Set ws = Worksheets("データ")
Dim lo As ListObject
On Error Resume Next
Set lo = ws.ListObjects(1)
On Error GoTo 0
If lo Is Nothing Then
Set lo = ws.ListObjects.Add(xlSrcRange, ws.Range("A1").CurrentRegion, , xlYes)
lo.Name = "売上テーブル"
End If
Dim ch As ChartObject
Set ch = ws.ChartObjects.Add(Left:=100, Top:=60, Width:=420, Height:=300)
With ch.Chart
.ChartType = xlColumnClustered
.SetSourceData Source:=ws.Range(lo.Name) 'テーブル名で参照
.HasTitle = True
.ChartTitle.Text = "テーブル連動グラフ"
End With
End Sub
VB- ポイント: テーブル化しておくと行が増えても範囲再指定不要。グラフ更新はデータ変更後の再計算で自動反映されやすい。
カテゴリごとにグラフを量産(支店別など)
Sub CreateCharts_ByCategory()
'Sheet1: A=支店名, B=売上。支店ごとに棒グラフを縦に並べて生成
Dim ws As Worksheet: Set ws = Worksheets("Sheet1")
Dim last As Long: last = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'支店名のユニーク収集
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim r As Long
For r = 2 To last
If Len(ws.Cells(r, "A").Value) > 0 Then dict(ws.Cells(r, "A").Value) = True
Next
'縦に配置
Dim posTop As Long: posTop = 60
Dim key As Variant
For Each key In dict.Keys
'対象支店のデータ範囲抽出(簡易フィルタなしの直描画)
'実用では抽出用の一時範囲を作るか、系列にXValues/Valuesを個別設定
Dim ch As ChartObject
Set ch = ws.ChartObjects.Add(Left:=60, Top:=posTop, Width:=420, Height:=260)
With ch.Chart
.ChartType = xlColumnClustered
.HasTitle = True
.ChartTitle.Text = "支店別売上 - " & CStr(key)
'系列を手動設定(X軸:行番号、Y軸:支店一致の値)
.SeriesCollection.NewSeries
.SeriesCollection(1).Name = CStr(key)
.SeriesCollection(1).XValues = ws.Range("B1:B" & last) '凡例用の見出し・軸は適宜調整
.SeriesCollection(1).Values = ws.Evaluate("IF(A2:A" & last & "=""" & key & """,B2:B" & last & ",NA())")
End With
posTop = posTop + 280
Next
End Sub
VB- ポイント: ユニークカテゴリごとにグラフを自動生成し、配置位置をずらす。記事の例のように縦並び・命名・削除再作成などの運用で量産が楽になる。
レイアウト・書式の自動整形
- サイズ・位置を統一:
- 例: ChartObjects.AddのLeft/Top/Width/Heightを定数にする。複数グラフは行列配置ロジックで並べる。
- 凡例・データラベル:
- 例:
.HasLegend = True、.SeriesCollection(i).ApplyDataLabels。円グラフは割合表示を追加。
- 例:
- 色・線・軸のカスタム:
- 例:
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(79,129,189)、.Axes(xlValue).MinimumScale = 0。
- 例:
- タイトル・軸ラベルの共通化:
- 例:
.ChartTitle.Text = "月次売上",.Axes(xlCategory).AxisTitle.Text = "月"。
- 例:
ボタンで一括作成・更新
Sub BuildAllCharts()
Application.ScreenUpdating = False
'既存グラフ削除(必要なら)
Dim ws As Worksheet: Set ws = ActiveSheet
Dim i As Long
For i = ws.ChartObjects.Count To 1 Step -1
ws.ChartObjects(i).Delete
Next
'テンプレ呼び出し
Call CreateBarChart_Basic
Call CreateLineChart
Call CreatePieChart
'カテゴリ量産など
'Call CreateCharts_ByCategory
Application.ScreenUpdating = True
End Sub
VB- ポイント: 既存グラフを掃除してからテンプレ群を呼べば、レポートを毎回同じレイアウトで再生成できる。
よくある落とし穴と対策
- ラベルと数値の列が逆で意図しない軸になる
- 対策: SetSourceDataで見出し行を含む縦2列(カテゴリ・値)を渡す。必要に応じてSeriesCollectionでXValues/Valuesを明示。
- 元データの行追加で範囲が切れる
- 対策: テーブル化してテーブル名で参照。グラフは範囲拡張に追随しやすい。
- 凡例や系列名が空で見づらい
- 対策: 見出し行を必ず含めるか、SeriesCollection(i).Nameで明示的に設定。
- 大量のグラフでレイアウトが崩れる
- 対策: 位置・サイズを関数化し、行列レイアウトで規則的に配置。必要なら1シート1カテゴリに分割。
- 自動更新が欲しい
- 対策: ボタンで再生成、またはWorksheet_Change/Workbook_Openで再ビルドを呼ぶ(更新頻度が高い場合は手動ボタン推奨)。
例題で練習
'例1:A1:B10を棒グラフで作る
Sub Example_Bar()
Call CreateBarChart_Basic
End Sub
'例2:A1:C13の推移を折れ線で作る
Sub Example_Line()
Call CreateLineChart
End Sub
'例3:A1:B6の構成比を円で作る
Sub Example_Pie()
Call CreatePieChart
End Sub
'例4:テーブル連動のグラフ
Sub Example_Table()
Call CreateChart_FromTable
End Sub
'例5:カテゴリ(支店)ごとにグラフ量産
Sub Example_ByCategory()
Call CreateCharts_ByCategory
End Sub
'例6:ボタンで一括作成・更新
Sub Example_BuildAll()
Call BuildAllCharts
End Sub
VB