Excel VBA | 複数ブックにまたがって条件付きで集計結果をグラフ化する

Excel VBA VBA
スポンサーリンク

ここでは 複数ブックにまたがって条件付きで集計結果をグラフ化する 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

ポイント

  • 集計SumAverage を活用
  • 結果を統合シートに出力pasteRow を更新して追記
  • グラフ作成ChartObjects.Add で新しいグラフを作成
  • グラフ種類xlColumnClustered(棒グラフ)、xlLine(折れ線)、xlPie(円グラフ)など

練習課題

  1. 全ブックの「Sheet2」のB列合計を棒グラフにまとめるコードを書いてみる
  2. 各シートのC1セルが「Average」と書かれていたら平均を折れ線グラフにするコードを作る
  3. 複数条件を組み合わせて「シート名がReportで始まり、A1セルが空でないならSUM、空ならAVERAGE」を計算し、結果をグラフ化するコードを作る

こうした仕組みを作ると、複数ブックにまたがって条件付きで集計結果をグラフ化する自動化ツールが完成します。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました