MS Project VBAの極意:リソース平準化を完全自動化し、プロジェクトの「静寂」を手に入れる
こんにちは。Project VBAの世界へようこそ。
「マクロの記録」ボタンを押して、生成された呪文のようなコードに絶望したことはありませんか?大丈夫です。それはあなたが悪いのではなく、Projectのオブジェクトモデルが少しだけ「気難しい」だけなのです。
今回は、現場のPMが最も頭を悩ませる「リソース平準化(Leveling)」をテーマに、VBAでシステムを制御し、結果を検証するプロフェッショナルなアプローチを伝授します。
—
1. Project VBAの心臓部:オブジェクトモデルを理解する
Project VBAを操る上で、まずはこの階層構造を脳に焼き付けてください。
- Application: プロジェクト全体(ExcelでいうExcel本体)
- Project: 開いている各プロジェクトファイル
- Task: 計画の最小単位。ここが平準化の対象です。
- Resource: 人や機材。過負荷(オーバーアロケーション)の主犯格です。
平準化を自動化するということは、「Applicationオブジェクトを通じてProjectに対し、設定(LevelingOptions)を指示し、平準化エンジン(LevelResources)を回し、その結果をResourceオブジェクトから読み取る」という一連のライフサイクルを制御することに他なりません。
—
2. 実践:リソース平準化自動化コード
このコードは、平準化を実行し、過負荷が残っているかを判定してログを出力するものです。
Sub AutomateResourceLeveling()
Dim prj As Project
Dim res As Resource
Dim hasOverallocated As Boolean
Set prj = ActiveProject
‘ 1. 平準化の設定(LevelingOptions)を定義
‘ 毎回手作業でダイアログを開くのは非効率の極みです
With prj
.LevelingOptions CheckOverallocations:=pjLevelingAutomatic, _
LevelingOrder:=pjLevelDefault, _
AutoLevel:=True
End With
‘ 2. 平準化の実行
‘ ここが心臓部。Projectの計算エンジンを呼び出します
prj.LevelResources
‘ 3. 検証:平準化後の過負荷チェック
hasOverallocated = False
Debug.Print “— 平準化検証レポート [” & Now & “] —”
For Each res In prj.Resources
‘ OverAllocatedプロパティは、リソースが過負荷状態ならTrueを返す
If Not res Is Nothing Then
If res.OverAllocated Then
Debug.Print “警告: リソース ‘” & res.Name & “‘ は依然として過負荷です。”
hasOverallocated = True
End If
End If
Next res
If Not hasOverallocated Then
Debug.Print “成功: 全リソースの平準化が完了しました。”
Else
Debug.Print “注意: 一部手動調整が必要です。”
End If
End Sub
—
3. ここをクリアすれば一人前!陥りやすい罠
初学者が必ず突き当たる壁がいくつかあります。ここを突破すれば、あなたはもう「マクロの記録」卒業生です。
① `Nothing` の存在を忘れない
`For Each res In prj.Resources` でループする際、リソースの中に「空の行」が含まれることがあります。`If Not res Is Nothing Then` を入れないと、コードは突然の「オブジェクト変数またはWithブロック変数が設定されていません」というエラーで沈黙します。「オブジェクトは常に壊れるもの」という前提でガード節を書くのが、プロのたしなみです。
② 計算エンジンのラグ(非同期的な挙動)
`LevelResources` を実行した直後、Projectはバックグラウンドで計算を行いますが、非常に複雑なスケジュールの場合、計算が完了する前に次の行が実行されることがあります。
もし結果がおかしいと感じたら、`CalculateAll` を明示的に呼び出すか、少しだけ待機(DoEvents)させるのがコツです。
③ 手動設定との競合
`LevelingOptions` で設定した内容は、プロジェクトファイル内に保存されます。つまり、一度実行すると設定が残ります。「前回設定したルールが邪魔をして思うように動かない」という時は、`ClearLevelingValues` メソッドで一度平準化をリセットする癖をつけてください。
—
最後に:自動化は「対話」である
VBAによる自動化は、単なる作業の短縮ではありません。
「なぜリソースが平準化できないのか?」「どこにボトルネックがあるのか?」というProjectの悲鳴を、ログを通じて対話するプロセスなのです。
今回のコードをベースに、過負荷リソースの名前をメールで送る、あるいはExcelにレポートを書き出すといった機能を追加してみてください。それが、あなたの生産性を劇的に変える第一歩になります。
何か分からないことがあれば、いつでも聞いてください。Projectの深い森を切り拓くお手伝いをしますよ。
