行数の多い集計表を扱っていると、「詳細行は普段は隠しておき、必要なときだけ展開して見たい」という場面がよくあります。Excelの「グループ化(アウトライン機能)」を使えば、行や列を折りたたんで見やすくできますが、毎回手作業で範囲選択してグループ化するのは手間です。
この記事では、VBAでセルのグループ化・アウトライン機能を自動設定する方法を、Groupメソッドの基本から、複数階層のグループ化、折りたたみ状態の制御、自動アウトライン作成まで解説します。
Groupメソッドの基本
行をグループ化するには、対象の行範囲に対して Rows.Group を実行します。列の場合は Columns.Group です。
Sub GroupRowsSample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 2〜5行目をグループ化する
ws.Rows("2:5").Group
End Sub
実行すると、シート左側にアウトライン記号(+/-ボタン)が表示され、2〜5行目をまとめて折りたたみ・展開できるようになります。
グループ化を解除する
グループを解除する場合は Ungroup メソッドを使います。
Sub UngroupRowsSample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Rows("2:5").Ungroup
End Sub
すべてのグループ化をまとめて解除したい場合は、ClearOutline メソッドを使うとシート全体のアウトライン構造を一括削除できます。
Sub ClearAllOutline()
ThisWorkbook.Worksheets("Sheet1").Outline.ClearOutline
End Sub
複数の項目ごとにグループ化する
「部署ごとに明細行をグループ化する」といった実務では、データの区切りを判定しながら繰り返しグループ化する処理を組みます。
Sub GroupByDepartment()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim startRow As Long
startRow = 2
Dim i As Long
For i = 2 To lastRow
' A列が「小計」の行を区切りとして、その手前までをグループ化する
If ws.Cells(i, "A").Value = "小計" Then
If i - 1 >= startRow Then
ws.Rows(startRow & ":" & (i - 1)).Group
End If
startRow = i + 1
End If
Next i
End Sub
「小計」行を目印にして、その直前までの明細行だけをまとめてグループ化しています。集計マクロと組み合わせれば、小計行を挿入すると同時に明細行を自動で折りたたむ、といった処理も実現できます。
グループの階層(レベル)を制御する
グループは入れ子にすることで複数階層のアウトラインを作れます。表示するレベルは Outline.ShowLevels で一括制御できます。
Sub ShowOutlineLevel()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 行のアウトラインをレベル1(最も折りたたんだ状態)まで表示
ws.Outline.ShowLevels RowLevels:=1
End Sub
RowLevels にはグループの階層番号を指定します。数値が小さいほど折りたたまれた状態になり、RowLevels:=1 はすべてのグループが折りたたまれた最上位レベルを表します。列側を制御したい場合は ColumnLevels を使います。
集計行の位置を設定する(SummaryRow)
グループ化した際、小計行(サマリー行)を明細の上に置くか下に置くかは Outline.SummaryRow プロパティで切り替えられます。
Sub SetSummaryRowPosition()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 小計行を明細行の上に表示する設定に変更してからグループ化する
ws.Outline.SummaryRow = xlAbove
ws.Rows("3:6").Group
End Sub
既定では xlBelow(明細の下に小計行)になっていますが、表のレイアウトによっては xlAbove に変更したほうが自然な見た目になります。
データから自動でアウトラインを作成する
数式(SUM関数など)で集計されている表であれば、AutoOutline メソッドを使うことで、Excelが数式の参照関係を解析して自動的にグループ化してくれます。
Sub AutoOutlineSample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Cells.AutoOutline
End Sub
手動でグループ範囲を1つずつ指定する必要がないため、すでに小計・合計の数式が入っている表であれば、この方法が最も簡単です。
まとめ
VBAでグループ化・アウトライン機能を自動化すると、大きな表の見やすさを一瞬で整えられます。
- 行は
Rows.Group、列はColumns.Groupでグループ化し、Ungroupで解除する - シート全体のアウトラインをまとめて削除するには
Outline.ClearOutlineを使う - 表示階層は
Outline.ShowLevels RowLevels:=/ColumnLevels:=で制御する - 小計行の位置は
Outline.SummaryRow = xlAboveまたはxlBelowで切り替える - 数式で集計された表なら
Cells.AutoOutlineで自動グループ化できる
大量データの集計表を作るマクロに組み込んでおくと、資料としての完成度がぐっと上がります。ぜひ試してみてください。


コメント