【入門編】【中級者】ファイルサイズを肥大化させる原因となる「不要なスライドマスターやレイアウト」を自動検出してパージし、スリム化した状態で保存するマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

PowerPointが重い?それは「幽霊」のせいだ。スライドマスターを自動浄化する極限のメンテナンス術

こんにちは。現場の最前線で自動化を極めるエンジニアです。

皆さんは、数百メガバイトに膨れ上がったPowerPointファイルに絶望したことはありませんか?「数枚のスライドしかないのに、なぜこんなに重いんだ?」と。その犯人は、多くの場合「使われていないスライドマスターやレイアウト」という名の幽霊たちです。

長年使い回されたテンプレートや、コピペを繰り返した末に残骸となったレイアウトが、あなたのファイルを内側から蝕んでいます。今回は、これらを一網打尽にしてファイルを「極限までスリム化」するVBAスクリプトを伝授します。

—

1. なぜ「使われていないマスター」が肥大化を招くのか

PowerPointのファイル形式(.pptx)は、実体はXMLデータの集合体(ZIP圧縮)です。スライドマスターやレイアウトは、たとえ現在使われていなくても、ファイルの中に「定義」として残り続けます。

特に厄介なのが「コピー&ペースト」による汚染です。異なるファイルからスライドをコピペするたび、相手先のマスター情報まで一緒に持ち込まれ、ファイル内にゴミが蓄積していきます。

これを手動で消すのは至難の業です。そこで、VBAで「現在使われているレイアウト」を特定し、それ以外を強制的にパージ(削除)する仕組みを作ります。

—

2. 現場で使える「スライドマスター・クリーナー」

このコードは、「現在アクティブなスライドで使用されているレイアウト以外をすべて削除する」という荒技をやってのけます。

Sub PurgeUnusedMasters()
Dim ppt As Presentation
Dim slide As slide
Dim master As Master
Dim layout As CustomLayout
Dim dict As Object

Set ppt = ActivePresentation
Set dict = CreateObject(“Scripting.Dictionary”)

‘ 1. 現在のスライドで使用されているレイアウトを辞書に登録
For Each slide In ppt.Slides
dict(slide.CustomLayout.Name) = True
Next slide

‘ 2. マスターを巡回し、使われていないレイアウトを削除
For Each master In ppt.SlideMasters
For Each layout In master.CustomLayouts
‘ 使用リストに含まれていないレイアウトを削除
If Not dict.Exists(layout.Name) Then
On Error Resume Next ‘ 削除不可のデフォルトレイアウト対策
layout.Delete
On Error GoTo 0
End If
Next layout
Next master

MsgBox “クリーニング完了!ファイルサイズを確認してください。”
End Sub

コードのここがポイント!

  • Dictionaryオブジェクト: 「どのレイアウトが使われているか」を高速に照合するために使用しています。リストをループで回し続けるより、圧倒的に処理が速い(計算量O(n))のがポイントです。
  • On Error Resume Next: PowerPointには「削除できない必須レイアウト」が存在します。エラーで止まらないよう、あえて無視して進める「現場の知恵」です。

—

3. 陥りやすい罠:VBA初心者が気をつけるべきこと

マクロを実行する前に、以下の3点を必ず覚えておいてください。

1. 「元に戻す(Ctrl+Z)」は効かない: VBAで実行した削除操作は「元に戻す」ことができません。必ず事前にファイルのバックアップを取ってください。
2. マスターとレイアウトの関係: スライドマスターの中に「レイアウト」があり、そのレイアウトを各スライドが参照しています。この階層構造を意識しないと、思わぬ崩れ方をします。
3. 画像アセットの罠: このスクリプトはレイアウトを削除しますが、マスターに埋め込まれた「巨大な画像」は別の領域にあります。もしこれでも軽くならない場合は、画像圧縮メソッド(`CommandBars.ExecuteMso`等)を組み合わせる必要があります。

—

4. プロの自動化エンジニアからのアドバイス

「マクロの記録」から卒業した皆さんに一つだけ伝えたいことがあります。

「自動化とは、単なる効率化ではなく、リスクを管理することである」

今回のスクリプトのように、ファイルを破壊する可能性がある処理を行う場合は、必ず実行前に`ActivePresentation.SaveCopyAs`で別名保存を行うような安全策をコードに組み込んでください。

これで、あなたのPowerPointファイルは幽霊から解放され、軽快に動作するはずです。次は、このクリーニングを「保存時に自動実行する」イベント処理に挑戦してみてください。それが、自動化の真の入り口です。

何かわからないことがあれば、またいつでも聞きに来てください。あなたのコードが、より洗練されたものになるよう導きますから。

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