【初級編】消えたスライドは戻ってこない?上書き保存時に「.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!
