集計ロジック(Offset × For Each 基本テンプレ集)
ここでは Offset × For Each を組み合わせて「集計・統計処理」を行うパターンを整理します。
行ごとの小計、グループ集計、累積計算など、実務でよく使う集計ロジックをまとめました。
81. 行ごとの小計を右端へ
Dim r As Range
For Each r In Range("B2:D10").Rows
r.Cells(1, r.Columns.Count).Offset(0, 1).Value = WorksheetFunction.Sum(r)
Next r
VB👉 各行の合計を右端列のさらに右隣に出力。
82. グループ単位に区切り線追加
Dim r As Range
For Each r In Range("A2:A20")
If r.Value = "GroupEnd" Then
r.EntireRow.Borders(xlEdgeBottom).LineStyle = xlContinuous
End If
Next r
VB👉 「GroupEnd」の行に区切り線を追加。
83. 月別集計を別ブロックに出力
Dim r As Range, dict As Object, pasteRow As Long
Set dict = CreateObject("Scripting.Dictionary")
For Each r In Range("B2:B100") ' 日付列
If IsDate(r.Value) Then
dict(Format(r.Value, "YYYY/MM")) = dict(Format(r.Value, "YYYY/MM")) + r.Offset(0, 1).Value
End If
Next r
pasteRow = 2
Dim k As Variant
For Each k In dict.Keys
Cells(pasteRow, 10).Value = k
Cells(pasteRow, 11).Value = dict(k)
pasteRow = pasteRow + 1
Next k
VB👉 日付列から「月別集計」を右側ブロックに出力。
84. カテゴリ別件数を右列へ
Dim r As Range
For Each r In Range("C2:C20")
If r.Value = "A" Then
r.Offset(0, 1).Value = "カテゴリA"
ElseIf r.Value = "B" Then
r.Offset(0, 1).Value = "カテゴリB"
End If
Next r
VB👉 C列のカテゴリを判定して右隣に件数ラベルを出力。
85. 最大値の行に印を付ける
Dim maxVal As Double, r As Range
maxVal = WorksheetFunction.Max(Range("D2:D20"))
For Each r In Range("D2:D20")
If r.Value = maxVal Then
r.Offset(0, 1).Value = "MAX"
End If
Next r
VB👉 D列の最大値の行に「MAX」印を付ける。
86. 合計行を最下段へ自動追加
Dim lastRow As Long
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
Range("B" & lastRow + 1).Value = WorksheetFunction.Sum(Range("B2:B" & lastRow))
VB👉 B列の合計を最下段に自動追加。
87. 平均値を右列へ
Dim r As Range
For Each r In Range("E2:E20")
r.Offset(0, 1).Value = WorksheetFunction.Average(Range("E2:E20"))
Next r
VB👉 E列の平均値を右隣に出力。
88. 累積値を下方向に計算
Dim sumVal As Double, r As Range
sumVal = 0
For Each r In Range("F2:F20")
sumVal = sumVal + r.Value
r.Offset(0, 1).Value = sumVal
Next r
VB👉 F列の値を累積計算して右隣に出力。
89. 差分を右隣に記録
Dim r As Range
For Each r In Range("G3:G20") ' 3行目から
r.Offset(0, 1).Value = r.Value - r.Offset(-1, 0).Value
Next r
VB👉 G列の値と前行との差分を右隣に記録。
90. グループ境界ごとに色付け
Dim r As Range
For Each r In Range("H2:H20")
If r.Value <> r.Offset(-1, 0).Value Then
r.EntireRow.Interior.Color = vbYellow
End If
Next r
VB👉 H列の値が前行と異なる場合、行全体を黄色で色付け。
✅ まとめ
- Offset → 隣列や上下行に集計結果を出力
- For Each → 行ごとに繰り返し処理
- WorksheetFunction → 合計・平均・最大値などの統計関数を活用
- Dictionary → 月別やカテゴリ別の集計に便利
💡 この「集計ロジック10パターン」をベースにすれば、実務で頻出する「小計・累積・差分・グループ集計」を自在に扱えます。


