【VBA】各項目ごとにグラフを自動作成する(例:支店別売上グラフ)

複数の分類(支店・担当者・商品カテゴリなど)ごとに、
グラフを一括で自動生成したい
というニーズは実務で非常に多くあります。

例えば「支店別売上」をグラフ化する場合、

  • 支店が 5 つならグラフ 5 個
  • 支店が 20 ならグラフ 20 個

を手作業で作成するのは大変です。

本記事では、
分類項目ごとに自動でグラフを量産する VBA の作り方
を、初心者でもわかりやすく、かつ実務で使える形で解説します。


1. データ構造と自動生成の考え方

まず大前提として、データが以下のような構造であることを想定します。

A列:支店名B列:売上
東京100
大阪150
名古屋120
東京80
大阪90

このデータを基に、
支店ごとに売上をまとめ、支店単位でグラフを自動作成
します。

自動生成の流れは以下のとおりです。

  1. 支店名一覧を抽出する
  2. 支店ごとのデータ範囲を抽出
  3. グラフを自動作成
  4. 名前を付けて管理する(後工程で便利)

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)で分類一覧を抽出
  • 検索→抽出→グラフ生成をループで自動化
  • グラフに名前を付けると後から管理しやすい

コメント

タイトルとURLをコピーしました