ここでは 複数ブックにまたがって条件付きで集計結果をグラフ化する VBAの例を紹介します。ポイントは「複数ブックをループして条件に合致するデータを集計し、その結果を統合シートにまとめたうえでグラフを作成する」ことです。
基本例:各ブックの「Data」シートのB列合計を棒グラフ化
Sub 複数ブックで集計してグラフ化()
Dim wb As Workbook
Dim ws As Worksheet
Dim destWs As Worksheet
Dim lastRow As Long
Dim totalSum As Double
Dim pasteRow As Long
' 統合先シートを指定(このブックの「Master」シート)
Set destWs = ThisWorkbook.Sheets("Master")
pasteRow = 2
' 見出し
destWs.Range("A1").Value = "ブック名"
destWs.Range("B1").Value = "合計"
For Each wb In Application.Workbooks
If wb.Name <> ThisWorkbook.Name Then
For Each ws In wb.Worksheets
' 条件:シート名が「Data」
If ws.Name = "Data" Then
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
totalSum = Application.WorksheetFunction.Sum(ws.Range("B2:B" & lastRow))
' 結果をMasterシートに書き込み
destWs.Range("A" & pasteRow).Value = wb.Name
destWs.Range("B" & pasteRow).Value = totalSum
pasteRow = pasteRow + 1
End If
Next ws
End If
Next wb
' グラフ作成
Dim chartObj As ChartObject
Set chartObj = destWs.ChartObjects.Add(Left:=300, Top:=50, Width:=400, Height:=300)
chartObj.Chart.SetSourceData Source:=destWs.Range("A1:B" & pasteRow - 1)
chartObj.Chart.ChartType = xlColumnClustered
chartObj.Chart.HasTitle = True
chartObj.Chart.ChartTitle.Text = "各ブックのDataシート合計"
End Sub
VB👉 開いているすべてのブックから「Data」シートのB列合計を集計し、Masterシートにまとめて棒グラフを作成します。
応用例1:平均値を折れ線グラフで表示
Sub 複数ブックで平均をグラフ化()
Dim wb As Workbook
Dim ws As Worksheet
Dim destWs As Worksheet
Dim lastRow As Long
Dim avgVal As Double
Dim pasteRow As Long
Set destWs = ThisWorkbook.Sheets("Master")
pasteRow = 2
destWs.Range("A1").Value = "ブック名"
destWs.Range("B1").Value = "平均"
For Each wb In Application.Workbooks
If wb.Name <> ThisWorkbook.Name Then
For Each ws In wb.Worksheets
' 条件:シート名が「Report」で始まる
If Left(ws.Name, 6) = "Report" Then
lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
avgVal = Application.WorksheetFunction.Average(ws.Range("C2:C" & lastRow))
destWs.Range("A" & pasteRow).Value = wb.Name
destWs.Range("B" & pasteRow).Value = avgVal
pasteRow = pasteRow + 1
End If
Next ws
End If
Next wb
' 折れ線グラフ作成
Dim chartObj As ChartObject
Set chartObj = destWs.ChartObjects.Add(Left:=300, Top:=400, Width:=400, Height:=300)
chartObj.Chart.SetSourceData Source:=destWs.Range("A1:B" & pasteRow - 1)
chartObj.Chart.ChartType = xlLine
chartObj.Chart.HasTitle = True
chartObj.Chart.ChartTitle.Text = "各ブックのReportシート平均"
End Sub
VB応用例2:複数条件を組み合わせて集計+グラフ化
Sub 複数条件で集計グラフ化()
Dim wb As Workbook
Dim ws As Worksheet
Dim destWs As Worksheet
Dim lastRow As Long
Dim totalSum As Double
Dim pasteRow As Long
Set destWs = ThisWorkbook.Sheets("Master")
pasteRow = 2
destWs.Range("A1").Value = "ブック名"
destWs.Range("B1").Value = "条件付き合計"
For Each wb In Application.Workbooks
If wb.Name <> ThisWorkbook.Name Then
For Each ws In wb.Worksheets
' 条件1: シート名が「Sales」で始まる
' 条件2: A1セルが「集計」と書かれている
If Left(ws.Name, 5) = "Sales" And ws.Range("A1").Value = "集計" Then
lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
totalSum = Application.WorksheetFunction.Sum(ws.Range("D2:D" & lastRow))
destWs.Range("A" & pasteRow).Value = wb.Name
destWs.Range("B" & pasteRow).Value = totalSum
pasteRow = pasteRow + 1
End If
Next ws
End If
Next wb
' 円グラフ作成
Dim chartObj As ChartObject
Set chartObj = destWs.ChartObjects.Add(Left:=750, Top:=50, Width:=400, Height:=300)
chartObj.Chart.SetSourceData Source:=destWs.Range("A1:B" & pasteRow - 1)
chartObj.Chart.ChartType = xlPie
chartObj.Chart.HasTitle = True
chartObj.Chart.ChartTitle.Text = "Salesシート条件付き合計"
End Sub
VBポイント
- 集計 →
SumやAverageを活用 - 結果を統合シートに出力 →
pasteRowを更新して追記 - グラフ作成 →
ChartObjects.Addで新しいグラフを作成 - グラフ種類 →
xlColumnClustered(棒グラフ)、xlLine(折れ線)、xlPie(円グラフ)など
練習課題
- 全ブックの「Sheet2」のB列合計を棒グラフにまとめるコードを書いてみる
- 各シートのC1セルが「Average」と書かれていたら平均を折れ線グラフにするコードを作る
- 複数条件を組み合わせて「シート名がReportで始まり、A1セルが空でないならSUM、空ならAVERAGE」を計算し、結果をグラフ化するコードを作る
こうした仕組みを作ると、複数ブックにまたがって条件付きで集計結果をグラフ化する自動化ツールが完成します。


