プロジェクトの「呼吸」を可視化せよ:VBAによるベースライン抽出・BI連携パイプラインの極意
プロジェクトマネジメントにおいて、ベースラインは「真実の北極星」だ。しかし、多くの現場ではこの貴重なデータが単なる静的なアーカイブとして放置されている。
今日は、MS ProjectのVBAを使い、保存イベントをトリガーとしてベースラインをXML形式で抽出し、Power BI等のBIツールで「予実乖離のトレンド」をリアルタイム監視するパイプラインの設計思想を伝授する。
—
1. なぜ「手動エクスポート」は死ぬのか
多くのエンジニアが犯す過ちは、UI経由での手動エクスポートや、場当たり的なマクロによるCSV出力だ。
- データの一貫性欠如: 誰がいつ保存したか不明なデータは分析のノイズになる。
- スキーマの脆弱性: CSVは構造化データとしては貧弱だ。XML(またはJSON)で出力し、スキーマ定義を保持しなければ、将来的なBI側のモデル変更に耐えられない。
我々が目指すのは、「保存操作と同時に、プロジェクトの解剖図を自動生成する」堅牢なパイプラインである。
—
2. アーキテクチャ設計:イベント・ドリブン・抽出
Projectオブジェクトモデルにおいて、`ProjectBeforeSave` イベントをフックするのが正攻法だ。しかし、ここには落とし穴がある。「保存中」のデータは不完全である可能性があるため、書き込み完了後のタイミングで正確にスナップショットを撮る必要がある。
堅牢なコード設計のポイント
1. 疎結合: 抽出ロジックは標準モジュールに分離し、イベント側はトリガーのみを担当する。
2. エラーハンドリング: ファイルIOエラーでプロジェクトの保存自体を阻害してはならない。
3. データ正規化: BIツールが読み込みやすいよう、フラットな構造で書き出す。
—
3. 実践:ベースライン抽出パイプライン
以下のコードは、プロジェクトの全タスクからベースラインデータを抽出し、XML形式で指定パスへ書き出すモジュールだ。
‘ 【標準モジュール: modBaselineExporter】
Option Explicit
Public Sub ExportBaselineToXML(ByVal proj As Project, ByVal exportPath As String)
Dim ts As Task
Dim xmlDoc As Object
Set xmlDoc = CreateObject(“MSXML2.DOMDocument”)
‘ XML構造のルート作成
Dim root As Object
Set root = xmlDoc.createElement(“ProjectBaseline”)
xmlDoc.appendChild root
‘ タスクごとのベースラインを抽出
For Each ts In proj.Tasks
If Not ts Is Nothing Then
Dim taskNode As Object
Set taskNode = xmlDoc.createElement(“Task”)
‘ 必要最小限のキーメトリクスを抽出
AddNode xmlDoc, taskNode, “ID”, ts.ID
AddNode xmlDoc, taskNode, “Name”, ts.Name
AddNode xmlDoc, taskNode, “BaselineStart”, ts.BaselineStart
AddNode xmlDoc, taskNode, “BaselineFinish”, ts.BaselineFinish
AddNode xmlDoc, taskNode, “BaselineCost”, ts.BaselineCost
root.appendChild taskNode
End If
Next ts
‘ ファイル保存
xmlDoc.Save exportPath
End Sub
Private Sub AddNode(doc As Object, parent As Object, nodeName As String, nodeValue As Variant)
Dim node As Object
Set node = doc.createElement(nodeName)
node.Text = CStr(nodeValue)
parent.appendChild node
End Sub
‘ 【ThisProjectモジュール】
Private Sub Project_BeforeSave(ByVal pj As Project, ByVal SaveAsUi As Boolean, Cancel As Boolean)
On Error Resume Next ‘ 保存そのものを止めないための防御策
Dim path As String
path = “C:\ProjectData\Baseline_” & Format(Now, “yyyyMMdd_HHmmss”) & “.xml”
Call ExportBaselineToXML(pj, path)
If Err.Number <> 0 Then
Debug.Print “ベースライン抽出に失敗: ” & Err.Description
End If
On Error GoTo 0
End Sub
—
4. BIツール連携へのラストワンマイル
抽出されたXMLは、Power BIの「XMLコネクタ」でそのまま読み込める。ここで重要なのは、「いつのベースラインか」というタイムスタンプをファイル名(またはメタデータ)で管理することだ。
- データモデルの構築: Power BI側で「日付フォルダ」を監視する設定にすれば、保存されるたびにデータが更新される。
- トレンド分析: 過去の全ファイルを結合することで、「計画がどのようにズルズルと右側にシフトしていったか」という遅延の軌跡(トレンド)が可視化される。これが管理職に求められる「真の可視化」だ。
—
5. 伝説的エンジニアからの提言
この自動化を導入する際、絶対に忘れてはならないのが「Projectのパフォーマンス」への配慮だ。タスク数が数千を超える巨大なプロジェクトの場合、`BeforeSave` イベント内でのループ処理は保存時間を増大させる。
もし巨大なプロジェクトを扱うなら、ファイルへの直接書き込みではなく、一度メモリ上のコレクションに格納し、非同期で書き出す設計を検討せよ。
VBAはレガシーと言われるが、プロジェクトの「魂」であるベースラインを最も近くで操作できるのは、この言語をおいて他にない。道具を使いこなすのではない。道具を支配し、データからプロジェクトの未来を予見する。それこそが、我々エンジニアの真の役割だ。
さあ、あなたのプロジェクトの「呼吸」を、データで可視化しよう。
