発展練習問題
ここからは「月ごとの売上をまとめる」「部署ごとに集計する」という、実務でよくある集計課題に発展させてみましょう。
問題1:月ごとの売上をまとめる
データ例
- A列:日付(例:2025/01/05, 2025/01/20, 2025/02/10 …)
- B列:売上金額
課題
- 月ごとに売上を合計し、セル D2 以降に次のように表示してください。
2025/01: 300000円
2025/02: 250000円
2025/03: 400000円
回答例
Sub MonthlySalesReport()
Dim lastRow As Long, i As Long
Dim salesDate As Date, monthKey As String
Dim sales As Double
Dim dict As Object
Dim report As String
Set dict = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
salesDate = Range("A" & i).Value
sales = Range("B" & i).Value
monthKey = Format(salesDate, "yyyy/mm")
If dict.Exists(monthKey) Then
dict(monthKey) = dict(monthKey) + sales
Else
dict.Add monthKey, sales
End If
Next i
For Each monthKey In dict.Keys
report = report & monthKey & ": " & dict(monthKey) & "円" & vbLf
Next monthKey
Range("D2").Value = report
End Sub
VB解説
Format(日付, "yyyy/mm")で「年月」単位にまとめる。- Dictionaryを使って月ごとに売上を合計。
- 出力はセルに改行付きでまとめる。
問題2:部署ごとに売上を集計する
データ例
- A列:部署名(営業、開発、総務など)
- B列:売上金額
課題
- 部署ごとに売上を合計し、セル E2 に次のように表示してください。
営業: 300000円
開発: 250000円
総務: 120000円
回答例
Sub DeptSalesReport()
Dim lastRow As Long, i As Long
Dim dept As String, sales As Double
Dim dict As Object
Dim report As String
Set dict = CreateObject("Scripting.Dictionary")
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
Next i
For Each dept In dict.Keys
report = report & dept & ": " & dict(dept) & "円" & vbLf
Next dept
Range("E2").Value = report
End Sub
VB解説
- 部署名をキーにして売上を合計。
- Dictionaryを使うと「同じ部署が複数行に出てきても合計できる」。
発展アイデア
- 月 × 部署 のクロス集計(ピボットテーブル的な処理)
- 合計・平均・最大・最小 を部署ごとに出す
- グラフ化して視覚的に確認

