伝説のアーキテクトが説く:Project VBAで「リソースの最大単位」を最適化する極意
こんにちは。現場の泥臭い課題をコードで解決し続けてきた、Project VBAのアーキテクトです。
「リソースの最大単位(MaxUnits)をどう設定するか?」
これはプロジェクトマネジメントの永遠の課題です。100%と設定してパンクさせたり、逆に過小評価してリソースを遊ばせたり……。経験則だけで決めるのは、もう終わりにしましょう。
今回は、過去の実績データから「真の稼働率」を導き出し、次期プロジェクトのMaxUnitsを自動更新するプロフェッショナルなアプローチを伝授します。
—
1. なぜ「MaxUnits」の最適化が重要なのか?
Projectにおける`MaxUnits`は、そのリソースがどれだけのパワーをプロジェクトに注げるかを示す「器」です。
- 100%超え: リソースに過負荷をかけ、品質低下を招く。
- 低すぎる設定: リソースの空き時間を可視化できず、プロジェクトの進捗にボトルネックを生む。
VBAを使えば、過去の「実稼働実績(Actual Work)」と「計画工数(Baseline Work)」の比率から、「このリソースは実際には何%で稼働するのが最適か」という真実を瞬時に算出できます。
—
2. 現場で使える!最適化ロジックの全貌
まずは、コードを見る前に「何を計算するか」を整理しましょう。
1. 過去の全タスクから、特定リソースの実績工数を抽出する
2. 計画に対する実績の乖離率を算出する
3. その乖離率を反映した「推奨MaxUnits」を導き出す
では、さっそくコードを見ていきましょう。
Sub OptimizeResourceMaxUnits()
‘ プロジェクト内のすべてのリソースを巡回
Dim res As Resource
Dim actualWork As Double
Dim plannedWork As Double
Dim performanceRatio As Double
‘ 画面更新を停止して処理を高速化
Application.ScreenUpdating = False
For Each res In ActiveProject.Resources
‘ リソースが「作業」タイプであるかを確認(材料リソースは除外)
If res.Type = pjResourceTypeWork Then
‘ 過去の実績と計画工数を取得(単位は時間)
actualWork = res.ActualWork / 60
plannedWork = res.Work / 60
‘ 計画に対してどれだけ稼働したかの比率を計算
If plannedWork > 0 Then
performanceRatio = actualWork / plannedWork
‘ 現状のMaxUnitsを更新(例: 乖離率を反映させる)
‘ ※安全のため上限を100%に設定するロジック
res.MaxUnits = Application.Min(1, performanceRatio)
Debug.Print res.Name & ” の最適化完了: ” & (res.MaxUnits 100) & “%”
End If
End If
Next res
Application.ScreenUpdating = True
MsgBox “リソースの最適化が完了しました。”
End Sub
—
3. 初学者が陥りやすい「3つの罠」
このコードを書く上で、多くの初心者が躓くポイントがあります。ここを回避できるだけで、あなたは「脱・初心者」です。
① 「単位」の魔術(分 vs 時間)
Project VBAの内部値は、基本的に「分」で保持されています。コード内で `/ 60` を行っているのは、我々が扱いやすい「時間」に変換するためです。ここを忘れると、計算結果が60倍になってしまいます。
② リソースタイプを見極める
リソースには「作業」「材料」「コスト」の3種類があります。`res.Type = pjResourceTypeWork` というフィルターを入れないと、材料リソースの単位を書き換えようとしてエラー(または予期せぬ挙動)が発生します。
③ 画面更新(ScreenUpdating)の重要性
数千行規模のプロジェクトで一つずつリソースを操作すると、Projectは非常に重くなります。`Application.ScreenUpdating = False` を入れるだけで、処理速度は劇的に向上します。これは「プロの作法」です。
—
4. ステップアップ:さらに精度を高めるには?
上記のコードは「過去全体の平均」を見ていますが、現場の達人はさらに一歩先を見ます。
- 期間で絞り込む: `res.ActualWork` ではなく、直近3ヶ月のデータに限定する。
- 例外処理: 特定の熟練エンジニアだけはMaxUnitsを固定(例:120%)にする条件分岐を追加する。
Project VBAは単なる自動化ツールではありません。あなたの「マネジメントの思想」を反映させるためのキャンバスです。
—
最後に:コードは「対話」である
マクロは一度書いて終わりではありません。
「なぜこのリソースはMaxUnitsが低かったのか?」
「なぜ計画と実績がこれほど乖離したのか?」
コードが弾き出す数字を眺めながら、プロジェクトの歴史を読み解いてみてください。それができるようになった時、あなたは単なる「マクロを書く人」ではなく、真の「プロジェクト・アーキテクト」になっているはずです。
今回のコードをベースに、自分なりのロジックを組み込んでみてください。壁にぶつかったら、またここに戻ってきてください。いつでも歓迎しますよ。
