非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【ExcelVBA】データ整理の効率化!グループ化機能をVBAで設定する方法

   

はじめに

Excelの「グループ化」機能は、大量のデータを扱う際に特定の行や列をまとめて表示・非表示を切り替えることで、シートの可読性を大幅に向上させます。手動での設定も簡単ですが、定型的なレポート作成やデータ分析の自動化においては、VBAでこのグループ化を設定できると非常に強力です。

この記事では、Excel VBAを使って行や列をグループ化・解除する方法、そしてグループの表示・非表示を制御する方法を、具体的なサンプルコードを交えて解説します。現場で今すぐ役立つテクニックを習得し、日々の業務効率化に役立ててください。

グループ化の基本

グループ化とは?

Excelのグループ化機能(アウトライン機能とも呼ばれます)は、関連する行や列をまとめて折りたたみ、必要に応じて展開する機能です。これにより、シート全体をスクロールすることなく、必要な情報に素早くアクセスできるようになります。特に、集計行や詳細データを含むシートで威力を発揮します。

手動での設定方法(復習)

VBAでの操作を理解するために、手動での設定方法を簡単に復習しましょう。

  • グループ化したい行または列を選択します。
  • 「データ」タブ → 「アウトライン」グループ → 「グループ化」をクリックします。
  • 「行」または「列」を選択して「OK」をクリックします。

これにより、選択範囲の左または上に、グループの展開/折りたたみボタンが表示されます。

VBAでグループ化を設定する

ここからが本題です。VBAを使ってグループ化を設定・操作する方法を見ていきましょう。

行をグループ化する

特定の行範囲をグループ化するには、RangeオブジェクトのGroupメソッドを使用します。

Sub 行をグループ化する()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1") '対象シートを指定
    
    '例: 5行目から10行目までをグループ化
    ws.Rows("5:10").Group
    
    MsgBox "5行目から10行目をグループ化しました。", vbInformation
End Sub
 

 

ws.Rows("5:10").Group は、Sheet1の5行目から10行目までをグループ化します。

 

列をグループ化する

行と同様に、特定の列範囲をグループ化するには、RangeオブジェクトのGroupメソッドを使用します。

Sub 列をグループ化する()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1") '対象シートを指定
    
    '例: C列からE列までをグループ化
    ws.Columns("C:E").Group
    
    MsgBox "C列からE列をグループ化しました。", vbInformation
End Sub
 

 

ws.Columns("C:E").Group は、Sheet1のC列からE列までをグループ化します。

 

グループを解除する

グループ化を解除するには、RangeオブジェクトのUngroupメソッドを使用します。

Sub グループを解除する()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1") '対象シートを指定
    
    '例: 5行目から10行目までのグループを解除
    ws.Rows("5:10").Ungroup
    
    '例: C列からE列までのグループを解除
    ws.Columns("C:E").Ungroup
    
    MsgBox "指定範囲のグループ化を解除しました。", vbInformation
End Sub
 

 

Ungroupメソッドは、指定した範囲に存在するグループを解除します。範囲がグループの一部であれば、その部分のグループが解除されます。

グループの表示/非表示を切り替える

グループの展開・折りたたみは、OutlineオブジェクトのShowLevelsメソッドで制御します。

Sub グループの表示切り替え()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1") '対象シートを指定
    
    '行のグループをすべて展開(最も詳細なレベルまで表示)
    ws.Outline.ShowLevels RowLevels:=8 'Excelの最大レベルは8
    
    MsgBox "行のグループをすべて展開しました。", vbInformation
    
    '行のグループをすべて折りたたみ(最も上位のレベルのみ表示)
    ws.Outline.ShowLevels RowLevels:=1
    
    MsgBox "行のグループをすべて折りたたみました。", vbInformation
    
    '列のグループをすべて展開
    ws.Outline.ShowLevels ColumnLevels:=8
    
    MsgBox "列のグループをすべて展開しました。", vbInformation
    
    '列のグループをすべて折りたたみ
    ws.Outline.ShowLevels ColumnLevels:=1
    
    MsgBox "列のグループをすべて折りたたみました。", vbInformation
End Sub
 

 

  • RowLevelsまたはColumnLevelsに表示したいレベルの数を指定します。
  • 1を指定すると最も上位のグループのみが表示され、詳細なデータは折りたたまれます。
  • 8(Excelの最大アウトラインレベル)を指定すると、すべてのグループが展開され、詳細なデータがすべて表示されます。
ネストされたグループを作成する

複数の範囲をグループ化することで、入れ子になった(ネストされた)グループを作成できます。VBAでも同様に、段階的にGroupメソッドを適用することで実現できます。

Sub ネストされたグループを作成する()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1") '対象シートを指定
    
    '既存のグループをすべて解除(初期化)
    On Error Resume Next 'グループが存在しない場合のエラーを無視
    ws.Cells.Ungroup
    On Error GoTo 0
    
    '例: 階層的な行のグループ化
    'まず大きなグループを作成 (例: 10-20行目)
    ws.Rows("10:20").Group
    'その中に小さなグループを作成 (例: 12-15行目)
    ws.Rows("12:15").Group
    'さらに小さなグループを作成 (例: 17-18行目)
    ws.Rows("17:18").Group
    
    '作成されたグループをレベル2まで表示(中間のグループまで展開)
    ws.Outline.ShowLevels RowLevels:=2
    
    MsgBox "ネストされたグループを作成し、レベル2まで表示しました。", vbInformation
End Sub
 

 

ネストされたグループを作成する際は、まず最も外側のグループから作成し、次にその内側のグループを作成していくと良いでしょう。

まとめ

Excelのグループ化機能をVBAで制御する方法を学びました。GroupメソッドとUngroupメソッドでグループの作成と解除を行い、Outline.ShowLevelsメソッドで表示レベルを調整できます。

これらのVBAコードを活用することで、以下のような業務の自動化が可能になります。

  • 定型レポート作成時に、特定の詳細データを自動で折りたたんで提供する。
  • データ分析ツールで、ユーザーの操作に応じて表示する情報の粒度を動的に変更する。
  • 大量のデータをインポート後、自動的に見やすいアウトライン構造を設定する。

ぜひこれらのテクニックをあなたのExcelVBAスキルに取り入れ、よりスマートな業務自動化を実現してください。

スポンサーリンク

 - Excel, VBA