【実務・中級編】リソースの「プロジェクト参加期間」をタスクの開始・終了から自動算出する – Project VBA解析バイブル

スポンサーリンク

プロジェクト管理の「聖杯」を求めて:リソース参画期間をVBAで完全自動同期させる設計論

プロジェクトマネジメントにおいて、最も不毛で、かつミスが許されない作業は何か。それは「タスクの変更に追従して、手動でリソースの参画期間を更新すること」だ。

タスクの開始日が前倒しになれば、リソースシートの開始日も修正する。終了日が後ろに伸びれば、それもまた修正する。この「同期作業」は、プロジェクトが拡大するほどにヒューマンエラーの温床となり、最終的にはコスト計算の崩壊を招く。

今日は、Project VBAを使い、この泥沼から君たちを解放する「堅牢な自動化アーキテクチャ」を伝授する。

—

1. なぜ「力技のループ」ではいけないのか

多くの初学者が書くコードは、全てのタスクを全件走査し、リソースごとに日付を比較する非効率なものだ。Projectのタスク数が数千を超えた瞬間、そのツールは動かなくなる。

真のエンジニアが追求すべきは、「イベントドリブン」かつ「最小探索」だ。
リソースの参画期間は、「そのリソースに割り当てられた全タスクの中で、最も早い開始日と、最も遅い終了日」という定義に集約される。これを、プロパティの変更をトリガーに動的に解決する。

2. 実装の要諦:堅牢な設計指針

1. データ整合性の担保: 割り当て(Assignment)の変更をトリガーにし、リソース(Resource)側を更新する。
2. パフォーマンスの最適化: 毎回フルスキャンはしない。該当リソースのみを再計算する。
3. 例外処理の徹底: 割り当てがゼロになった場合や、プロジェクト全体が空の状態でも落ちない堅牢性を持たせる。

—

3. プロダクションコード:ResourceSyncEngine

以下のコードは、Projectの標準モジュールに配置し、適切なタイミング(タスク変更時など)で呼び出すことを想定している。

‘ ————————————————————————-
‘ Module: ResourceSyncEngine
‘ Purpose: タスクの割り当てからリソースの参画期間を自動算出し更新する
‘ Author: Chief Architect
‘ ————————————————————————-
Option Explicit

Public Sub UpdateResourceParticipation(ByVal targetResID As Long)
Dim proj As Project
Dim res As Resource
Dim assn As Assignment
Dim minStart As Date
Dim maxFinish As Date

Set proj = ActiveProject
Set res = proj.Resources.UniqueID(targetResID)

‘ 初期値の設定(あり得ない日付で初期化)
minStart = #12/31/2099#
maxFinish = #1/1/1900#

Dim hasAssignment As Boolean
hasAssignment = False

‘ リソースの全割り当てを精査
For Each assn In res.Assignments
‘ 割り当てが存在し、かつ有効なデータであることを確認
If Not assn Is Nothing Then
If assn.Start < minStart Then minStart = assn.Start If assn.Finish > maxFinish Then maxFinish = assn.Finish
hasAssignment = True
End If
Next assn

‘ 割り当てがない場合はクリアし、ある場合は更新
If hasAssignment Then
res.Start = minStart
res.Finish = maxFinish
Else
res.Start = “NA”
res.Finish = “NA”
End If

Debug.Print “Resource ” & res.Name & ” updated: ” & res.Start & ” to ” & res.Finish
End Sub

運用のヒント:イベントへのフック

このプロシージャを実戦で活かすには、`ThisProject` モジュールの `Project_AssignmentChange` イベントにフックさせるのが定石だ。

Private Sub Project_AssignmentChange(ByVal asgn As Assignment)
‘ 割り当てが変更された瞬間に、該当リソースのみ再計算を実行する
‘ これにより計算量を劇的に抑え、巨大なプロジェクトでも軽快に動作する
Call UpdateResourceParticipation(asgn.ResourceUniqueID)
End Sub

—

4. データベース連携と保守性への視点

このコードをベースに外部DB(SQL ServerやSharePoint等)と連携させる場合、以下の点に注意せよ。

  • 書き込みの競合: プロジェクトファイルと外部DBで「どちらが正(Single Source of Truth)」かを明確にすること。自動化ツールでプロジェクトを更新したら、即座にDBへプッシュする仕組みが理想だ。
  • 計算の遅延: 大規模なプロジェクトでは、全ての変更をリアルタイムにDBに書き込むとロックが発生する。キューイング処理を挟み、バッチ更新するアーキテクチャを検討すべきだ。

最後に:エンジニアとしての心構え

ツールを作ることは目的ではない。君たちの目的は、プロジェクトをコントロール下に置くことだ。
このスクリプトは、単なるコードの断片ではなく、プロジェクトのリソース管理を「属人化する作業」から「システムに委ねる資産」へと昇華させるための鍵である。

コードをコピペして終わるな。なぜこの設計が最速なのか、なぜこの例外処理が必要なのかを考え抜け。それこそが、伝説的エンジニアへの第一歩だ。

何か実装上のボトルネックや、特定の複雑な割り当てルール(例:予備リソースの除外など)への対応が必要なら、またいつでも聞くといい。現場の戦場から、期待している。

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