【Project VBA極限攻略】ベースラインのXML抽出によるBIパイプラインの構築とメモリ最適化の真髄
プロジェクト管理の現場において、Project VBA(Microsoft Project)の「ベースライン」は、単なる進捗の記録ではない。それはプロジェクトの「意図」と「現実」の乖離を刻む、最も価値ある時系列データだ。
多くのエンジニアはGUIから手動でエクスポートして悦に入っているが、真のアーキテクトは違う。「保存イベント」をトリガーに、非同期的なパイプラインを構築し、BIツールでトレンドを可視化する。 これこそが、プロジェクトの「死に体」をリアルタイムで検知するための唯一の解法である。
本稿では、VBAによるXMLエクスポートから、メモリ管理の極意までを網羅する。
—
1. なぜ「XMLエクスポート」なのか?
CSVやExcel変換は愚策だ。Projectの構造体(階層タスク、リソース、割り当て)を保持したまま解析するには、Microsoft Projectがネイティブで生成するXML形式(.xml)が最も高忠実度である。
BIツール(Power BI等)に読み込ませる際、XML形式であればスキーマの変更にも強い。VBAでXMLを抽出し、それをPower Queryで加工する。この分離こそが、システムを堅牢にする要諦だ。
2. 実装の要:Workbook_BeforeSaveをハックする
まず、`ThisProject` モジュールにおけるイベントハンドラの最適化だ。ここでの処理は「重い」。保存動作を阻害しないよう、非同期的なアプローチを意識せよ。
‘ プロジェクト保存イベントにフックし、ベースラインをXMLで書き出す
Private Sub Project_BeforeSave(ByVal pj As Project, ByVal SaveAsUi As Boolean, Cancel As Boolean)
On Error GoTo ErrHandler
‘ プロセスが二重起動しないよう排他制御を行うこと(APIによるミューテックス推奨)
Dim exportPath As String
exportPath = Environ(“USERPROFILE”) & “\Desktop\ProjectExport_” & Format(Now, “yyyyMMdd_HHmmss”) & “.xml”
‘ プロジェクトのXML保存機能を利用する(FileFormat:=pjXML)
‘ ※大きなプロジェクトではこの処理がメインスレッドをブロックする。
‘ バックグラウンド処理が可能な場合はVB.NET等の外部ラッパーを推奨する。
pj.SaveAs Name:=exportPath, Format:=pjXML
Exit Sub
ErrHandler:
Debug.Print “Error: ” & Err.Description
End Sub
3. メモリ管理とレガシー環境の罠
VBAにはGarbage Collectorが存在しない。`Application.Projects` のようなコレクションを不用意にループさせれば、Project VBA特有の「メモリリークによるパフォーマンス劣化」が確実に発生する。
極限の知見:オブジェクトのライフサイクル管理
以下の原則を徹底せよ。
- SETの解放: `Set obj = Nothing` はおまじないではない。特に巨大なタスクコレクションをループ処理した後は必須である。
- イベントの無効化: 自動エクスポート中に無限ループが発生しないよう、`Application.EnableEvents = False` を必ず挟む。
Public Sub SafeExport(pj As Project, path As String)
Dim app As Application
Set app = Application
‘ イベント連鎖を遮断(必須)
app.EnableEvents = False
On Error GoTo CleanUp
pj.SaveAs Name:=path, Format:=pjXML
CleanUp:
‘ 確実に解放し、メモリスタックをクリアする
app.EnableEvents = True
Set app = Nothing
End Sub
4. BIパイプラインとしての設計思想
XMLを保存したら終わりではない。そこからがデータエンジニアリングの領域だ。
1. ステージング層: 保存されたXMLをネットワーク共有フォルダ(またはOneDrive for Business)に集約する。
2. 変換層 (Power Query): XMLの各ノード(`
3. 可視化層: Power BIの「折れ線グラフ」で、ベースライン対実績のトレンドを可視化する。
5. チーフアーキテクトからの忠告
この手法を導入する際、最も注意すべきは「ネットワークI/Oのボトルネック」だ。巨大なProjectファイル(数千行レベル)を保存するたびにXMLをネットワークドライブへ書き出せば、プロジェクトマネージャーの作業効率は激減する。
- 解決策: ローカルの `%TEMP%` 領域に書き出し、バックグラウンドの非同期プロセス(VBScriptやPowerShellのジョブ)で、差分のみをサーバーへ同期せよ。
—
終わりに:技術は「道具」ではなく「哲学」である
VBAを使いこなすことは、古いツールを弄ぶことではない。Microsoftのアーキテクチャの深淵に触れ、システムを自分の意のままに操る鍛錬である。
「なぜ動くか」だけでなく「なぜそのメモリ消費量なのか」「なぜそのI/Oタイミングなのか」を追求した時、初めてあなたのコードは「レガシー」から「資産」へと昇華する。
健闘を祈る。
