【入門編】【初心者】上書き保存時に同階層へ「.bak」形式のバックアップファイルを自動生成する簡易世代管理マクロ – PowerPoint VBA解析バイブル

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

【初級編】消えたスライドは戻ってこない?上書き保存時に「.bak」を自動生成する魔法のバックアップ術

こんにちは。自動化の世界へようこそ。

「あ……やってしまった」

プレゼン資料を作成中、誤って大事なスライドを消してしまい、気づいた時にはすでに「上書き保存」を押してしまった……。そんな冷や汗をかく瞬間、あなたにはありませんか?

通常の「元に戻す(Ctrl+Z)」は、ファイルを閉じてしまうと魔法のように消えてしまいます。エンジニアの世界では、こうした不測の事態に備えることを「防御的プログラミング(Defensive Programming)」と呼びます。

今日は、プログラミング初学者のあなたが「マクロの記録」という殻を破り、一歩先の「仕組みを作る」エンジニアへと進むための第一歩として、「保存するたびに、自動でバックアップ(.bak)を作成する仕組み」を一緒に作っていきましょう。

ここをクリアすれば、PowerPoint VBAの「イベント」という非常に強力な概念をマスターできますよ。

1. なぜ「マクロの記録」だけでは足りないのか?

「マクロの記録」は、あなたの操作をそのままコードに変換してくれる便利な機能です。しかし、決定的な弱点があります。それは「いつ、何が起きたか」を判断できないことです。

今回作りたいのは、「ボタンを押したらバックアップを取る」マクロではありません。
「ユーザーが普通に保存ボタンを押した、その瞬間」に、裏側でそっとバックアップを作成する仕組みです。

これを実現するために使うのが、「イベント(Event)」という概念です。アプリケーションが「保存されたよ!」という信号を出した瞬間に、私たちの書いたコードを割り込ませる。これが自動化の本質です。

2. 実装の設計図

今回の仕組みは、以下のステップで動きます。

1. イベントの監視: PowerPointが「保存」というアクションを起こしたことを検知する。
2. 情報の取得: 今保存しようとしているファイルの「場所(パス)」と「名前」を特定する。
3. タイムスタンプの付与: 「いつのバックアップか」が分かるように、現在時刻(20231027_153000など)を名前に組み込む。
4. ファイルの複製: 元のファイルと同じ場所に、新しい名前でコピーを作成する。

3. 実装コード:バックアップ自動生成システム

PowerPointのVBAでは、アプリケーション全体の動きを監視するために「クラスモジュール」というものを使う必要があります。少し難しく感じるかもしれませんが、手順通りに進めれば大丈夫です。

手順A:クラスモジュールの作成

1. VBAエディタ(Alt + F11)を開きます。
2. メニューの「挿入」→「クラスモジュール」をクリックします。
3. プロパティウィンドウで、オブジェクト名を `Class1` から `EventClass` に変更してください。
4. 以下のコードを貼り付けます。

' --- Class Module: EventClass ---
Option Explicit

' Applicationオブジェクトのイベントを監視するための宣言
Public WithEvents App As Application

