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

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、「自分の手でプロジェクトの時間をデザインしたい」と願うあなたへ。

今回は、実務で最も頭を悩ませる難所の一つ「リソースの過負荷検知と、依存関係を崩さない自動平準化(ラグタイム調整)」をテーマに、VBAを使った極限の自動化ロジックを授けましょう。

「残業が特定の人に集中している…」「先行タスクとのつながりを保ったまま、上手に後ろ倒しする方法がわからない…」
そんな現場の悲鳴を、たった一撃のVBAコードで解決する方法を一緒に紐解いていきます。ここをクリアすれば、あなたも立派なProject VBAのアーキテクトです。肩の力を抜いて、一緒に進んでいきましょう!

—

1. なぜ「リソースの過負荷」と「依存関係」の組み合わせは難しいのか?

Projectでガッツリスケジュールを組んだことがある方ならお気づきでしょう。
人間誰しも、1日に稼働できる限界(標準では8時間など)があります。そこにキャパシティを超える量のタスクが割り当てられると、Projectは赤字の人型アイコン(過負荷アラート)を点滅させます。

これを手動で解消しようとすると、以下の地獄が待っています。
1. 過負荷を見つける:「あ、今週の佐藤くん、120%の稼働だ…」
2. タスクを後ろにずらす:タスクをドラッグして後ろに延ばす。
3. 依存関係の連鎖が崩れる:後ろにずらしたせいで、後続のタスク(Bさん担当)のスタートまで狂い、全体の納期がズタズタに……。

「依存関係(先行・後続)という『絶対のルール』を守りつつ、リソースの過負荷(キャパシティ超過)を解消するために、タスクの開始日を自動で後ろ倒し(ラグタイムを設定)する」
これをアルゴリズム化するのが今回のミッションです。

—

2. 自動平準化の基本アプローチとVBAの武器

Project VBAでこれを実現するためには、以下のオブジェクトを巧みに操る必要があります。

  • `Task.Resources`:タスクに割り当てられているリソース(人)のコレクション。
  • `Assignment.Work` / `Overallocated`:割り当てられた仕事量と、過負荷状態かどうかを判定するプロパティ。
  • `Task.Successors` / `Predecessors`:依存関係(先行・後続)。
  • `Task.Lag`:ここがポイント!タスクを後ろ倒しする際に、直接日付を強制書き換えするのではなく、「ラグタイム(遅延時間)」を調整することで、依存関係の論理を壊さずにスケジュールをスライドさせます。

—

3. 実装コード:リソース過負荷自動平準化エンジン

それでは、開発環境(VBE)を開いて、以下のコードを標準モジュールに貼り付けてみてください。実務の現場でそのまま使える、堅牢かつ洗練されたコードを用意しました。

‘ ==============================================================================
‘ 【上級者向け】リソース過負荷検知 & ラグタイム自動調整エンジン
‘ ==============================================================================
Sub AutoLevelingByLag()
Dim t As Task
Dim a As Assignment
Dim targetPredecessor As Task
Dim currentLag As Long

‘ 画面描画を停止してマクロの実行速度を極限まで爆アゲする
Application.ScreenUpdating = False

On Error GoTo ErrorHandler

MsgBox “リソースの過負荷スキャンと平準化を開始します。”, vbInformation, “自動化エンジン起動”

‘ プロジェクト内のすべてのタスクをループ処理
For Each t T In ActiveProject.Tasks
‘ サマリタスク(親タスク)やマイルストーン、削除済みタスクは除外
If Not t Is Nothing Then
If Not t.Summary And t.Milestone = False Then

‘ タスクに割り当てられたリソースの割り当て(Assignment)をチェック
For Each a In t.Assignments
‘ もしリソースが「過負荷(Overallocated)」状態であれば
If a.Overallocated Then

‘ デバッグ出力(イミディエイトウィンドウで確認可能)
Debug.Print “過負荷検知: タスクID [” & t.ID & “] ” & t.Name & ” (担当: ” & a.ResourceName & “)”

‘ 依存関係(先行タスク)が存在するか確認
If t.Predecessors.Count > 0 Then
‘ 簡略化のため、最初の先行タスクとの間のラグタイムを調整
Set targetPredecessor = t.Predecessors(1).ToTask

