【実務・中級編】Assignment.Workを操作してリソースの稼働率を平準化するテクニック – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握する:リソース平準化の「自動化」を極めるアーキテクチャ設計

プロジェクト管理において、リソースの過負荷は「静かなる時限爆弾」です。特定のリソースに作業が集中し、ボトルネックが発生する。それを手動で平準化するのは、Excelの海で溺れるような非効率な作業です。

本稿では、Project VBA(Microsoft Project Object Model)を駆使し、`Assignment.Work`を動的に操作することで、リソース負荷を自動で均等化する実戦的な手法を伝授します。

—

1. なぜ「標準の平準化機能」では足りないのか

Project標準の「リソース平準化(Leveling)」は強力ですが、ブラックボックスです。複雑な依存関係や特定の制約条件(「このタスクは絶対に動かしたくない」など)がある場合、標準機能は往々にしてプロジェクト全体を崩壊させます。

我々エンジニアが求めるのは、「特定のビジネスルールに基づいた、予測可能な平準化」です。これを実現するための鍵は、`Assignment`オブジェクトのライフサイクルと、その背後にある`Work`(作業時間)のデータ構造を正しく理解することにあります。

—

2. 堅牢な平準化エンジンを構築するための3つの鉄則

コードを書く前に、以下のアーキテクチャ上の注意点を胸に刻んでください。

  • Undoスタックを汚染しない: 大規模な変更を行う際は、必ず`Application.Calculation = pjManual`で計算モードを停止し、処理後に再計算させること。これを怠ると、GUIの更新が走り続け、処理速度が数百倍低下します。
  • Timephased Dataの罠: `Assignment.Work`は単なる数値ではありません。時系列データです。総量だけを変えても、Projectは「どこに割り当てるか」を自動再計算してしまいます。特定の期間に負荷を寄せるなら、`TimephasedData`を直接操作する覚悟が必要です。
  • 例外処理の標準化: リソースが休暇中(Calendar設定)である場合、`Work`の割り当てはエラーを吐きます。必ず`Resource.Calendar`を参照し、稼働可能な日のみをターゲットにしてください。

—

3. 実装コード:リソース負荷平準化のプロトタイプ

以下は、特定の期間内におけるリソースの過負荷を検知し、指定された上限(例: 1日6時間)に収まるよう自動調整するロジックのコア部分です。

‘ プロジェクトの負荷を平準化するメインプロシージャ
Public Sub LevelResourceWorkload(targetResourceName As String, maxDailyHours As Double)
Dim proj As Project
Dim res As Resource
Dim asn As Assignment
Dim tph As TimephasedData

Set proj = ActiveProject
Set res = proj.Resources(targetResourceName)

‘ パフォーマンス最適化のため計算モードを停止
Application.Calculation = pjManual

On Error GoTo ErrorHandler

For Each asn In res.Assignments
‘ 割り当てられたタスクのタイムフェーズデータを走査
For Each tph In asn.TimephasedData
‘ 稼働時間が上限を超えている場合のみ調整
If tph.Value > (maxDailyHours 60) Then ‘ プロジェクト内部単位は分
‘ ここにビジネスロジックを実装
‘ 例: 超過分を翌日へ分散させるアルゴリズム
Debug.Print “Overload Detected: ” & tph.Start & ” – Task: ” & asn.Task.Name
tph.Value = maxDailyHours 60
End If
Next tph
Next asn

‘ 処理後に計算を再開し、Projectに整合性をとらせる
Application.Calculation = pjAutomatic
Exit Sub

ErrorHandler:
Application.Calculation = pjAutomatic
MsgBox “Error: ” & Err.Description, vbCritical
End Sub

—

4. プロダクション環境での運用:データベース連携の注意点

もしこのツールを、Project単体ではなく、SQL Server上のプロジェクト管理データベースと連携させる場合、以下の点に注意してください。

1. 書き込み競合の回避: `Application.FileSave`をフックし、保存直前に平準化ロジックが走るようイベントハンドラ(`Project_BeforeSave`)を設定することを推奨します。
2. 監査ログの記録: `Assignment`の値を書き換えることは「履歴」を改ざんすることと同義です。VBA内で、誰がいつ、どのタスクをどれだけ調整したのかを別テーブル(またはカスタムフィールド)に書き出す設計を組み込んでください。

—

5. 最後に:エンジニアとしての矜持

自動化とは、単にコードを書くことではありません。「標準機能がカバーしきれないエッジケースを、論理的帰結として解決する」プロセスそのものです。

今回紹介したコードは、あくまで「骨子」です。現場の複雑な制約(祝日管理、スキルレベルによる係数、進捗状況による優先度)を組み込み、あなただけの「最強の平準化エンジン」を完成させてください。

VBAはレガシーではありません。正しく設計すれば、エンタープライズ環境で最も信頼できる「自動化の武器」となります。さあ、次はあなたの番です。コードを書き、プロジェクトを制御下に置きましょう。

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