🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA のアウトライン — 折りたたみレベルをコードで操作し、AutoOutline と Subtotal を使いこなす

|

Excel VBA のアウトライン — 折りたたみレベルをコードで操作し、AutoOutline と Subtotal を使いこなす

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 — レベル全体ではなく一つのノードだけを展開・折りたたむ
  • ClearOutlineRemoveSubtotal の違い — 畳み方だけを消すか、畳み方 挿入された行の両方を消すか

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 を使い、合計を残したいかどうかに合わせて ClearOutlineRemoveSubtotal を選びます。 ブックとコードはあなたの手元に残ります。

よくある質問

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