プロジェクトの「時間」を制御せよ: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. 最後に:エンジニアとしての心構え
今回作成したコードは、あくまで「エンジン」の土台です。実際の現場では、これに「祝日の考慮」「リソースのスキルレベルによる変動」などを肉付けしていきます。
プログラミングは、魔法ではなく「論理の積み重ね」です。
「面倒だな」と思った瞬間こそが、自動化の神様が降りてきた合図。その直感を信じて、どんどんコードを書いてみてください。
ここをクリアできれば、あなたのプロジェクト管理は劇的に進化します。応援していますよ!
