【入門編】リソースの「オーバーアロケーション」を解消するための自動平準化シミュレーター – Project VBA解析バイブル

スポンサーリンク

【Project VBA極意】標準機能に頼らない!「自動平準化シミュレーター」でリソースの枯渇を救え

こんにちは。現場で泥臭く、しかし誰よりもスマートにProjectを操る自動化エンジニアです。

皆さんはMicrosoft Projectの「平準化機能」を使ったことはありますか? あれは確かに便利ですが、「思った通りに動かない」「急にタスクが数ヶ月先に飛んでしまった」といった経験はありませんか?

実は、プロの世界では標準機能に頼り切ることはリスクです。なぜなら、プロジェクトの「優先順位」や「現場の暗黙知」までは標準機能は理解してくれないからです。

今回は、VBAを使って「特定の優先順位に従ってタスクを後ろ倒しする」という、現場で一番求められるカスタム平準化ロジックを伝授します。これさえ理解すれば、あなたはもう「マクロの記録」を卒業したエンジニアの仲間入りです。

—

1. なぜ「標準機能」ではなく「VBA」なのか?

標準の平準化機能は、機械的に「誰かが忙しすぎたら後ろにズラす」ことしかできません。しかし、現実のプロジェクトはそうではありませんよね。

  • 「このタスクは重要だから、他の作業を止めてでも優先したい」
  • 「この担当者の負荷だけは、特定の期間は超えてもいい」

こうした「プロジェクトの意思」をコードで表現できるのがVBAの強みです。リソースのオーバーアロケーション(過剰割り当て)を自動で検知し、賢くシフトさせる仕組みを作りましょう。

—

2. 自動平準化シミュレーターの設計思想

今回作るシミュレーターは、以下のロジックで動きます。

1. リソースの負荷状況をスキャンする(現在誰がパンクしているか?)
2. 優先順位に従ってタスクを並べる(優先度フラグが高いものを先にする)
3. 負荷を超過しているタスクを順次後ろへずらす(再配置)

—

3. 実践コード:タスク・リソース平準化の核心

まずは、特定のプロジェクト内にあるタスクを操作する基本的なロジックを見てみましょう。

Sub CustomResourceLeveling()
Dim tsk As Task
Dim res As Resource
Dim proj As Project

Set proj = ActiveProject

‘ プロジェクト内の全タスクをループ処理
For Each tsk In proj.Tasks
‘ 完了していないタスクのみを対象にする
If Not tsk Is Nothing And tsk.PercentComplete < 100 Then ' リソースの負荷を簡易的にチェック ' ※実際にはAssignmentオブジェクトで詳細な稼働率を確認します If IsOverAllocated(tsk) Then ' 優先度(Priority)が高い場合は何もしない If tsk.Priority < 500 Then ' 負荷超過している場合、開始日を1日後ろへシフト tsk.Start = tsk.Start + 1 ' ログを出力して進捗を可視化(ここがデバッグの肝です) Debug.Print "タスク「" & tsk.Name & "」を平準化のためシフトしました。" End If End If End If Next tsk MsgBox "平準化シミュレーションが完了しました!" End Sub ' 簡易的な過剰負荷チェック関数 Function IsOverAllocated(tsk As Task) As Boolean ' ここでは簡略化していますが、本来はAssignment.WorkとCapacityを比較します ' 開発の現場ではここに「特定のカレンダー」情報を組み込むのがコツです IsOverAllocated = (tsk.ResourceNames <> “”) ‘ ※ダミーロジック
End Function

—

4. 開発現場で陥りやすい「3つの罠」

このコードを書く際、多くの初心者がここでつまずきます。

① オブジェクトの「Nothing」チェックを忘れる

Project VBAでは、空の行や削除されたタスクがオブジェクトとして存在している場合があります。`If Not tsk Is Nothing Then` を書く癖をつけないと、予期せぬエラーでマクロが止まってしまいます。

② 日付計算の罠

`tsk.Start = tsk.Start + 1` と書くと、土日も考慮して日付が進んでしまいます。稼働日のみを加算したい場合は、Projectの`Application.DateAdd`メソッドを使うのがプロの流儀です。

③ インタフェースの更新負荷

数千件のタスクがある場合、ループのたびに画面を更新(再描画)すると、処理時間が数分単位で変わります。`Application.ScreenUpdating = False` で画面更新を止めるだけで、処理速度は劇的に向上します。

—

5. 次のステップ:ここをクリアすれば「伝説」への道が拓ける

今回のコードはあくまで「平準化の種」です。ここから先は、以下の要素を組み込んでいくと、さらに強力なツールになります。

  • 優先順位のデータベース化: Excelのシートに「優先順位マスタ」を作り、VBAで読み込ませる。
  • 例外処理の構築: 「どうしても動かせないタスク」をフラグ管理し、コードで除外する。
  • レポート機能: 平準化前後の負荷状況をグラフとして別シートに書き出す。

VBAは単なる自動化ツールではありません。「プロジェクトの論理をコードという言語で最適化するツール」です。

まずはこのコードをコピーして、ご自身のプロジェクトファイルで動かしてみてください。タスクが整然と並び直す瞬間、きっとVBAの本当の魅力に気づくはずです。

もし分からないことがあれば、いつでも聞いてくださいね。あなたのプロジェクトが、よりスマートに前進することを心から応援しています!

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