MS Project VBAで実現する「稼働率予実管理」:Excel脱却のその先へ
プロジェクトマネジメントにおいて、最も恐ろしいのは「見えない遅延」だ。
週次報告で「順調です」と言っていたリソースが、実は昨日からキャパシティを超えていた――。この予実の乖離を早期に検知できないPMは、プロジェクトを沈没させる。
今回は、MS Projectの強力なオブジェクトモデルを叩き、「リソースの稼働率(Work vs Actual Work)」を抽出し、予実乖離を即座に視覚化するダッシュボード構築術を伝授する。
1. なぜ「Excel転記」ではダメなのか
多くの現場が、Projectからデータを手動でExcelにエクスポートし、VLOOKUPで集計している。だが、それは「静止画」を見ているに過ぎない。
真の自動化エンジニアが目指すべきは、Projectのタスク・リソース基盤から直接「現在の歪み」を吸い上げるパイプラインだ。
堅牢な設計のための3つの鉄則
1. オブジェクトをキャッシュせよ: `ActiveProject.Resources`を何度もループさせてはならない。メモリへのアクセス負荷を最小限に抑えるのが鉄則だ。
2. 計算はVBA側で完結させよ: Project内での計算結果をExcelのセルに流し込む際、中間データを介在させるとファイル破損のリスクが高まる。
3. 例外処理の徹底: リソースが割り当てられていないタスクや、実績入力が未完了のケースを想定した`On Error Resume Next`の適切なスコープ管理が命綱となる。
—
2. 実践:稼働率抽出マクロ(Production-Ready Code)
このコードは、Projectの各リソースに対し、予定工数(Work)と実績工数(Actual Work)を比較し、超過率(乖離率)を算出するコアロジックだ。
‘ プロジェクト内の全リソースの稼働状況をイミディエイトウィンドウに出力する(ダッシュボードのデータソースとして活用)
Sub ExportResourceUtilization()
Dim res As Resource
Dim variance As Double
Dim workVal As Double, actualVal As Double
‘ プロセス効率化:画面更新を停止して処理速度を最大化
Application.ScreenUpdating = False
Debug.Print “ResourceName,Work,ActualWork,VarianceRate”
For Each res In ActiveProject.Resources
‘ リソースが割り当てられていない場合はスキップ
If Not res Is Nothing Then
‘ 予定工数と実績工数を取得(単位:時間)
workVal = res.Work / 60
actualVal = res.ActualWork / 60
‘ 予実乖離の算出(0除算回避)
If workVal > 0 Then
variance = (actualVal – workVal) / workVal
Else
variance = 0
End If
‘ CSV形式で出力(これを外部ファイルやExcelへ流し込む)
Debug.Print res.Name & “,” & workVal & “,” & actualVal & “,” & Format(variance, “0.00%”)
End If
Next res
Application.ScreenUpdating = True
MsgBox “稼働率解析データの抽出が完了しました。”, vbInformation
End Sub
—
3. ダッシュボードへの統合:注意すべき「罠」
このコードで出力したデータをPower BIやExcelのピボットテーブルに渡す際、以下の点に注意せよ。
- タイムスライスデータの罠: `res.Work`は累積値である。時系列の変化を見るには、`res.TimeScaleData`メソッドを用い、週単位または日単位でデータをスライスする必要がある。これにはかなりの計算コストがかかるため、「更新頻度」を業務フローとして定義せよ。
- ファイルロックの回避: プロジェクトファイルとレポート用Excelを別々に管理する場合、ADO(ActiveX Data Objects)を用いて、ProjectからExcelへ直接書き込む構成が最も堅牢だ。これにより、Excelファイルを「開く」という操作から解放される。
4. 伝説のエンジニアからの提言
コードは動けばいいのではない。「誰がいつ見ても、プロジェクトの健康状態が0.5秒で判断できる」ようにすることがエンジニアの責務だ。
今回紹介したロジックをベースに、リソースの乖離率が20%を超えた場合に自動でTeamsやSlackにアラートを飛ばす拡張機能を追加してほしい。それができれば、君のプロジェクトから「炎上」という言葉は消滅するはずだ。
自動化とは、単なる作業の省略ではない。「管理者の視界をクリアにするための投資」である。今日から、このコードと共にプロジェクトの深淵を覗き込んでみてくれ。
