【実務・中級編】タスクの「リソース」と「依存関係」を組み合わせた、負荷平準化の自動化ロジック – Project VBA解析バイブル

スポンサーリンク

プロジェクトを止めない:VBAで構築する「自動負荷平準化エンジン」の極意

プロジェクトマネジメントにおいて、最も忌むべきは「リソースのオーバーコミット」だ。特定の担当者にタスクが集中し、ボトルネックが生まれた瞬間、ガントチャートはただの紙屑と化す。

多くのエンジニアは、Excel上で手動でタスクを後ろ倒しにしているが、それはナンセンスだ。今回は、Project VBA(Microsoft Project Object Library)を駆使し、依存関係を壊さずにリソースの過負荷を自動で解消する「スケジューリングエンジン」の設計思想を伝授する。

1. なぜ「力技のループ」は失敗するのか

多くの初心者は、全タスクをループで回し、`Task.Start` をひたすら加算するコードを書く。これは間違いだ。理由は二つ。

1. 再帰的依存の崩壊: 依存関係(Predecessors)はネットワーク構造だ。単純なループでは、親タスクの変更が子タスクに波及する「連鎖的な遅延」を考慮できない。
2. イベントのオーバーヘッド: `Task` オブジェクトのプロパティを書き換えるたびに、MS Projectの計算エンジンが再計算(Re-calculate)を走らせる。数千行のプロジェクトでこれを行えば、処理は数分でフリーズする。

極意: プロパティを叩く回数を最小化し、Projectの組み込みエンジンを信じて計算を「委ねる」設計にすることだ。

2. 自動平準化エンジンのアーキテクチャ

今回構築するのは、以下のロジックで動く軽量エンジンだ。

1. 過負荷検知: リソースの `Work`(作業時間)が、指定した閾値を超えているか判定。
2. 依存関係の保持: 依存先がある場合、その「後続タスク」の開始日を `Task.Predecessors` を通じて動的に特定。
3. スライド処理: 過負荷分を後ろ倒しにし、後続タスクへ伝播させる。

3. 実装:プロダクションレベルの平準化ロジック

このコードは、リソースの負荷を監視し、超過分を翌日に押し出すロジックの核となる部分だ。

‘ 依存関係を崩さずにリソース負荷を調整するエンジンコア
Sub LevelingEngine(targetResourceName As String, maxDailyHours As Double)
Dim pj As Project: Set pj = ActiveProject
Dim t As Task
Dim res As Resource
Dim assignment As assignment

‘ プロジェクトの自動再計算を一時的に抑制し、高速化を図る
pj.Calculation = pjManual

For Each t In pj.Tasks
If Not t Is Nothing Then
For Each assignment In t.Assignments
If assignment.ResourceName = targetResourceName Then
‘ リソースの1日あたりの負荷が閾値を超えているか
If assignment.Work / 60 > maxDailyHours Then
‘ タスクを1日(8時間分)後ろ倒しにする
t.Start = DateAdd(“d”, 1, t.Start)

‘ 依存関係により後続タスクも連鎖的に後ろ倒しされる
‘ MS ProjectのエンジンがPredecessorを自動計算する
End If
End If
Next assignment
End If
Next t

‘ 最後に再計算を実行し、プロジェクト全体を整合させる
pj.Calculation = pjAutomatic
End Sub

4. 運用上の「鉄則」:データ整合性と外部連携

このツールを現場で運用する際、以下の3点に注意せよ。これを怠ると、データの整合性は一夜にして崩壊する。

  • カレンダー設定の同期: VBAで日付を計算する際、`pj.StandardCalendar` を考慮しないと、土日を無視したスケジュールが生成される。日付操作には `DateAdd` ではなく、Projectの `Application.DateAdd` を使うのがプロの流儀だ。
  • データベース(外部ソース)連携: ExcelやSQL Serverからタスクを読み込む際、GUID(ユニークID)を必ず保持せよ。行番号(ID)は、タスクの並び替え一つで変動する。IDをキーにしてDB連携するのは、開発者の自殺行為だ。
  • Undoスタックの爆発: 大規模な変更を加える際、`Application.UndoClear` を適宜呼び出し、メモリを解放せよ。さもないと、Ctrl+Zが効かなくなるだけでなく、アプリケーション自体がクラッシュする。

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

自動化の目的は「楽をすること」ではない。「人間が本来考えるべき、プロジェクトのボトルネックに対する戦略的な意思決定」に時間を割くことだ。

このVBAエンジンは、単なるタスクの移動ツールではない。プロジェクトという有機体を、常に健全な状態に保つための「自律神経」である。コードをコピペするだけでなく、あなたのプロジェクトの特性に合わせて、閾値の動的変更や優先順位の重み付けを実装してほしい。

技術は、使い手によって凶器にも、最強の武器にもなる。さあ、あなたのプロジェクトを、コードの力でコントロールせよ。

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