【実務・中級編】【中級者】スライド内の「非表示スライド」だけを別の新規プレゼンテーションに「バックアップ用」として退避させ、元のファイルからは完全に削除して保存するクリーンアップマクロ – PowerPoint VBA解析バイブル

スポンサーリンク
スポンサーリンク

「非表示スライド」はセキュリティではない。エンジニアが実践すべき、情報の「完全分離」と「クリーンアップ」の設計思想

プレゼンテーションの作成において、多くのユーザーが「非表示スライド」を情報の隠蔽手段として利用している。しかし、プロフェッショナルの視点から言わせれば、それは極めて危うい設計である。

非表示スライドは、あくまで「表示・非表示の属性」が切り替わっているだけであり、ファイル内部のXML構造やメディアリソースとしては完全に存在し続けている。不用意に社外へ送付すれば、ファイルサイズを肥大化させるだけでなく、本来見せるべきではない機密情報(構成案や未確定データ)を、リボンメニューの操作一つで露出させるリスクを孕んでいるのだ。

本記事では、単なる「スライド削除マクロ」ではない。情報の機密性を担保し、かつファイルサイズを最適化するための「バックアップ分離型クリーンアップ・アーキテクチャ」を伝授する。

1. 設計思想:なぜ「削除」の前に「分離」が必要なのか

一般的な初心者は、まず「非表示スライドを消す」コードを書こうとする。しかし、これは設計として不完全だ。もし削除プロセス中にエラーが発生し、元のファイルが破損したり、スライドが中途半端に失われたりしたらどうする? 業務継続性が失われる。

我々アーキテクトが目指すべきは、「アトミック(不可分)な操作」である。

1. 抽出(Extraction): 非表示スライドを検出し、それらを完全に新しいプレゼンテーションへコピーする。
2. 検証(Verification): バックアップが正しく生成されたことを確認する。
3. 破棄(Destruction): 元のファイルから非表示スライドを完全に削除する。
4. 永続化(Persistence): 本番用ファイルを「クリーンな状態」で上書き保存する。

このステップを踏むことで、万が一の事態でも「バックアップさえあれば元に戻せる」という安全圏を確保できるのだ。

2. 技術的急所:インデックス・シフトの罠

スライドを削除する際、最も多くの開発者が陥る罠が「インデックスの逆転」である。

例えば、スライドが 1, 2, 3, 4 とあり、2番目と3番目が非表示だとしよう。

  • `For i = 2 To 4` でループを回し、`i = 2` を削除すると、元々3番目だったスライドが「新しい2番目」に繰り上がる。
  • 次のループで `i = 3` を指定すると、繰り上がったスライドをスキップしてしまい、削除漏れが発生する。

これを回避する鉄則はただ一つ。「スライド番号は後ろ(末尾)から処理する」ことだ。

3. プロダクション・グレードのコード実装

以下に、実務に投入可能なレベルの堅牢なコードを示す。エラーハンドリング、オブジェクトのライフサイクル管理、そしてバックアップのタイムスタンプ付与までを網羅している。

Option Explicit

