【入門編】リソース割り当てと依存関係を同時に最適化する自動化ロジック – Project VBA解析バイブル

スポンサーリンク

こんにちは。Project VBAの世界へようこそ。
「マクロの記録」ボタンを押すだけの世界から、ついに設計者としての第一歩を踏み出すのですね。素晴らしい決断です。

Project VBAは、単なる自動化ツールではありません。プロジェクトという「時間とリソースのパズル」を、あなたの書いたコードで解き明かすためのエンジンです。今日は、多くの現場が苦しむ「タスクの依存関係とリソース負荷を同時に解決する」という、極めて実戦的なテーマを紐解いていきましょう。

1. なぜ「依存関係」と「リソース」を同時に扱う必要があるのか?

プロジェクト管理において、タスクは「誰がやるか(リソース)」によって、その開始日が物理的に左右されます。

  • 依存関係: Aが終わらないとBは始められない(FS関係)。
  • リソース制約: Aに割り当てられた担当者がパンクしていれば、Bの開始を後ろにずらさねばならない。

これを手動で調整するのは地獄です。VBAなら、この「連鎖」を数ミリ秒で計算し、ガントチャートに反映させることができます。これができるようになると、あなたはもう「作業員」ではなく「アーキテクト」です。

2. 核心となるロジック:タスクを「動かす」ための思考法

VBAでProjectを操作する際、最も重要なのは「TaskオブジェクトのStartプロパティを書き換える」ことではありません。「Predecessors(先行タスク)とResourceAssignments(リソース割り当て)を読み解き、カレンダー上の空きを見つける」ことです。

陥りやすい罠:直接的な日付代入

初心者がやりがちなのは「`Task.Start = Date`」と直接日付を放り込むこと。これはプロジェクト全体の整合性を破壊します。Projectの計算エンジン(スケジューラ)に、条件を与えて「計算させる」というスタンスを忘れないでください。

3. 実践コード:依存関係とリソース負荷を考慮した自動調整

このコードは、指定したタスクの「先行タスク完了日」と「担当者の稼働状況」を比較し、遅い方に合わせて開始日を自動補正する雛形です。

Sub OptimizeTaskSchedule(targetTask As Task)
Dim predTask As Task
Dim maxStartDate As Date
Dim resourceBusyDate As Date

‘ 1. 先行タスクの完了日を確認(依存関係の考慮)
maxStartDate = targetTask.Project.StartDate
For Each predTask In targetTask.PredecessorTasks
If predTask.Finish > maxStartDate Then
maxStartDate = predTask.Finish
End If
Next predTask

‘ 2. リソースの空き状況を確認(簡易的な判定)
‘ ここでは担当者の「今の割り当て済み最終タスク」を取得するイメージ
resourceBusyDate = GetResourceAvailability(targetTask.Assignments(1).Resource)

‘ 3. どちらか遅い方を開始日に設定
Dim calculatedStart As Date
calculatedStart = IIf(maxStartDate > resourceBusyDate, maxStartDate, resourceBusyDate)

‘ プロジェクトのエンジンに計算を委ねるためにStartプロパティを更新
targetTask.Start = calculatedStart

Debug.Print targetTask.Name & ” を ” & calculatedStart & ” に設定しました。”
End Sub

‘ リソースの稼働状況を簡易的に取得する関数
Function GetResourceAvailability(res As Resource) As Date
‘ 実際にはAssignmentsをループして、そのリソースの最後のタスクの終了日を返す
GetResourceAvailability = Date + 1 ‘ 仮の値(実際にはここでロジックを組む)
End Function

4. プロフェッショナルの視点:ここをクリアすれば「一人前」

コードを書いていて、以下のエラーや挙動にぶつかったことはありませんか?

  • 「手動調整モード」の壁: タスクが手動スケジュールモードになっていると、VBAで日付を入れてもProjectのエンジンが計算してくれません。必ず `Task.Manual = False` を確認してください。
  • コレクションのインデックス: `targetTask.Assignments(1)` と書く際、そのタスクにリソースが割り当てられていないとエラーになります。`If targetTask.Assignments.Count > 0 Then` という「防御的プログラミング」が、現場の安定運用を支えます。

最後に:自動化は「対話」である

Project VBAの面白いところは、「Microsoft Projectという巨大な頭脳」と対話している感覚になれる点です。

あなたが書くコードは、単なる命令ではありません。プロジェクトという生き物を、より効率的で、より無理のない未来へと導く「提案」なのです。

まずは、小さなタスク一つからで構いません。「先行タスクの終了に合わせて、開始日が自動で動く」その瞬間の快感を味わってください。そこから先は、あなたの無限のアイデア次第です。

何か詰まったら、いつでも戻ってきてください。また次のレベルの知見をお伝えしますよ。応援しています。

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