‘ 現在のラグタイムを取得(分単位で保持されているため、1日分 = 480分 を加算)
‘ ※ここでは過負荷解消の応急処置として「1日(8時間 = 480分)」のラグ(遅延)を追加
currentLag = t.Predecessors(1).Lag
t.Predecessors(1).Lag = currentLag + 480 ‘ 480分 = 1日後ろ倒し

Debug.Print ” -> 対策実行: タスクID ” & t.ID & ” のラグを ” & (currentLag + 480) / 480 & “日 に調整しました。”
End If

End If
(Next a

End If
End If
Next t

Application.ScreenUpdating = True
MsgBox “平準化のシミュレーションが完了しました。スケジュールを確認してください。”, vbInformation, “処理完了”
Exit Sub

ErrorHandler:
Application.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的なエラー”
End Sub

—

4. コードの深掘り解説:ここがエンジニアのこだわりポイント

初心者から一歩抜け出すために、このコードの「キモ」をいくつか解説しておきます。ここを理解すれば、あなたのVBAスキルは本物になります。

① `Application.ScreenUpdating = False` の魔法

Projectは、タスクのプロパティを1つ変更するたびに、裏側で全体のスケジュール(クリティカルパスや他のタスクへの影響)を再計算しようとします。
ループの中でこれをやると、数千行のプロジェクトではフリーズしたかのように遅くなります。最初に画面描画を切り、最後に戻す。これだけで実行速度が数十倍〜数百倍変わります。プロの鉄則です。

② `Assignment.Overallocated` による正確な検知

「忙しそうだから」という人間の感覚ではなく、Projectが持っているカレンダーとリソースプールを突き合わせた結果の真実、それが `Overallocated` プロパティです。これを使うことで、システムが客観的に「キャパオーバーだ」と判断した瞬間をピンポイントで捕らえられます。

③ 日付を直接いじらず、`Lag` をいじる美学

ここが本記事の最重要テーマです。
過負荷だからといって、タスクの `Start` 日付を直接 `t.Start = t.Start + 1` のように書き換えると、何が起きるでしょうか?
Projectが持っている「先行・後続の美しい依存関係の鎖(ネットワーク)」がプツリと切れ、スケジュール全体の整合性が崩壊します(これをスケジュールデッドロックと呼ぶ人もいます)。
「日付を直接変えるな、ラグタイム(Lag)をいじれ」。これが依存関係を維持したままスマートに後ろ倒しする唯一の正解アプローチです。

—

5. 陥りやすいエラーと「現場の罠」

実際にこのコードを運用したり、自分でアレンジしたりするときに、必ずハマる罠があります。あらかじめ知っておきましょう。

  • 罠1:「無限ループ」の恐怖

ラグを増やした結果、全体の納期が延び、さらに別のリソースの過負荷を誘発する……というカオスが起きます。実務で使う場合は、ループ回数に上限(カウンター)を設けるか、段階的にシミュレーションする安全装置を入れましょう。

  • 罠2:リソースプールが正しく設定されていない

そもそもProject側でリソースの「最大単位(Max Units)」が「100%」などと正しく登録されていないと、`Overallocated` は一生 `False` のままになり、コードが働きません。VBAの前に、Projectの基本設定が命です。

—

まとめ:ここをクリアすれば、Project VBAの基本はバッチリです!

お疲れ様でした!
今回は、タスクの「リソース過負荷」と「依存関係(ラグタイム)」という、Project VBAのなかでも最も骨のある領域に踏み込みました。

  • リソースの悲鳴を `Overallocated` で聞き取る
  • 依存関係の鎖を守るために、日付ではなく `Lag` を操作する
  • パフォーマンスのために `ScreenUpdating` を必ず制御する

この3つを自分のものにしたあなたなら、もはや単なる「マクロの記録者」ではありません。現場のスケジュール管理を自動化し、プロジェクトを裏から操る「チーフアーキテクト」への道を確実に歩んでいます。

ぜひ、ご自身の開発環境やテスト用のプロジェクトでこのコードを試し、カスタマイズしてみてください。あなたの業務自動化ライフが、さらに知的でエキサイティングなものになりますように!

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