【入門編】Assignment.Delayを操作して、リソースの割り当て開始を自動調整するツール – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵へ:リソースの「遅延(Delay)」を操り、スケジュールの競合を論理的に解決する

こんにちは。プロジェクト管理の現場で、日々「人の奪い合い」や「リソースのパズル」に頭を悩ませている皆さん。
マクロの記録ボタンを押して満足するのは、今日で卒業しましょう。

Microsoft ProjectのVBAは、単なる自動化ツールではありません。プロジェクトという「生き物」の血流を操作するメスのようなものです。今回は、最も実用的かつ難解な「Assignment.Delay(リソース割り当ての遅延)」をテーマに、リソース競合を力技ではなく、コードの力でスマートに解決する方法を伝授します。

—

1. なぜ「Delay」が必要なのか?

プロジェクト管理において、リソース(人や機材)が複数のタスクに同時に割り当てられ、キャパシティオーバーを起こすことは日常茶飯事です。

通常、Projectは標準機能で「平準化」を行いますが、AI任せの平準化は往々にして「なぜそこで遅延させた?」という不可解な結果を招きます。そこで我々エンジニアが介入し、「特定のタスク開始から〇日後にこのリソースを投入する」という指示をVBAで直接書き込むのです。

リソース割り当ての構造図

  • Task(タスク): 期間(Duration)を持つ仕事の箱。
  • Assignment(割り当て): タスクとリソースを結びつける「契約」。
  • Delay(遅延): その契約の開始を、タスク開始からどれだけ後ろに倒すか。

この「Delay」を操作すれば、タスクそのものの開始日を変えずに、リソースの稼働開始だけをズラすことが可能になります。

—

2. 実践:Assignment.Delay を自動制御するコード

以下のコードは、選択したタスクに割り当てられている特定のリソースに対し、指定した日数分だけ開始を遅らせるツールです。

Sub AdjustResourceDelay()
Dim tsk As Task
Dim asn As Assignment
Dim delayDays As Long

‘ 設定する遅延日数(単位:分で指定するのがProjectの仕様)
‘ 1日 = 480分(標準設定の場合)
delayDays = 480 2 ‘ 2日遅らせる

‘ 選択したタスクに対してループ処理
For Each tsk In ActiveSelection.Tasks
If Not tsk Is Nothing Then
‘ タスクに割り当てられている全リソースをチェック
For Each asn In tsk.Assignments
‘ 特定のリソース名(例: “田中”)のみ対象にする場合
If asn.ResourceName = “田中” Then
‘ Assignment.Delay に数値を代入
asn.Delay = delayDays

Debug.Print tsk.Name & ” の田中さんの開始を ” & delayDays / 480 & ” 日遅延させました。”
End If
Next asn
End If
Next tsk

MsgBox “リソースの遅延調整が完了しました。”, vbInformation
End Sub

コード解説:ここが「プロ」のポイント

1. 分単位の管理: Projectの内部データ構造では、期間は「分」で保持されています。`480分=1日`という定数を意識してください。ここを理解していないと、計算が狂います。
2. Assignmentへのアクセス: `Task`オブジェクトの中に`Assignments`というコレクションが存在します。タスクではなく「割り当て」そのものにプロパティを持つのがポイントです。
3. ActiveSelection: `ActiveSelection.Tasks`を使うことで、ユーザーがガントチャート上で選択した箇所だけを処理対象にできます。これにより、全タスクを壊すリスクを回避します。

—

3. 初学者が陥りやすい「3つの罠」

VBAを書き始めると、必ず以下の壁にぶつかります。事前に知っておけば怖くありません。

① 「読み取り専用です」エラー

Assignmentの一部プロパティは、タスクの進捗状況や実績(Actuals)が入力されていると変更できません。「実績が入っているタスクは触らない」という条件分岐をコードに入れるのが、堅牢なシステムを作る第一歩です。

② 単位の混同

先述の通り、`Delay`は「分」です。もし日数で計算したい場合は、必ず`Project.Options`から稼働時間を取得するか、`480`というマジックナンバーを定数化して管理してください。

③ 循環参照の恐怖

リソースの遅延を操作しすぎると、クリティカルパスが複雑になり、計算がループすることがあります。VBA実行後は必ず `Application.CalculateAll` を呼び出し、プロジェクト全体の整合性を再計算させる癖をつけましょう。

—

4. 最後に:ツールは「調整役」であれ

自動化ツールを作ると、つい「何でもかんでも自動で!」と考えがちですが、Projectにおいてそれは危険です。

今回作成したツールは、あくまで「人間が判断した競合回避のヒントを、素早く反映させるためのレバー」です。全てをアルゴリズムに任せるのではなく、「このタスクのこの人は、少し後ろにずらしたほうが現場が回る」という現場の直感を、コードで補完する。

これこそが、世界最高峰の業務自動化エンジニアが大切にしている「人間と機械の協調」の姿勢です。

さあ、エディタを開いて、プロジェクトの血流をあなたのコードでコントロールしてみましょう。何かわからないことがあれば、またいつでも聞きに来てください。応援していますよ。

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