''' <summary>
''' 非表示スライドを別ファイルへ退避させた後、元のファイルから完全に削除する。
''' </summary>
Public Sub ExecuteSlideCleanupProcess()
    Dim targetPres As Presentation
    Dim backupPres As Presentation
    Dim i As Long
    Dim hiddenSlideCount As Long
    Dim backupFileName As String
    Dim backupPath As String
    Dim errorOccurred As Boolean
    
    ' 環境設定
    Set targetPres = ActivePresentation
    backupPath = targetPres.Path & "\"
    ' バックアップファイル名にタイムスタンプを付与(上書き防止)
    backupFileName = Replace(targetPres.Name, ".pptx", "_BACKUP_" & Format(Now, "yyyymmdd_hhnnss") & ".pptx")
    
    On Error GoTo ErrorHandler
    
    ' 1. 非表示スライドの存在確認
    hiddenSlideCount = 0
    For i = 1 To targetPres.Slides.Count
        If targetPres.Slides(i).SlideShowSettings.Show પડisHidden Then
            hiddenSlideCount = hiddenSlideCount + 1
        End If
    Next i
    
    If hiddenSlideCount = 0 Then
        MsgBox "非表示スライドは見つかりませんでした。クリーンアップを終了します。", vbInformation
        Exit Sub
    End If
    
    ' 2. バックアップ用プレゼンテーションの新規作成
    ' ※ 既存のスライド構成を維持するため、最初の非表示スライドをコピーして作成する戦略をとる
    Set backupPres = Presentations.Add(WithWindow:=msoTrue)
    
    ' 3. 非表示スライドの抽出(バックアップ作成)
    ' インデックスの変動を防ぐため、一旦対象スライドをリスト化するか、
    ' ここでは単純化のため「コピーして貼り付け」を行う
    For i = 1 To targetPres.Slides.Count
        If targetPres.Slides(i).SlideShowSettings.Show પડisHidden Then
            targetPres.Slides(i).Copy
            backupPres.Slides.Paste
        End If
    Next i
    
    ' バックアップの保存
    backupPres.SaveAs backupFileName
    Debug.Print "Backup saved: " & backupFileName
    
    ' 4. 元のプレゼンテーションからの削除(逆順ループが鉄則)
    ' 注意: Copy/Pasteによりスライドの順序が変わる可能性があるため、
    ' 元のファイルでは必ず末尾から削除を行う
    For i = targetPres.Slides.Count To 1 Step -1
        If targetPres.Slides(i).SlideShowSettings.Show પડisHidden Then
            targetPres.Slides(i).Delete
        End If
    Next i
    
    ' 5. 本番ファイルの保存(クリーンアップ後の状態)
    targetPres.Save
    
    ' 終了処理
    backupPres.Close
    Set backupPres = Nothing
    Set targetPres = Nothing
    
    MsgBox "クリーンアップ完了。" & vbCrLf & _
           "退避済みスライド数: " & hiddenSlideCount & vbCrLf & _
           "バックアップファイル: " & backupFileName, vbInformation, "Success"
    
    Exit Sub

ErrorHandler:
    errorOccurred = True
    MsgBox "致命的なエラーが発生しました。" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Description: " & Err.Description, vbCritical, "Execution Error"
    
    ' エラー発生時、中途半端なバックアップが残っている場合は閉じる
    If Not backupPres Is Nothing Then
        backupPres.Close
    End If
End Sub

4. 実務における運用上の注意点(アーキテクトの助言)

このツールを業務フローに組み込む際、以下の3点に留意せよ。

① メディアリソースの最適化

スライドを削除しても、ファイル内の「画像データ」や「動画データ」が完全に軽量化されるとは限らない。PowerPointは内部的にメディアをキャッシュしているためだ。
真にファイルサイズを削減したいのであれば、マクロの最後に `targetPres.Save` を行うだけでなく、手動または別途VBAで「図の圧縮」を実行するプロセスを検討すべきである。

② 参照関係の破壊

スライドに「スライド間のリンク(ハイパーリンク)」が設定されている場合、スライドを削除するとリンク切れが発生する。バックアップを作成するだけでなく、リンクの整合性をチェックするバリデーションロジックを組み込むことが、エンタープライズ向けツールの条件だ。

③ ファイルロックのハンドリング

共有サーバー(OneDriveやSharePoint)上のファイルに対して実行する場合、他のユーザーがファイルを開いていると `Save` メソッドでランタイムエラーが発生する。実運用では、ファイルが読み取り専用になっていないか、あるいは書き込み権限があるかを事前にチェックする `FileSystemObject` によるガードを推奨する。

結論

「非表示スライドを消す」という単純なタスクの裏には、データの整合性、セキュリティ、そして業務継続性という重い責任が隠れている。
エンジニアの仕事は、単にコードを動かすことではない。「失敗しても壊れない、戻せる、そして安全である」という設計を、コードという形で証明することなのだ。

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