' プレゼンテーションが保存された時に自動的に実行されるイベント
Private Sub App_PresentationSave(ByVal Pres As Presentation)
    Dim backupPath As String
    Dim timestamp As String
    Dim currentPath As String
    Dim baseName As String
    Dim extension As String
    Dim fso As Object

    ' 1. ファイルが一度も保存されていない(パスがない)場合は何もしない
    ' 新規作成直後のファイルには保存場所が存在しないため、エラーを防ぎます
    If Pres.Path = "" Then Exit Sub

    On Error GoTo ErrorHandler

    ' 2. タイムスタンプの生成 (例: 20231027_153005)
    timestamp = Format(Now, "yyyymmdd_hhmmss")

    ' 3. ファイルパスの解析
    currentPath = Pres.FullName ' 現在のフルパス
    
    ' FileSystemObjectを使ってファイル名と拡張子をスマートに分離
    Set fso = CreateObject("Scripting.FileSystemObject")
    baseName = fso.GetBaseName(currentPath) ' ファイル名(拡張子なし)
    extension = fso.GetExtensionName(currentPath) ' 拡張子

    ' 4. 新しいバックアップ用ファイル名の構築
    ' 例: C:\Work\Presentation.pptx -> C:\Work\Presentation_20231027_153005.bak.pptx
    backupPath = fso.GetParentFolderName(currentPath) & "\" & _
                 baseName & "_" & timestamp & ".bak." & extension

    ' 5. ファイルのコピーを実行
    ' Trueを指定することで、万が一同名ファイルがあっても上書きします
    fso.CopyFile currentPath, backupPath, True

    ' デバッグ用(動作確認ができたら削除してOKです)
    ' Debug.Print "Backup created: " & backupPath

    Set fso = Nothing
    Exit Sub

ErrorHandler:
    ' エラーが発生しても、ユーザーの保存作業を邪魔しないように静かに終了します
    ' 実務ではここにログ出力などを入れるのがプロの技です
    Resume Next
End Sub

手順B:標準モジュールの作成

次に、この「監視役(クラス)」を起動するためのスイッチを作ります。

1. メニューの「挿入」→「標準モジュール」をクリックします。
2. 以下のコードを貼り付けます。

' --- Standard Module ---
Option Explicit

' 監視役を保持するための変数(これがないとマクロ終了時に監視が止まってしまいます)
Dim myAppEvent As New EventClass

' このマクロを一度実行すると、バックアップ機能が有効になります
Sub StartBackupSystem()
    Set myAppEvent.App = Application
    MsgBox "バックアップ監視システムを起動しました。", vbInformation, "System Ready"
End Sub

' 監視を停止したい場合に使用します
Sub StopBackupSystem()
    Set myAppEvent.App = Nothing
    MsgBox "バックアップ監視システムを停止しました。", vbExclamation, "System Stopped"
End Sub

4. 使い方と動作確認

1. 作成したファイルを 「PowerPoint マクロ有効プレゼンテーション (.pptm)」 として保存してください。
2. `StartBackupSystem` マクロを実行します。
3. 適当なスライドを作成し、通常の「上書き保存」を行ってください。
4. ファイルと同じフォルダを見てください。`ファイル名_2023xxxx_xxxxxx.bak.pptx` というファイルが生成されていれば成功です!

5. プロの視点:陥りやすい罠と回避策

このコードを実戦投入する前に、知っておいてほしい「落とし穴」が2つあります。

① 「監視」のライフサイクル

今回のコードでは、`myAppEvent` という変数に監視役を格納しています。VBAの仕様上、マクロの実行が終わって変数がメモリから消えると、監視も止まってしまいます。
そのため、`StartBackupSystem` を実行した後は、PowerPointを閉じるまで(あるいは明示的に停止するまで)監視が続くよう、変数のスコープ(有効範囲)に注意を払っています。

② 未保存ファイルのハンドリング

一番多いエラーは、「まだ一度も保存していない新規ファイル」を保存しようとした時に発生します。保存場所(Path)が存在しないため、コピー先が見つからずエラーになります。
これを防ぐために、コードの冒頭で `If Pres.Path = “” Then Exit Sub` という「ガード句」を入れています。これは、「異常な状況なら、深追いせずにすぐ帰る」という、堅牢なコードを書くための鉄則です。

おわりに

お疲れ様でした!
あなたは今、「操作を記録する」段階から、「アプリケーションの挙動を制御する」という、真の自動化エンジニアへの一歩を踏み出しました。

今回作った `.bak` 生成マクロは、単なるバックアップツールではありません。「イベントを検知し、オブジェクトのプロパティを解析し、ファイルシステムを操作する」という、業務自動化のコアとなる技術が凝縮されています。

この感覚を忘れないでください。次にあなたが作るマクロは、もっともっと強力なものになるはずです。

Happy Coding!

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