【入門編】Project VBAによる「リソース平準化」の自動実行と結果の検証レポート作成 – Project VBA解析バイブル

スポンサーリンク

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の深い森を切り拓くお手伝いをしますよ。

タイトルとURLをコピーしました