こんにちは!プロジェクト管理の現場で、日々VBAや自動化と格闘お疲れ様です。
マクロの記録から一歩抜け出し、「いかにしてシステムを止めることなく、予期せぬトラブルからデータを守り抜くか」という領域に足を踏み入れたあなたへ。今回は、プログラミング初学者や中級者の方に向けて、少しディープでありながら実務で極めて強力な武器になるテーマをお届けします。
テーマはずばり、「【上級者向け】破損したプロジェクトファイルの修復を試みる自動オープンルーチン」です。
朝出社して、プロジェクトファイルを開こうとしたら「ファイルが破損しています」という冷酷なエラーメッセージ……。血の気が引く瞬間ですよね。今回は、そんな絶望的な状況をVBAの力でスマートに回避し、可能な限りのデータを救出する堅牢なリカバリツールの作り方を、優しく、そして本質的な部分まで深く解説していきます。
ここをクリアすれば、あなたもVBAの裏側の挙動を操るエンジニアの仲間入りです。さあ、一緒に見ていきましょう!
—
なぜプロジェクトファイルは「破損」するのか?
まず、敵を知ることから始めましょう。Microsoft Project(MS Project)のファイル(`.mpp`)は、内部にタスク、リソース、アサインメント、そして複雑な依存関係のネットワークを抱えています。
これらが何らかの原因(ネットワークの切断、保存中の強制終了、メモリ不足など)で壊れると、MS Projectの通常オープン(`FileOpen`)は完全に拒絶されます。通常の処理では、エラートラップ(`On Error`)でキャッチされて、そのままマクロが力尽きてしまうのが関の山です。
救出の基本戦略:XMLという「逃げ道」
MS Projectには、バイナリ形式の`.mpp`だけでなく、XML形式(`.xml`)でデータをシリアライズ(文字列表現化)して保存・読み込みする機能があります。
実は、`.mpp`としては読み込めなくなったファイルでも、XMLとして読み込もうとすると、MS Projectのパーサーが「おや、ここのタグの閉じ忘れがあるけど、推測して復旧できるぞ」とばかりに、データを救出できるケースが多々あるのです。
今回の自動オープンルーチンは、この「通常オープンがダメなら、エラーをいなして多角的にアプローチする」という泥臭くも洗練された戦略をとります。
—
現場でそのまま使える!堅牢なリカバリ・オープンルーチン
それでは、実際に動くコードを見てみましょう。VBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてください。
Option Explicit
‘ ==============================================================================
‘ 担当:チーフアーキテクト
‘ 概要:破損した可能性のあるProjectファイルを多段的にオープン・救出するルーチン
‘ ==============================================================================
Public Sub RobustOpenProject()
Dim targetPath As String
Dim isOpened As Boolean
‘ サンプルとしてデスクトップの破損疑いファイルを指定(環境に合わせて変更してください)
targetPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\BrokenProject.mpp”
isOpened = False
‘ ————————————————————————–
‘ 段階 1: 通常オープン(読み取り専用・バックグラウンドなしの安全策)
‘ ————————————————————————–
On Error Resume Next
‘ FileOpenExメソッドを使用し、読み取り専用(ReadOnly:=True)で開くことでリスクを軽減
FileOpenEx Name:=targetPath, ReadOnly:=True, Interactive:=False
If Err.Number = 0 Then
If Not ActiveProject Is Nothing Then
isOpened = True
MsgBox “【正常オープン】通常モードでファイルが開けました。”, vbInformation, “リカバリ完了”
End If
End If
On Error GoTo 0
If isOpened Then Exit Sub
‘ ————————————————————————–
‘ 段階 2: XML形式としてのオープン試行
‘ ————————————————————————–
MsgBox “通常オープンに失敗しました。XML形式としての修復オープンを試行します…”, vbExclamation, “リカバリ開始”
On Error Resume Next
‘ 拡張子違いやXMLコンバータを通した強制読み込み
FileOpenEx Name:=targetPath, ReadOnly:=True, FormatID:=”MS Project XML”, Interactive:=False
If Err.Number = 0 Then
If Not ActiveProject Is Nothing Then
isOpened = True
MsgBox “【救出成功】XMLパーサー経由でデータを復旧しました!すぐに別名で保存してください。”, vbCritical, “データ救出”
End If
End If
On Error GoTo 0
If isOpened Then Exit Sub
‘ ————————————————————————–
‘ 段階 3: 全ての防衛線が突破された場合
‘ ————————————————————————–
MsgBox “残念ながらファイルの構造が完全に破壊されています。” & vbCrLf & _
“直近のバックアップファイル、またはVSS(シャドウコピー)からの復元を検討してください。”, _
vbCritical, “リカバリ失敗”
End Sub
—
コードの核心を読み解く!知っておくべき3つのポイント
初心者から一歩進んだエンジニアになるために、上記のコードで使われている重要なポイントを解説します。
1. `FileOpenEx` メソッドの活用
古い教材では単なる `FileOpen` が使われがちですが、現代のProject VBAでは、より多くのパラメータを制御できる `FileOpenEx` を使うのがプロの作法です。特に `ReadOnly:=True` を指定することで、開く瞬間の書き込み競合や追加の破損リスクをシャットアウトします。
2. `FormatID` による強制的な形式指定
段階2で使用している `FormatID:=”MS Project XML”` が、このルーチンの最大のミソです。MS Projectに対して「バイナリとして読むな、XMLとして解釈しろ」と明示的に指示を出すことで、ファイルの拡張子が `.mpp` であっても、内部がXML構造を保っていれば強制的に読み込ませることができます。
3. `On Error Resume Next` との正しい付き合い方
「エラー処理でコードを止めるな」と習ったかもしれませんが、“あえてエラーを無視して次の手を探る” のがリカバリ処理の本質です。
ただし、`On Error Resume Next` を使った後は、必ず `Err.Number` をチェックし、処理が終わったら速やかに `On Error GoTo 0`(エラー監視のデフォルト復帰)を行うのが鉄則です。これを怠ると、思わぬバグの温床になります。
—
陥りやすい罠とエラー対策
実際にこのようなツールを運用し始めると、いくつかの「壁」にぶつかります。先輩からのアドバイスとして、あらかじめ共有しておきますね。
- 罠1:ダイアログボックスが邪魔をしてマクロが止まる
- 対策: ファイルが壊れていると、MS Projectが親切心から「修復しますか?」という確認ダイアログを出します。これがVBAの実行をブロック(フリーズしたように見える)させます。これを防ぐために `Interactive:=False` パラメータを必ず付与し、対話モードをオフにしましょう。
- 罠2:救出したはいいが、上書き保存してデータが消えた
- 対策: XMLや読み取り専用で開いた直後は、元の壊れたパスに対して上書き保存をしてはいけません。必ず `FileSaveAs` を使って、タイムスタンプ付きの新しいファイル名として保存するフローをセットで組み込みましょう。
—
まとめ:自動化の先にある「安心」を作るために
今回は、破損したプロジェクトファイルのリカバリという、少しマニアックで実用的なテーマをお届けしました。
「ここをクリアすれば、Project VBAの基本はバッチリですよ」
オブジェクトのライフサイクルを理解し、エラーハンドリングを手なずけることができるようになると、VBAは単なる「手作業の代行ツール」から、「システムの命を守る守護神」へと進化します。
現場で頼られるエンジニアを目指して、ぜひあなたの引き出しにこのテクニックを追加してみてください。それでは、次回の高度な自動化の世界でお会いしましょう!
