【入門編】【シャドウコピー自動化】”Presentation.SaveCopyAs”を利用し、編集中のファイルをロックせずにバックグラウンドで世代バックアップを保存し続けるオートセーブ・エンジン – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPointでの資料作り、お疲れ様です。
何時間もかけて作り込んだスライドが、突然のフリーズやうっかりミスで消えてしまったときの絶望感……エンジニアなら誰もが一度は経験する悪夢ですよね。

「PowerPointにも自動保存機能はあるけれど、もっと確実な自分だけのバックアップが欲しい」
「作業中のファイルをロックせずに、裏でこっそり世代管理してほしい」

そんな現場の切実な悩みを鮮やかに解決するのが、今回紹介する【シャドウコピー自動化エンジン】です。

今回は、単なるコードのコピペにとどまらず、PowerPoint VBAの心臓部であるオブジェクトモデルの本質から、実務で絶対にハマる罠の回避策まで、優しく知的な先輩エンジニアの視点でお伝えしていきます。

ここをクリアすれば、あなたもPowerPoint VBAの基礎と、ちょっと高度な自動化の仕組みをバッチリマスターできますよ。それでは、さっそく扉を開けていきましょう!

1. PowerPoint VBAの心臓部:オブジェクトモデルを理解する

まず、私たちが操作するPowerPointの世界がどうなっているのか、その「地図」を頭に入れましょう。VBA(Visual Basic for Applications)の世界は、すべてが「入れ子構造(階層)」になっています。

これを視覚的に表現すると、こうなります。

[ Application ] (PowerPointアプリ全体)
└─ [ Presentations ] (開かれているプレゼンテーションの集合体)
└─ [ Presentation ] (個別のファイル:編集中のブック)
├─ [ Slides ] (スライドの集合体)
│ └─ [ Slide ] (個別のスライド)
└─ [ SaveCopyAs メソッド ] (ファイルをロックせずに別名保存する機能)

編集中のファイルを邪魔しない「SaveCopyAs」の魔力

私たちが普段使う `Presentation.Save` は、今開いているファイルを上書き保存します。この瞬間、ファイルは一時的にロックされ、場合によっては動作が重くなったり、ネットワーク越しだと保存に失敗したりします。

しかし、今回主役として使う `SaveCopyAs` は違います。
これは、「今編集しているメモリ上の状態はそのままに、裏でそっくりそのままのコピーを別の場所に書き出す」という神業メソッドです。これを使えば、ユーザーの作業を一切邪魔することなく、バックグラウンドで安全にバックアップを量産できるのです。

2. 実装!シャドウコピー自動化エンジン

お待たせしました。それでは実際のコードを公開します。
このコードは、標準モジュールとクラスモジュール(またはApplicationイベント)を組み合わせることで、指定した時間ごとに「日付+時間」のハッシュ名を付与したシャドウコピーを自動生成します。

今回は、学習のしやすさと確実性を重視し、「手動で安全にタイマー実行・停止ができるコントロールパネル式」のシンプルかつ堅牢な設計にしました。

① 標準モジュール(例: `ModAutoBackup`)

バックアップの保存先フォルダの作成、および「いつ」「どこに」保存するかのコアロジックを担います。

Option Explicit

‘ — 設定エリア —
Private Const BACKUP_FOLDER_NAME As String = “_PowerPointShadowCopies”
Private NextSaveTime As Double

‘ =====================================================================
‘ @Description: バックアップの自動実行を開始する(タイマーセット)
‘ =====================================================================
Public Sub StartAutoBackup()
Dim targetFolder As String
targetFolder = GetBackupFolderPath()

‘ バックアップ用フォルダがなければ自動作成
If Dir(targetFolder, vbDirectory) = “” Then
MkDir targetFolder
End If

‘ 10分後に最初のバックアップを実行(テスト時は “00:01:00” などに変更してください)
NextSaveTime = Now + TimeValue(“00:10:00”)

Application.OnTime NextSaveTime, “ExecuteShadowCopy”

MsgBox “シャドウコピー・エンジンが起動しました。” & vbCrLf & _
“保存先: ” & targetFolder, vbInformation, “自動バックアップ開始”
End Sub

‘ =====================================================================
‘ @Description: 自動実行を停止する
‘ =====================================================================
Public Sub StopAutoBackup()
On Error Resume Next
Application.OnTime NextSaveTime, “ExecuteShadowCopy”, , False
On Error GoTo 0

MsgBox “シャドウコピー・エンジンを停止しました。”, vbInformation, “自動バックアップ停止”
End Sub

‘ =====================================================================
‘ @Description: 実際にシャドウコピーを作成するコアプロシージャ
‘ =====================================================================
Public Sub ExecuteShadowCopy()
Dim activePres As Presentation
Dim savePath As String
Dim timeStamp As String
Dim originalName As String
Dim ext As String

