TL;DR — アウトライン は、あらゆる グループ化 が土台にしているオ ブジェクトです。一度存在すれば、それを通してシート全体を操作できます。
ws.Outline.ShowLevels RowLevels:=2, ColumnLevels:=1は、一回の呼び出しですべてのグループをあるレベルまで折りたたんだり展 開したりでき、.Hiddenをループで操作するよりはるかに優れています。Excel はアウトラインを 代わり に 組み立てることもできます。AutoOutlineは集計式を読み取り、Subtotalは合計・グループ・アウト ラインを一度に挿入します。
Sub CollapseToTotals()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Report")
ws.Outline.ShowLevels RowLevels:=2, ColumnLevels:=1 ' 一回の呼び出しで両方の軸をあるレベルにする
End Sub
行のグループ化も列のグループ化も、どちらも この オブジェクトに帯を追加しているにすぎません。アウト
ラインを直接操作する方法を身につけること — レベルで折りたたむ、数式から Excel に自動で組み立てさせる、
小計で生成する、そしてきれいにリセットする — これこそが、.Group の呼び出しの寄せ集めを、必要なときに
畳んだり開いたり作り直したりできるレポートに変えてくれます。
この記事で学べること
ShowLevels— シート全体をあるレベルまで折りたたんだり展開したりする、一回の呼び出しで両方の軸をAutoOutline— 数式から Excel にアウトラインを組み立てさせる方法、そして数式がないと失敗する理由Subtotal— 合計・グループ・アウトラインをまとめて自動生成する方法、そして再実行で積み重なる罠ShowDetail— レベル全体ではなく一つのノードだけを展開・折りたたむClearOutlineとRemoveSubtotalの違い — 畳み方だけを消すか、畳み方 と 挿入された行の両方を消すか
ShowLevels:シート全体をレベルで折りたたむ
アウトラインはグループをレベルに整理します — レベル 1 が最も折りたたまれた状態(合計だけ)で、数字が
大きくなるほど詳細が表示されます。ShowLevels は .Hidden に一切触れることなく、シートを直接あるレ
ベルに設定します。
ws.Outline.ShowLevels RowLevels:=1 ' 行:トップレベルだけを表示(合計のみ)
ws.Outline.ShowLevels RowLevels:=3 ' 行:3 レベル分まで展開する
ws.Outline.ShowLevels RowLevels:=2, ColumnLevels:=1 ' 両方の軸を一度に設定する
行と列は独立した軸なので、一方だけを渡してもう一方には触れないでおくことができます。知っておく価値の
あることが二つあります。引数なしの ShowLevels は何もしません — 少なくとも一つの軸を渡す必要がありま
す。そして、一番深いグループより大きいレベルを渡しても、その軸が完全に展開されるだけで、エラーにはな
りません。これは、手作りの .Hidden = True/False ループをすべて置き換える道具であり、アウトラインの
ボタンを正直に保ってくれます。
AutoOutline:数式が裏付けていれば、Excel に組み立てさせる
AutoOutline は、あなたの数式を読み取って 自動的にアウトラインを組み立てます。N 列が
=SUM(B2:M2) で B 列から M 列を合計しており、小計行がその上の行を合計しているなら、Excel は構造を推測
し、代わりにグループを描いてくれます。
ws.UsedRange.AutoOutline ' 集計式からグループを推測する
落とし穴は — そして人々がこれを「壊れている」と報告する理由は — これが 魔法ではない という点です。
AutoOutline が読み取るには、一貫した集計式が必要です。SUM/SUBTOTAL の構造がない単なる値のブロック
に向けると、実行時エラー 1004「Cannot create an outline」で失敗します。
On Error Resume Next
ws.UsedRange.AutoOutline
If Err.Number <> 0 Then MsgBox "No summary formulas to outline" ' 構造化されていないデータでは想定内
On Error GoTo 0
つまり、AutoOutline が正解なのは数式で構造化されたレポートに対してで、フラットなデータの塊に対しては
不正解です。データにまだ合計がない場合、それを 追加する 道具が Subtotal です。
Subtotal:合計・グループ・アウトラインを一回の呼び出しで
Range.Subtotal は、この作業全体を一度にこなす機能です — キー列の値が変わるたびに SUBTOTAL(9, ...)
という数式を使った小計行を挿入し、その下の詳細をグループ化し、全体にアウトラインを組み立てます。
ws.Range("A1:D200").Subtotal _
GroupBy:=1, _ ' 列 1 の値が変わるたびに小計する
Function:=xlSum, _
TotalList:=Array(4) ' 列 4 を合計する
Subtotal で一番多いバグは、再実行することです。2 回目の呼び出しは 1 回目を置き換えるのではなく、既
存の小計の 中に 新しい小計の集合を 積み重ねます。ちょうど .Group を再実行したときと同じよう
に、実行するたびにアウトラインが一段深く入れ子になります。作り直す前に取り除きましょう。
ws.Range("A1:D200").RemoveSubtotal ' 先に挿入された行とアウトラインの両方を取り除く
ws.Range("A1:D200").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4)
' - または - Replace:=True を渡し、一回の呼び出しで既存の集合を上書きする
ShowDetail:一つのノードだけを展開・折りたたむ
ShowLevels はシート全体を動かし、ShowDetail は一つのグループを動かします。集計行や集計列に設定す
れば、そのノードだけを展開・折りたたみできます。
ws.Rows(6).ShowDetail = True ' 集計行が 6 行目であるグループを展開する
ws.Rows(6).ShowDetail = False ' そのグループだけを折りたたむ
レポート全体を均一な表示にしたいときは ShowLevels を、月別のブロックや特定の部署など一つのセクショ
ンだけを開いて残りは畳んだままにしたいときは ShowDetail を使いましょう。
ClearOutline と RemoveSubtotal
リセットの方法は二つあり、違いはそれぞれが何を一緒に持ち去るかです。
ClearOutlineは 畳み方 だけを取り除き、それ以外には何もしません。行も小計行も数式もすべて残 り、グループ化の構造だけが消えます。ws.Cells.ClearOutlineはシート全体で一掃します。RemoveSubtotalは畳み方 と 挿入された小計行の両方を取り除き、範囲を最初の生データへ戻します。
意図に応じて選びましょう。合計は残したいが折りたたみ機能だけ外したいなら ClearOutline、小計する前の
データをそのまま取り戻したいなら RemoveSubtotal です。小計を取り消すつもりで ClearOutline に手を
伸ばすと、挿入された合計行がアウトラインで整理されないままデータの中に取り残されてしまいます。
ExcelMaster の活用
アウトラインは、混同しやすい四つの動詞を持つ小さなオブジェクトです — ShowLevels はシート全体を動か
し、ShowDetail は一つのノードを動かし、AutoOutline は数式に裏付けられているときだけ機能し、
Subtotal は先に取り除いておかないと再実行時に静かに積み重なります。どれを選び間違えても、エラーも出
さずに失敗します。フラットなデータで 1004 を投げる AutoOutline、一段深く入れ子になった二重の小計、ある
いは畳み方は外すのに合計行を取り残す ClearOutline といった具合です。
ExcelMaster には、望むことをその
まま伝えられます — 「地域ごとに売上を小計して、合計まで折りたたんで、もう一度実行しても二重にしないで」
— すると、作り直す前に以前の小計を取り除き、ShowLevels で折りたたみ、数式が裏付けている場所だけで
AutoOutline を使い、合計を残したいかどうかに合わせて ClearOutline か RemoveSubtotal を選びます。
ブックとコードはあなたの手元に残ります。
よくある質問
VBA でアウトラインを折りたたんだり展開したりするには?
ShowLevels を使います。ws.Outline.ShowLevels RowLevels:=1 は行をトップレベル(合計のみ)まで折り
たたみ、数字を大きくするとより多くの詳細が展開されます。同じ呼び出しに ColumnLevels を加えれば、列
の軸も一緒に操作できます。シート全体を一度に設定し、.Hidden を手動で設定するのとは違い、アウトライン
のボタンを同期させたままにしてくれます。
なぜ AutoOutline はエラー 1004「Cannot create an outline」を返すのですか?
AutoOutline は集計式を読み取ってアウトラインを組み立てますが、読み取るものがないからです — 範囲が
SUM/SUBTOTAL の構造を持たないフラットな値だからです。先に集計式や小計を追加するか、
Range.Subtotal を使って挿入しましょう。AutoOutline は数式で構造化されたレポート向けであり、生のデー
タの塊向けではありません。
マクロを 2 回実行すると、なぜ小計が二重になるのですか?
Subtotal は既存の集合を置き換えるのではなく、その中に新しい集合を積み重ねるからです。再度小計する前
に Range.RemoveSubtotal を呼ぶか、Subtotal の呼び出しに Replace:=True を渡しましょう。そうすれ
ば、実行するたびに一段深く入れ子になるのではなく、毎回一つのきれいな集合になります。
ClearOutline と RemoveSubtotal の違いは何ですか?
ClearOutline はグループ化の構造だけを取り除き、小計行を含むすべての行をそのまま残します。
RemoveSubtotal はアウトライン と 挿入された小計行の両方を取り除き、範囲を元のデータへ戻します。折
りたたみ機能だけを外すなら ClearOutline、小計を完全に取り消すなら RemoveSubtotal を使いましょう。
アウトライン全体ではなく、一つのグループだけを展開するには?
そのグループの集計行または集計列に ShowDetail を設定します。ws.Rows(6).ShowDetail = True は集計
行が 6 行目であるグループを展開し、= False はそれを折りたたみます。他のグループはそのままです。シー
ト全体を均一に表示したいなら ShowLevels を、一度に一つのセクションを操作したいなら ShowDetail を
使いましょう。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-16。
関連ガイド: VBA 行のグループ化 · VBA 列のグループ化 · VBA ピボットテーブル · VBA WorksheetFunction · VBA UsedRange
