【ExcelVBA・マクロ】セルのグループ化・アウトライン機能を自動設定する方法|Group・Outline.ShowLevelsの使い方【コピペOK】

ExcelVBA

行数の多い集計表を扱っていると、「詳細行は普段は隠しておき、必要なときだけ展開して見たい」という場面がよくあります。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 で自動グループ化できる

大量データの集計表を作るマクロに組み込んでおくと、資料としての完成度がぐっと上がります。ぜひ試してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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