‘ 1. 開いているファイルが存在するかチェック
If Application.Presentations.Count = 0 Then Exit Sub

Set activePres = ActivePresentation

‘ 2. まだ一度も保存されていない(名前なし)ファイルはスキップ
If activePres.Path = “” Then
‘ 次回のタイマーだけは継続セット
NextSaveTime = Now + TimeValue(“00:10:00”)
Application.OnTime NextSaveTime, “ExecuteShadowCopy”
Exit Sub
End If

‘ 3. ファイル名と拡張子を分離
originalName = Left(activePres.Name, InStrRev(activePres.Name, “.”) – 1)
ext = Mid(activePres.Name, InStrRev(activePres.Name, “.”))

‘ 4. タイムスタンプ生成 (例: 20231025_143000)
timeStamp = Format(Now, “yyyymmdd_hhmmss”)

‘ 5. 保存パスの組み立て
savePath = GetBackupFolderPath() & “\” & originalName & “_rev_” & timeStamp & ext

‘ ★ここが本質:ファイルをロックせずに別名でコピーを保存!
activePres.SaveCopyAs savePath

Debug.Print “シャドウコピー作成成功: ” & savePath

‘ 6. 次回分のタイマーを再設定(ループ構造)
NextSaveTime = Now + TimeValue(“00:10:00”)
Application.OnTime NextSaveTime, “ExecuteShadowCopy”
End Sub

‘ =====================================================================
‘ @Description: 保存先フォルダのパスを返す(元のファイルと同じ階層に作成)
‘ =====================================================================
Private Function GetBackupFolderPath() As String
Dim basePath As String
If ActivePresentation.Path <> “” Then
basePath = ActivePresentation.Path
Else
basePath = Environ(“USERPROFILE”) & “\Desktop” ‘ 万が一未保存ならデスクトップ
End If
GetBackupFolderPath = basePath & “\” & BACKUP_FOLDER_NAME
End Function

3. 開発現場で陥りやすい「3大トラップ」と回避策

PowerPoint VBA、特にタイマーやファイル操作を扱うコードを書くとき、シニアエンジニアでも油断するとハマる罠があります。ここを先回りして知っておくことで、あなたのコードの品質は一気にプロフェッショナルレベルに引き上げられます。

トラップ1:未保存ファイル(新規作成直後)でのエラー

  • 現象: まだ一度も名前をつけて保存していない(`Presentation.Path` が空の)状態で `SaveCopyAs` を実行すると、どこに保存していいか分からず実行時エラー(エラー400など)になります。
  • 回避策: コード内の `ExecuteShadowCopy` にある通り、`If activePres.Path = “” Then` でガード節を設け、保存先パスが確定していないファイルは安全にスキップする設計にしています。

トラップ2:マクロ付きプレゼンテーション(.pptm)の保存漏れ

  • 現象: このマクロを入れたファイルを `.pptx`(マクロなし)形式で保存していると、VBAコード自体が保存されず、次にファイルを開いたときに「あれ?マクロが消えた?」というホラー現象が起きます。
  • 回避策: VBAを書いたファイルは、必ず PowerPoint マクロ有効プレゼンテーション (`.pptm`) として保存してください。

トラップ3:タイマーの「ゾンビ化」(無限ループ・重複起動)

  • 現象: `Application.OnTime` は、停止処理を正しく書かないと、PowerPointを閉じても裏でタイマーが生き続けたり、ボタンを何回も押すことで二重・三重にタイマーが発火する「ゾンビ状態」になります。
  • 回避策: 停止用の `StopAutoBackup` プロシージャを必ず用意し、`Schedule:=False` を明示してスケジュールをキレイに解除する癖をつけましょう。

4. まとめ:自動化の先にある「安心感」を手に入れよう

今回は、`Presentation.SaveCopyAs` を利用したシャドウコピー自動化エンジンを通じて、PowerPoint VBAの基礎とオブジェクトモデルの扱い方を解説しました。

  • Application / Presentation の階層構造を理解する。
  • `SaveCopyAs` を使えば、編集中ファイルをロックせずに安全に別名バックアップができる。
  • `Application.OnTime` を使った時間管理と、エラーを防ぐガード節の重要性。

ここまで理解できたあなたなら、もう「マクロの記録」をただ再生するだけの初学者ではありません。実務の課題を自分の手で解決できる立派なVBAエンジニアです。

ぜひ、あなたの手元の業務資料にこのエンジンを組み込み、データ消失の恐怖から解放された快適な開発ライフを手に入れてください。
ここをクリアできれば、PowerPoint VBAの基本はもうバッチリですよ!次のステップへ進みましょう。

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