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

スポンサーリンク

PowerPointを極限まで軽量化せよ:不要なスライドマスターを自動パージする「外科手術」コード

業務自動化の現場において、PowerPointファイルが「肥大化して開かない」「保存が極端に遅い」という問題に直面したことはないだろうか。その正体の多くは、コピペを繰り返す過程で蓄積された「ゾンビ状態のマスターとレイアウト」である。

これらはGUIから一つずつ削除するのは骨が折れる作業であり、かつ手作業では削除してはいけない依存関係を壊すリスクすらある。今回は、PowerPoint VBAの深淵を突き、不要なアセットを根こそぎ排除してファイルサイズを最適化する「外科手術」用スクリプトを授ける。

—

1. なぜ「マスターの断捨離」が必要なのか

PowerPointのファイル構造は、実態としてXMLの集合体である。スライドマスターやレイアウトは「テンプレート」として内部に保持されるが、一度プロジェクトに混入した不要なマスターは、たとえ1枚もスライドに使用されていなくてもファイルサイズを圧迫し続ける。

特に、複数部署からファイルを寄せ集める共同作業では、ゴミのようなマスターが蓄積され、これが「謎の動作不良」や「保存時のフリーズ」の温床となる。これをプログラムで一掃することは、単なる軽量化ではなく、「システムの安定化」そのものなのだ。

—

2. 堅牢なパージ・ロジックの設計方針

今回のスクリプトでは、以下のアーキテクチャを採用する。

1. 参照関係の走査: 現在のプレゼンテーションで使用されている「カスタムレイアウト」と「スライドマスター」を抽出し、使用状況をマッピングする。
2. 安全性確保: デフォルトのマスターなど、削除不可能なオブジェクトを除外する。
3. アトミックな削除: 依存関係を考慮し、レイアウトを削除してからマスターを削除する順序を遵守する。

—

3. 実践:PowerPoint軽量化メンテナンス・スクリプト

このコードは、現在アクティブなプレゼンテーションを解析し、使用されていないレイアウトとマスターを削除する。

Option Explicit

‘ ———————————————————
‘ プレゼンテーション内の不要なマスター・レイアウトを削除する
‘ ———————————————————
Sub PurgeUnusedMastersAndLayouts()
Dim pptPres As Presentation
Dim pptMaster As Master
Dim pptLayout As CustomLayout
Dim sld As Slide
Dim i As Long, j As Long

Set pptPres = ActivePresentation

‘ 念のため保存しておく(保険)
On Error Resume Next
pptPres.Save
On Error GoTo 0

‘ 1. 使用されていないレイアウトの削除
‘ 逆順ループは削除処理の定石(インデックスのズレを回避)
For Each pptMaster In pptPres.SlideMasters
For i = pptMaster.CustomLayouts.Count To 1 Step -1
Set pptLayout = pptMaster.CustomLayouts(i)

If Not IsLayoutInUse(pptLayout, pptPres) Then
Debug.Print “Deleting Layout: ” & pptLayout.Name
pptLayout.Delete
End If
Next i
Next pptMaster

‘ 2. 使用されていないスライドマスターの削除
For i = pptPres.SlideMasters.Count To 1 Step -1
Set pptMaster = pptPres.SlideMasters(i)

‘ 最後の1つは削除できない(PowerPointの仕様)
If pptPres.SlideMasters.Count > 1 Then
If Not IsMasterInUse(pptMaster, pptPres) Then
Debug.Print “Deleting Master: ” & pptMaster.Name
pptMaster.Delete
End If
End If
Next i

MsgBox “パージ完了。ファイルサイズを確認してください。”, vbInformation
End Sub

‘ 指定されたレイアウトが使用中か判定
Private Function IsLayoutInUse(layout As CustomLayout, pres As Presentation) As Boolean
Dim sld As Slide
For Each sld In pres.Slides
If sld.CustomLayout Is layout Then
IsLayoutInUse = True
Exit Function
End If
Next sld
IsLayoutInUse = False
End Function

‘ 指定されたマスターが使用中か判定
Private Function IsMasterInUse(master As Master, pres As Presentation) As Boolean
Dim sld As Slide
For Each sld In pres.Slides
If sld.SlideMaster Is master Then
IsMasterInUse = True
Exit Function
End If
Next sld
IsMasterInUse = False
End Function

—

4. エンジニアとして注意すべき「実装の罠」

このスクリプトを導入するにあたり、以下の3点を心に留めておいてほしい。

  • Undo(元に戻す)の限界: VBAによる削除操作は、手動操作と異なり「Ctrl+Z」で取り消せない場合がある。必ず実行前にバックアップを取る設計にすること。
  • ファイルサイズの逆説: 実は、レイアウトを削除しただけではファイルサイズが即座に減らないことがある。これはPPTX内部のXMLデータが削除フラグを立てるだけで、物理的な再構築が行われていないためだ。実行後に必ず「名前を付けて保存」で上書き保存を行うことで、初めてファイルサイズがスリム化される。
  • データベースとの連携: もしこのツールを共有フォルダ等で運用する場合、ファイル共有ロックに注意せよ。`Application.Presentations.Open` の引数で「読み取り専用」を指定するなどの配慮が、チーム開発における「事故」を防ぐ。

最後に:自動化の真髄

「コードを書くこと」は目的ではない。「誰もが何も考えずに、常に最適化された環境で作業できる仕組みを作ること」こそが、真の業務自動化エンジニアの務めだ。

このスクリプトをリボンメニューに組み込み、全社員がボタン一つで「肥大化した遺物」をパージできる状態にせよ。それが、あなたの開発プロジェクトを技術的な足枷から解放する最初の一歩となるはずだ。

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