発展練習問題:部署ごとの売上レポート
では「部署ごとの売上を集計してレポートにする」発展問題を作ってみます。実務でありがちな「部門別集計」を題材にしますね。
問題設定
- A列:部署名(例:営業、開発、総務…)
- B列:売上金額
- データは A2:B7 に入力されているとします。
このデータを集計して、セル D2 に次のようなレポートを作成してください。
部署別売上レポート
日付: 2025/10/17
担当者: 山田太郎
----------------
営業: 300000円
開発: 250000円
総務: 120000円
----------------
合計: 670000円
平均: 223333.33円
回答例コード
Sub DeptSalesReport()
Dim lastRow As Long
Dim i As Long
Dim dept As String
Dim sales As Double
Dim dict As Object
Dim report As String
Dim total As Double
Dim count As Long
Dim today As String
Dim staff As String
' ヘッダー情報
today = Format(Date, "yyyy/mm/dd")
staff = "山田太郎"
' 部署ごとの売上を集計するためにDictionaryを使う
Set dict = CreateObject("Scripting.Dictionary")
' 最終行を取得(A列の最終行)
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
' データをループして集計
For i = 2 To lastRow
dept = Range("A" & i).Value
sales = Range("B" & i).Value
If dict.Exists(dept) Then
dict(dept) = dict(dept) + sales
Else
dict.Add dept, sales
End If
total = total + sales
count = count + 1
Next i
' レポート作成
report = "部署別売上レポート" & vbLf & _
"日付: " & today & vbLf & _
"担当者: " & staff & vbLf & _
"----------------" & vbLf
For Each dept In dict.Keys
report = report & dept & ": " & dict(dept) & "円" & vbLf
Next dept
report = report & "----------------" & vbLf & _
"合計: " & total & "円" & vbLf & _
"平均: " & Format(total / count, "0.00") & "円"
' 出力
Range("D2").Value = report
End Sub
VB解説
- Dictionary を使って「部署ごとに売上を合計」している。
dict.Exists(dept)で既に部署が登録されていれば加算、なければ新規追加。- 合計と平均は全体の売上を集計して最後に計算。
- vbLf を使ってセル内で改行。
- ヘッダーに「日付」「担当者」を入れることで、実務的なレポート形式になる。
発展アイデア
- 部署ごとに「件数」も数えて平均売上を出す
- 部署ごとに「最高売上」「最低売上」を出す
- MsgBoxで表示するバージョンを作る
👉 この課題をマスターすると「Excelで入力されたデータをVBAで自動集計 → レポート化」という実務の王道パターンが身につきます。

