グループ化の表示方法は階層単位とグループ単位の2通り

Excelで行や列のグループ化を行ったあとに、「+」「-」ボタンでの表示(展開)と非表示(折りたたみ)の操作をマクロで行うことが出来ます。

その際に階層レベルで行うか、グループ単位で行うかが異なります。

階層レベルとは数字ボタンを押した際に表示・非表示される単位のことを指し、グループ単位とは連続するセル部分の+ボタンと-ボタンを指します。

グループ化の操作は階層単位とグループ単位で異なる

Excelのグループ化には以下の2つの操作方法があります。

種類 操作場所 VBA制御
階層単位 ワークシート左上の「1」「2」等のボタン ShowLevels で可能
グループ単位 セルの左側に出る「+」「−」ボタン マクロの記録機能では保存できない。工夫が必要。

階層単位とグループ単位ではマクロが異なります。階層レベルであればShowLevelsメソッドを使う単純なマクロで実現できますが、個別のグループ単位の場合は工夫が必要になります。

ワークシート左上にある階層単位の数字の1や2などのボタン操作であれば、マクロの記録機能で保存することができます。ところがグループ単位の操作では+ボタンもしくは-ボタン操作は、マクロの記録機能で保存しようと思っても残念ながら保存されません

このように、階層単位の数字ボタンでは保存できるのに、グループ単位の+ボタンと-ボタンでは保存できない違いがあります。この理由は後述します。

なお、このページではグループ化の表示と非表示を行うマクロについて書いているため、設定と解除については別ページ「グループ化の設定と解除」をご参照ください。

階層単位(1、2、3の数字ボタン)のVBAでの表示、非表示方法

階層単位(数字ボタン)でのグループ化の表示と非表示のコードは全く同じものになります。これはShowLevelsメソッドの動作によるものです。

どういうことかというと、表示するかしないか、という処理を行うのではなく、数字ボタンの何階層目を表示させるか、ということを指定することになるためです。

以下のShowLevelsメソッドは階層の番号ボタンを押したときと同じことを実現します。

階層単位の1ボタンを押した場合(グループ化している行が全て非表示になる)

以下のコードは階層単位の1ボタンを押したときと同じ内容です。

1ボタンを押したときはグループ化をしていない行だけを表示するため、グループ化している行は全て非表示の状態になります。

階層単位の2ボタンを押した場合

以下のコードも先のと同様、2ボタンを押したときと同じ内容になります。

RowLevelsを指定した場合は行階層の処理を行います。

なお、列階層の処理を行う場合はColumnLevelsプロパティを使います。使い方はRowLevelsと同じです。

個別のグループ化の表示と非表示を行う方法

先の通り、グループ化の表示と非表示のために用意されているメソッドはShowLevelsのみです。個別のグループ化の+ボタンと-ボタンのためのメソッドは用意されていないため、マクロの記録機能では何も保存されません

では、個別のグループ化している+ボタンや-ボタンを押したときの処理を行いたいときはどうすればよいかというと、ちょっと工夫が必要です。工夫というのは、GroupメソッドとShowLevelsメソッドの特性を利用します。

Groupメソッドはグループ化を行うメソッドですが、実行した際は表示状態になります。-ボタンが表示されている状態です。

ShowLevelsメソッドは現時点のグループ化の個所にのみ処理が行われます。そのため、ShowLevelsメソッドを実行したあとに作成されたグループ化の部分には関知しません。

これらの特性を利用して、グループ化を行う順番とShowLevelsメソッドを行うタイミングにより、表示したいグループ化の部分と非表示にしたいグループ化の部分を分けることが出来ます。

以下が個別のグループ化の表示対応用のソースコードです。

個別グループ化用ソースコード

実行後はこのようになります。

ソースコードの説明

  1. 既存のグループ化を、3行目のClearOutlineでいったん解除します。これは表示と非表示のグループ化の切り分けが個別に出来ないため、一度全て無しにしています。
  2. 次に、6行目と7行目で非表示にしたい個所のグループ化を行い、10行目でその部分を非表示にします。ここでのShowLevelsメソッドは6行目と7行目で作成したグループ化の部分に対してのみ処理が行われます。
  3. 最後に、表示状態にしたいグループ化部分を作成します。ここでのソースコードはグループ化を1つ作った状態ですので単純ですが、階層が複数の場合はShowLevelsメソッドを複数回呼び出す場合もあるでしょうから、その場合は処理が複雑になります。

ポイント:処理の順番が重要

  • ShowLevels は 既存のグループにのみ作用 します。
  • あとから作ったグループには影響しないため、「表示したいグループ」は後で作ることで展開状態になります。

まとめ:階層単位かグループ単位かでアプローチが変わる

やりたいこと 対応方法
階層レベルごとにまとめて制御したい ShowLevels を使う
特定のグループだけ展開/折りたたみたい Group+ShowLevelsを活用

整理するとこのようになります。グループ化の制御を行うマクロが必要になるのは、結構レアケースだと思いますが、一斉に閉じたい場合