【Project VBA極意】ベースライン乖離を可視化せよ:進捗管理を「勘」から「科学」へ変える設計術
現場でよく見る光景がある。PMがProjectの画面とにらめっこし、Excelに手入力で進捗を転記する姿だ。これほど非効率で、かつ「ヒューマンエラー」という爆弾を抱えた業務はない。
Project VBAは単なる自動化ツールではない。プロジェクトの履歴を紐解き、計画(ベースライン)と現実の乖離を冷徹に突きつけるための「診断装置」だ。今日は、複数のベースラインを比較し、逸脱を自動検知する、実戦投入レベルのアーキテクチャを授ける。
—
1. なぜ「手作業」がプロジェクトを腐らせるのか
初心者は、単に「タスクの終了日を取得してExcelに書き出す」ことしか考えない。だが、これでは進捗の「質」を見失う。
真に管理すべきは、「ベースライン(計画)に対する現在の進捗の乖離」だ。
- なぜ直接参照ではダメなのか: Projectのオブジェクトモデルは、反復処理(ループ)が重い。Taskオブジェクトを一つずつ叩くようなコードは、数千行のプロジェクトではフリーズを誘発する。
- 設計の鉄則: 比較データは一度メモリ(配列)に展開せよ。セルへ何度もアクセスするのは、I/O負荷を肥大化させる最大の間違いだ。
2. 高速かつ堅牢な実装:差分レポート生成ロジック
以下のコードは、現在の進捗と「ベースライン0(初期計画)」を比較し、終了日が3日以上遅延しているタスクのみを抽出してExcelへ出力する設計だ。
‘ 必要な参照設定: Microsoft Project 16.0 Object Library
‘ 実行対象: プロジェクトファイルを開いた状態で実行
Public Sub ExportBaselineVarianceReport()
Dim proj As Project
Dim task As task
Dim arrData() As Variant
Dim i As Long, rowCount As Long
Set proj = ActiveProject
rowCount = proj.Tasks.Count
‘ 配列に格納してメモリ上で処理を行う(高速化の要)
ReDim arrData(1 To rowCount, 1 To 4)
i = 0
For Each task In proj.Tasks
If Not task Is Nothing Then
‘ 完了済みタスクを除外するフィルタリングロジック
If task.PercentComplete < 100 Then
' ベースライン0の終了日と現在の終了日を比較
' 3日以上の遅延があるものだけを抽出
If DateDiff("d", task.Baseline0Finish, task.Finish) > 3 Then
i = i + 1
arrData(i, 1) = task.Name
arrData(i, 2) = task.Baseline0Finish
arrData(i, 3) = task.Finish
arrData(i, 4) = DateDiff(“d”, task.Baseline0Finish, task.Finish) & “日遅延”
End If
End If
End If
Next task
‘ Excelへの出力処理
Call OutputToExcel(arrData, i)
End Sub
Private Sub OutputToExcel(dataArray() As Variant, dataCount As Long)
Dim xlApp As Object, xlBook As Object, xlSheet As Object
Set xlApp = CreateObject(“Excel.Application”)
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Sheets(1)
‘ ヘッダー設定
xlSheet.Range(“A1:D1”).Value = Array(“タスク名”, “計画終了日”, “現在終了日”, “状況”)
‘ 配列を一気に書き込む(高速化手法)
If dataCount > 0 Then
xlSheet.Range(“A2”).Resize(dataCount, 4).Value = dataArray
End If
xlApp.Visible = True
End Sub
3. 実務で生き残るための「3つの極意」
このコードを「使える」レベルに昇華させるために、以下の3点を意識してほしい。
① ベースラインの存在確認を怠るな
`task.Baseline0Finish` は、ベースラインが設定されていないプロジェクトでは「NA」やエラーを返す。運用に回す際は、必ず `If task.Baseline0Finish <> “NA”` でガード節を設けること。これを怠ると、全タスクで実行時エラーが発生する。
② データの鮮度を担保せよ
ベースラインの比較は、「現在開いているファイル」だけでなく、アーカイブ済みのBaselineファイルとの比較が必要になる場合が多い。その際は、`FileOpenEx` を使い、読み取り専用で過去のプロジェクトファイルをバックグラウンドで開き、データを取得する設計に拡張すべきだ。
③ 堅牢なエラーハンドリング
Projectのオブジェクトは、稀に「ゴーストタスク(削除されたはずの参照)」を保持することがある。`task Is Nothing` のチェックは必須だ。これがないVBAは、いつか必ずクラッシュする。
最後に:自動化は「対話」を生むためにある
自動化エンジニアとして断言する。VBAで差分レポートを作る目的は、報告書を楽に作ることではない。「計画のどの部分が崩れ始めているか」という事実を早期に突きつけ、チームでの議論を促すことにある。
Excelに吐き出された「遅延リスト」を見て、メンバーが「なぜ遅れたのか」を語り始める。それこそが、プロジェクトマネジメントの本質だ。
さあ、退屈な転記作業はマシンに任せ、君はプロジェクトの「舵取り」に集中してほしい。それができる人間だけが、この過酷な現場で生き残れる。
