Excel VBA | 複数ブックにまたがって条件付きでデータを集計(SUMやAVERAGEでまとめる)

Excel VBA VBA
スポンサーリンク

ここでは 複数ブックにまたがって条件付きでデータを集計(SUMやAVERAGEでまとめる) VBAの例を紹介します。ポイントは「複数のブックをループし、条件に合致するシートやセルの値を集計して、統合シートに結果をまとめる」ことです。


基本例:各ブックの「Data」シートのB列を合計

Sub 複数ブックで合計集計()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim destWs As Worksheet
    Dim lastRow As Long
    Dim totalSum As Double
    
    ' 統合先シートを指定(このブックの「Master」シート)
    Set destWs = ThisWorkbook.Sheets("Master")
    totalSum = 0
    
    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 = totalSum + Application.WorksheetFunction.Sum(ws.Range("B2:B" & lastRow))
                End If
            Next ws
        End If
    Next wb
    
    ' 結果を統合シートに出力
    destWs.Range("A1").Value = "合計"
    destWs.Range("B1").Value = totalSum
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 totalSum As Double
    Dim totalCount As Long
    
    Set destWs = ThisWorkbook.Sheets("Master")
    totalSum = 0
    totalCount = 0
    
    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
                    totalSum = totalSum + Application.WorksheetFunction.Sum(ws.Range("C2:C" & lastRow))
                    totalCount = totalCount + Application.WorksheetFunction.Count(ws.Range("C2:C" & lastRow))
                End If
            Next ws
        End If
    Next wb
    
    ' 結果を統合シートに出力
    destWs.Range("A2").Value = "平均"
    If totalCount > 0 Then
        destWs.Range("B2").Value = totalSum / totalCount
    Else
        destWs.Range("B2").Value = "データなし"
    End If
End Sub
VB

👉 「Report」で始まるシートのC列を対象に、複数ブックにまたがって平均値を計算します。


応用例2:複数条件を組み合わせて集計

Sub 複数条件で集計()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim destWs As Worksheet
    Dim lastRow As Long
    Dim totalSum As Double
    
    Set destWs = ThisWorkbook.Sheets("Master")
    totalSum = 0
    
    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 = totalSum + Application.WorksheetFunction.Sum(ws.Range("D2:D" & lastRow))
                End If
            Next ws
        End If
    Next wb
    
    destWs.Range("A3").Value = "条件付き合計"
    destWs.Range("B3").Value = totalSum
End Sub
VB

👉 「Sales」で始まるシートかつA1セルが「集計」と書かれている場合のみ、D列の合計を統合します。


ポイント

  • 合計Application.WorksheetFunction.Sum
  • 平均 → 合計 ÷ 件数(Count を利用)
  • 複数ブックをループFor Each wb In Application.Workbooks
  • 条件判定 → シート名やセルの値を使って柔軟に設定
  • 結果を統合シートに出力destWs.Range("B1").Value = totalSum

練習課題

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

こうした仕組みを作ると、複数ブックにまたがって条件付きでデータを集計(SUMやAVERAGEでまとめる)自動化ツールが完成します。

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