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

スポンサーリンク

プロジェクトの「時間」を制御せよ:VBAで構築する自律型スケジューリングエンジンの極意

こんにちは。プロジェクトの現場で日々、ExcelやProjectの海を泳いでいる皆さん。
「タスクを詰め込みすぎてリソースがパンクしている」「依存関係を崩さずにスケジュールの調整をするのが面倒だ」……そんな悩みを抱えていませんか?

今日は、マクロの記録から一歩先へ進み、「プロジェクトの時間をプログラムで制御する」という、エンジニアとしての醍醐味を味わえる領域に踏み込みます。Project VBAを使い、リソースの過負荷を検知して自動でタスクを後ろ倒しにする、簡易スケジューリングエンジンを構築しましょう。

1. なぜ「自動化」が必要なのか?

プロジェクト管理において、もっとも恐ろしいのは「見えない過負荷」です。
誰か一人の担当者にタスクが集中し、それに気づかず依存関係(Aが終わらないとBが始まらない)を無視して進めると、プロジェクトは必ず破綻します。

手動で一つずつずらすのは泥臭い作業です。VBAを使えば、以下のロジックで「完璧なスケジュール」を自動算出できます。

1. 負荷の算出: 特定の日付にリソースの割り当てが許容値を超えていないか確認。
2. 依存関係の確認: そのタスクが「先行タスク」を持っているか確認。
3. 後ろ倒し(Push): 負荷が解消されるまでタスクの開始日をスライドさせる。

2. 開発の舞台:Project VBAのオブジェクト構造を理解する

まず、Project VBAを操る上で避けて通れないのが「オブジェクトの階層」です。

  • `ActiveProject`: 今開いているプロジェクトそのもの。
  • `Task`: 一つのタスク。ここには `Start`(開始日)、`Finish`(終了日)、`Resources`(担当者)が含まれます。
  • `Resource`: プロジェクトの人材。`Assignments`(割り当て)を通じてタスクと紐付きます。

これらを操るのが、「プロジェクトを支配する」ということです。

3. 実践:簡易スケジューリングエンジン

以下のコードは、指定したリソースの負荷をチェックし、もし超過していればタスクを1日後ろへずらすシンプルなエンジンです。

Sub AutoLevelingEngine()
Dim tsk As Task
Dim resName As String
Dim threshold As Double

‘ 負荷の限界値(例:1日あたりの最大稼働率)
threshold = 8 ‘ 8時間/日
resName = “山田太郎”

‘ プロジェクト内の全タスクを走査
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
‘ タスクに特定の担当者が割り当てられているか確認
If tsk.Assignments.Count > 0 Then
‘ ※簡略化のため、ここでは「山田太郎」が割り当てられているか判定
If InStr(tsk.ResourceNames, resName) > 0 Then

‘ ここで過負荷検知ロジックを発動(本来は日付別の集計が必要)
‘ 今回は「仮に過負荷なら後ろ倒し」というプロトタイプです
If CheckOverload(tsk, resName) Then
‘ タスクを1日後ろへずらす
tsk.Start = tsk.Start + 1
Debug.Print “タスク「” & tsk.Name & “」を後ろ倒ししました。”
End If
End If
End If
End If
Next tsk

MsgBox “スケジューリング調整が完了しました。”
End Sub

‘ 簡易的な過負荷判定ロジック
Function CheckOverload(t As Task, rName As String) As Boolean
‘ ここに複雑なリソース稼働率計算を記述します
‘ 今回は例として「常に過負荷」と判定させています
CheckOverload = True
End Function

4. 陥りやすいエラーと「伝説の知見」

初学者が必ず突き当たる壁が2つあります。ここをクリアすれば、あなたはもう中級者です。

① 「読み取り専用」の罠

Projectのオブジェクトは、親タスク(サマリータスク)に対して値を書き込もうとするとエラーになることが多いです。必ず `If Not tsk.Summary Then` と条件分岐を入れ、末端のタスク(作業タスク)のみを操作するようにしましょう。

② 計算のループ地獄(再帰的依存関係)

タスクAをずらすと、それに依存するタスクBもずれる。その結果、Aがさらに押し出される……という無限ループに注意してください。
解決策: 調整は「古いタスクから順に」行うこと。`For Each` で回す際は、タスクの開始日順にソートしておくのが鉄則です。

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

今回作成したコードは、あくまで「エンジン」の土台です。実際の現場では、これに「祝日の考慮」「リソースのスキルレベルによる変動」などを肉付けしていきます。

プログラミングは、魔法ではなく「論理の積み重ね」です。
「面倒だな」と思った瞬間こそが、自動化の神様が降りてきた合図。その直感を信じて、どんどんコードを書いてみてください。

ここをクリアできれば、あなたのプロジェクト管理は劇的に進化します。応援していますよ!

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