こんにちは。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という巨大な頭脳」と対話している感覚になれる点です。
あなたが書くコードは、単なる命令ではありません。プロジェクトという生き物を、より効率的で、より無理のない未来へと導く「提案」なのです。
まずは、小さなタスク一つからで構いません。「先行タスクの終了に合わせて、開始日が自動で動く」その瞬間の快感を味わってください。そこから先は、あなたの無限のアイデア次第です。
何か詰まったら、いつでも戻ってきてください。また次のレベルの知見をお伝えしますよ。応援しています。
