こんにちは。プロジェクトマネジメントの現場で「予定通りに進まないタスク」と「リソースの空き状況」の板挟みになり、頭を抱えたことはありませんか?
MS Projectの標準機能も優秀ですが、大規模なプロジェクトになればなるほど、「特定のスキルを持った人間が、いつからアサイン可能か」という動的な制御は、標準機能の限界を超えてきます。
今日は、Project VBAの真髄である「Assignment(割り当て)オブジェクト」を自在に操り、リソースの空き状況に合わせて開始日を自動補正するアルゴリズムを一緒に構築していきましょう。
—
1. なぜ「手動」ではダメなのか?
リソースの割り当てにおいて、多くの初心者が陥る罠が「開始日の固定」です。
- タスクの前提条件(先行タスク)が変わったのに、リソースの開始日がズレない。
- リソースが別のプロジェクトで埋まっているのに、自動で開始日が後倒しされない。
これらを解決するには、`Assignment.Start` プロパティを単に書き換えるだけでなく、「依存関係(Predecessors)」と「リソースの稼働状況」を突き合わせるアルゴリズムが必要です。
—
2. 割り当て自動調整のロジック構築
コードを書く前に、頭の中で以下の「思考フロー」を整理しましょう。
1. タスクの先行条件を確認する: そのタスクが「いつ終わるのか」を特定する。
2. リソースの空きを確認する: そのリソースが既に他のアサインで埋まっていないかを確認する。
3. 開始日を再計算する: 「先行タスクの終了日」と「リソースの空き日」の遅い方を採用し、割り当て日を更新する。
—
3. 実践コード:スマート・アサイナー
以下のコードは、指定したタスクに対してリソースを割り当てる際、先行タスクの完了を待機しつつ、リソースの空きを考慮して自動補正するプロトタイプです。
Sub AutoAdjustAssignment()
Dim tsk As Task
Dim res As Resource
Dim asn As Assignment
Dim targetDate As Date
‘ プロジェクト内の特定のタスクとリソースを取得
Set tsk = ActiveProject.Tasks(1) ‘ 例: ID 1のタスク
Set res = ActiveProject.Resources(“山田 太郎”)
‘ 1. 先行タスクの完了日を取得(依存関係の考慮)
‘ 先行タスクがなければ今日から開始
If tsk.PredecessorTasks.Count > 0 Then
targetDate = tsk.PredecessorTasks(1).Finish
Else
targetDate = Date
End If
‘ 2. アサインメントの作成(または既存の取得)
Set asn = tsk.Assignments.Add(ResourceId:=res.ID)
‘ 3. リソースの空き状況に基づいた開始日の補正
‘ ここがキモ:単に代入するのではなく、論理的な日付を選択する
If targetDate < res.AvailableFrom Then
targetDate = res.AvailableFrom
End If
' 4. 割り当て開始日の適用
asn.Start = targetDate
MsgBox "リソース " & res.Name & " を " & targetDate & " から割り当てました。"
End Sub
---
4. 初学者が必ず躓く「エラーの壁」
このコードを動かす際に、以下のポイントに気をつけてください。
- 日付の整合性: `asn.Start` に過去の日付や、タスクのプロジェクト期間外の日付を代入すると、MS Projectが警告を出すか、自動的に調整されてしまいます。代入前には必ず `If` 文で範囲チェックを行いましょう。
- カレンダーの罠: プロジェクトカレンダーとリソースカレンダーが異なる場合、`targetDate` が「土日」や「休日」になる可能性があります。実務では `ActiveProject.BaseCalendars` を参照し、稼働日判定を入れるのがプロの作法です。
- 計算モードの確認: `Application.Calculation = pjManual` に設定してから一括処理を行い、最後に再計算(`CalculateAll`)をかけることで、パフォーマンスが劇的に向上します。
—
5. 最後に:エンジニアとして成長するために
今回紹介したのは、ほんの入り口に過ぎません。Project VBAをマスターするコツは、「オブジェクトの階層構造(Project > Task > Assignment > Resource)」を脳内で地図のように描けるようになることです。
「リソースが足りない」と嘆くのではなく、「システムがリソースを最適化するようにコードを書く」。それが、伝説の自動化エンジニアへの第一歩です。
まずはこのコードをコピーして、ご自身のプロジェクトで動かしてみてください。うまく動かない箇所があれば、それは「あなたのプロジェクトの運用ルール」がコードとぶつかっている証拠です。その衝突こそが、システムの仕様をより深く理解するための最高の教材になります。
ここをクリアすれば、あなたはもう脱・初心者です。次回のステップアップでお会いしましょう!
