【Project VBA極限攻略】壊れたファイルからタスクを救出せよ!バイナリ解析的アプローチの全貌
やあ。プロジェクトマネジメントの現場で「ファイルが開けない」という絶望的な通知を受けたことはないだろうか?
通常、Microsoft Project(MSP)のファイルが破損すると、多くの人は「バックアップからの復元」を試みる。だが、もしバックアップすらないとしたら? 我々のようなエンジニアにとって、それは「終わり」ではなく「データ構造を直接叩く好機」だ。
今日は、Project VBAの最深部を覗き込み、破損したファイルからタスクを救い出す「データ抽出リカバリ術」を授けよう。
—
1. なぜ「通常オープン」が失敗するのか?
まず、MSPのファイル(.mpp)は非常に複雑なバイナリ構造を持っている。何らかの要因で内部のポインタやインデックスが壊れると、MSPのGUIは「ファイルが壊れています」と門前払いをする。
しかし、VBAの`Application.FileOpen`メソッドを通さず、「読み取り専用(ReadOnly)」や「セーフモード的なオブジェクトアクセス」を試みると、壊れていないタスクテーブルのデータだけがポロリとこぼれ落ちてくることがある。これが、今回の救出作戦の核だ。
—
2. 救出のロジック:最小限の接点を確保する
我々が狙うのは、ファイル全体の整合性ではない。「タスクの名前、開始日、終了日、アウトラインレベル」という、プロジェクトの背骨となるデータだ。
以下のコードは、破損ファイルを「極力解析させない」設定で開き、中身を新規ファイルに転記するスクリプトだ。
破損ファイル救出マクロ(RecoverTasks.bas)
Sub RescueProjectData()
Dim app As Object
Dim targetProj As Project
Dim sourceProj As Project
Dim t As Task
‘ 新規プロジェクトを作成(ここが受け皿になる)
Set targetProj = Application.Projects.Add
‘ 破損ファイルを読み取り専用で開く(修復プロセスをスキップさせる祈り)
‘ ※ReadOnly:=Trueが重要。書き込み権限で開こうとすると整合性チェックが走るため
Application.FileOpen Name:=”C:\Path\To\BrokenFile.mpp”, ReadOnly:=True
‘ 直前に開いたプロジェクトをソースとして特定
Set sourceProj = Application.ActiveProject
On Error Resume Next ‘ 破損箇所があっても無視して次へ進む
‘ タスクデータを順番に吸い出す
For Each t In sourceProj.Tasks
If Not t Is Nothing Then
‘ 新規プロジェクトに同名のタスクを作成
Dim newTask As Task
Set newTask = targetProj.Tasks.Add(t.Name)
‘ 主要な属性をコピー
newTask.Start = t.Start
newTask.Finish = t.Finish
newTask.OutlineLevel = t.OutlineLevel
‘ 進行状況などは必要に応じて追加
‘ newTask.PercentComplete = t.PercentComplete
End If
Next t
On Error GoTo 0
MsgBox “救出完了!新規プロジェクトにデータを移植しました。”
End Sub
—
3. コードの読み解き:ここが「極限」のポイント
このコードで重要なのは、以下の3点だ。
1. `ReadOnly:=True` の真意
通常、ファイルを開く際に整合性チェックが行われる。これを「読み取り専用」にすることで、MSPのパーサー(解析器)の負荷を下げ、構造崩壊が起きている箇所を「スキップ」させる確率を上げる。
2. `On Error Resume Next` の哲学
普段は禁じ手だが、今回のような「壊れたオブジェクト」を扱う際には必須だ。プロパティにアクセスした瞬間に発生する「Object Required」エラーを無視し、死に体ではないデータを一点でも多く拾いに行くための防壁となる。
3. `t Is Nothing` のチェック
破損ファイルでは、メモリ上のインデックスは存在するが、実体(データ)が消失しているタスクがある。このチェックを怠ると、一瞬でマクロがクラッシュする。
—
4. 陥りやすい罠と対策
初心者がやりがちなのは、「破損しているプロジェクトをアクティブにした状態で処理を完結させようとする」ことだ。
- 罠: 破損プロジェクトの特定のタスクを操作しようとして、MSP自体がフリーズする。
- 対策: 常に「新規プロジェクトを親(targetProj)とし、破損ファイルを外部から参照する」というスタンスを崩さないこと。
—
最後に:エンジニアとしての心構え
Project VBAは、単なる自動化ツールではない。MSPという巨大なOSのようなアプリケーションの挙動を、コードで制御する「対話」だ。
今回紹介した手法は、いわば「外科手術」。データが完全に消失している部分は救えないが、「残骸の中から価値ある情報を掘り出す」ことは可能だ。
ここをクリアした君なら、もう「マクロの記録」ボタンを押すだけのエンジニアとは違う次元にいるはずだ。次は、Project Serverや複雑なカスタムフィールドの抽出に挑戦してみるといい。
プロジェクトの現場で、誰かが困っているとき。君のそのコードが、誰かの数ヶ月分の労力を救うことになる。健闘を祈る。
