こんにちは!プロジェクト管理の現場で、MS ProjectのVBAと日々格闘お疲れ様です。世界最高峰の業務自動化を追求するチーフアーキテクトの私です。
今回は、多くのプロジェクトマネージャーが冷や汗をかく瞬間――そう、「MS Projectが突然のフリーズやクラッシュを起こし、自動保存機能もうまく働かず、最新のスケジュールが消えかけた」という最悪のシナリオを華麗に無かったことにする、【極限のローカルキャッシュ復元リカバリツール】の作り方を伝授します。
「マクロの記録」なんて機能が存在しないMS Projectの世界において、VBAを操ることは、まるで荒馬を乗りこなすようなもの。しかし、ここをクリアすれば、あなたの業務自動化スキルは間違いなくプロの領域に達します。
さあ、深呼吸をして、私の背中についてきてください。ここをクリアすれば、Project VBAの基本と「裏側の仕組み」はバッチリですよ!
—
なぜ、自動保存は失敗するのか?(本質を知る)
MS Projectには、バックグラウンドでファイルを保護する仕組み(AutoRecoverやテンポラリファイル生成)が備わっています。しかし、ネットワークドライブ上のファイルを編集していたり、巨大なリソースプールを抱えていたりすると、一時ファイルの書き込みに失敗し、OSの`Temp`フォルダにゴミクズのような残骸だけを残してプロジェクトがプツリと途切れることがあります。
私たちが狙うのは、Windowsのシステムがこっそり生成する「`.mpp` の断片(キャッシュファイル)」です。
VBAを使って自動的にOSの `Temp` フォルダを巡回し、「最も新しく更新されたバックアップファイル」を特定して安全な場所へサルベージ(救出)する、そんな職人技のようなツールを作ります。
—
リカバリツールの全体像
今回作成するツールは、以下のステップで動作します。
1. ターゲットの特定: Windowsのユーザー環境にある `Temp` フォルダへアクセスする。
2. ファイルの探索: その中からMS Projectのバックアップ特有の拡張子やパターンを持つファイルを列挙する。
3. 鮮度の比較: 「最終更新日時」を比較し、一番新しいファイルを特定する。
4. 安全な復元: 見つかったファイルを指定したデスクトップ等へコピーし、安全に開ける状態にする。
—
実装コード:一撃で最新キャッシュをサルベージする魔術
以下のコードを、ProjectのVBAエディタ(`Alt + F11` で起動)の標準モジュールに貼り付けてください。
Option Explicit
‘ ==============================================================================
‘ 凄腕エンジニア直伝:Projectキャッシュ自動リカバリツール
‘ 概要: WindowsのTempフォルダから最新のProjectキャッシュを探索し復元します。
‘ ==============================================================================
Sub RecoverLatestProjectCache()
Dim fso As Object
Dim tempFolder As Object
Dim targetFile As Object
Dim latestFile As Object
Dim latestDate As Date
Dim searchPath As String
Dim desktopPath As String
Dim savedFileName As String
‘ 1. FileSystemObjectの生成(OSのファイルシステムを直視する必須オブジェクト)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 2. ユーザーのTempフォルダのパスを取得
searchPath = Environ(“TEMP”)
If Not fso.FolderExists(searchPath) Then
MsgBox “テンポラリフォルダが見つかりませんでした。”, vbCritical, “リカバリ失敗”
Exit Sub
End If
Set tempFolder = fso.GetFolder(searchPath)
‘ 初期化
latestDate = #1/1/2000#
Set latestFile = Nothing
‘ 3. Tempフォルダ内を総当たりで調査(最新の.mppまたは関連キャッシュを探す)
On Error Resume Next ‘ アクセス権限エラーなどを華麗にスルーする耐障害性
For Each targetFile In tempFolder.Files
‘ Projectのファイルや、それらしいバックアップファイルを拡張子で判定
‘ ※環境によって一時ファイルの拡張子が異なるため、LCaseで安全に比較
If InStr(LCase(targetFile.Name), “.mpp”) > 0 Or InStr(LCase(targetFile.Name), “proj”) > 0 Then
If targetFile.DateLastModified > latestDate Then
latestDate = targetFile.DateLastModified
Set latestFile = targetFile
End If
End If
Next targetFile
On Error GoTo 0
‘ 4. 救出対象が見つかったかの判定
If latestFile Is Nothing Then
MsgBox “復元可能なキャッシュファイルが見つかりませんでした。”, vbExclamation, “探索終了”
Exit Sub
End If
‘ 5. デスクトップに安全な名前でコピーしてサルベージ完了
desktopPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)
savedFileName = desktopPath & “\Recovered_Project_” & Format(Now, “yyyymmdd_hhnnss”) & “.mpp”
latestFile.Copy savedFileName, True
‘ 完了報告
MsgBox “奇跡的に最新のキャッシュを救出しました!” & vbCrLf & _
“保存先: ” & savedFileName & vbCrLf & _
“最終更新: ” & latestFile.DateLastModified, vbInformation, “リカバリ成功”
‘ オブジェクトの解放(メモリ管理の美学)
Set latestFile = Nothing
Set tempFolder = Nothing
Set fso = Nothing
End Sub
—
コードの深掘り解説:ここがプロの技術
初学者のうちは呪文のように見えるコードも、本質を理解すれば怖くありません。重要なポイントを3つに絞って解説します。
1. `Environ(“TEMP”)` で迷子にならない
Windowsのシステム環境変数から直接 `Temp` フォルダの場所を特定しています。ユーザー名が違っても、社内PCの環境が変わっても、一発で正確な作業領域へダイブできるため、実務で非常に堅牢(ロバスト)な書き方です。
2. `FileSystemObject (FSO)` の圧倒的パワー
VBA標準の `Dir` 関数でもファイル検索はできますが、ファイルの「最終更新日時 (`DateLastModified`)」をループ内でスマートに比較し、最も新しいものを正確に特定するには、FSOのオブジェクト指向的なアプローチが最適です。
3. `On Error Resume Next` の正しい使い方
「エラーが出たら無視する」という書き方は諸刃の剣ですが、「OSや他アプリが掴んでいてアクセス拒否される一時ファイル」をループ中に踏んだ際、マクロが強制終了するのを防ぐための防壁として、ここでは正確に意図して使っています。エラー処理の前後でちゃんと `On Error GoTo 0`(通常の監視に戻す)を入れているのがプロの作法です。
—
陥りやすい罠とエラー回避のコツ
- Q. 「ファイルが見つかりません」と言われてしまうのですが?
- A. MS Projectが完全に異常終了した直後、OSが一時ファイルを即座に削除してしまうケースがあります。クラッシュしたら、「何もしないで、すぐにこのVBAを実行する」のが鉄則です。
- Q. セキュリティ警告が出てマクロが動きません。
- A. Projectの「ファイル」>「オプション」>「トラストセンター」から、マクロの設定を「信頼できるドキュメント」にするか、マクロを有効化するパスを信頼済み場所に指定してください。
—
おわりに:VBAはあなたの最強の相棒になる
今回は、少しマニアックで実用的な「自動保存失敗時のリカバリツール」を解説しました。
一見難しそうに見えるProjectの裏側も、VBAというメスを入れることで、意のままにコントロールできるようになります。
「ここをクリアすれば、Project VBAの基本はバッチリですよ!」
日々の定型業務の自動化から、今回のような万が一のトラブルシューティングまで、コードを書きこなせるあなたならもう怖くありません。ぜひ現場で試して、周囲をあっと言わせてください。
それでは、次回の極限の知見でお会いしましょう。
