Project VBAの深淵へ:リソース「代行者」設定でプロジェクトの継承を自動化する
こんにちは。現場で泥臭い自動化を積み重ね、いつしかプロジェクト管理の裏側をVBAで操るようになったチーフアーキテクトです。
「リソースの入れ替え」――これはPMにとって最も胃が痛くなる瞬間の一つですよね。担当者が変わるたびに、何百ものタスクに紐づくリソースを一つずつ手動で書き換えていませんか?
もしそんなことをしていたら、それは「Project VBAの力」をドブに捨てているのと同じです。今日は、プロジェクトの「魂(=過去の割り当て実績)」を残したまま、スムーズに新メンバーへバトンを渡す「代行者設定」の自動化術を伝授します。
—
なぜ「代行者(Assignment)」の操作が重要なのか?
Projectにおいて、リソースの入れ替えは単なる「名前の書き換え」ではありません。過去の実績(Actual Work)と、これからの予定(Remaining Work)の整合性を保つという、非常にセンシティブな作業です。
手動でやると、以下のような「負の連鎖」が必ず起きます。
- 割り当ての断絶: 過去の実績がリセットされてしまう。
- 工数計算の狂い: 稼働率(Units)の再設定を忘れてスケジュールが崩壊する。
- ヒューマンエラー: 100件のタスクのうち1件だけ旧担当者が残る。
これらを解決するための「魔法の杖」がVBAです。
—
実践:リソース交代を自動化するロジック
まずは、特定の「旧担当者」が持つ全タスクを「新担当者」へ引き継ぐためのコードを見てみましょう。Project VBAのオブジェクトモデルにおける `Assignment`(割り当て)オブジェクトを操作します。
‘ プロジェクト内のタスクから旧担当者を新担当者へ置き換える
Sub ReplaceResource(oldResourceName As String, newResourceName As String)
Dim tsk As Task
Dim asn As Assignment
Dim proj As Project
Set proj = ActiveProject
‘ プロジェクト内の全タスクを走査する(これが基本のキです)
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ 各タスクに紐づく割り当て情報をチェック
For Each asn In tsk.Assignments
If asn.ResourceName = oldResourceName Then
‘ 割り当てを更新(ここが肝です)
‘ リソースの役割を引き継ぐためにIDを確認しつつ置換
asn.ResourceName = newResourceName
‘ ログを出力して進捗を可視化する
Debug.Print “タスクID: ” & tsk.ID & ” を ” & newResourceName & ” に変更しました。”
End If
Next asn
End If
Next tsk
MsgBox “リソースの交代が完了しました。スケジュールを再計算してください。”, vbInformation
End Sub
コードの重要なポイント(アーキテクトの視点)
1. `For Each tsk In proj.Tasks`:
Projectのオブジェクトモデルは階層構造です。プロジェクトの中にタスクがあり、タスクの中に割り当て(Assignment)がある。この構造さえ理解すれば、どんな複雑な管理も怖くありません。
2. `If Not tsk Is Nothing`:
初心者が忘れがちなのがこの「Nothingチェック」。Project VBAでは、削除されたタスクなどが空のオブジェクトとして存在することがあるため、これがないと突然のクラッシュを招きます。
3. `asn.ResourceName`:
リソースのプロパティを直接書き換えることで、工数や実績データを保持したまま担当者だけを入れ替えることができます。
—
陥りやすい罠:ここをクリアすれば「脱・初心者」
多くの人がVBAを使い始めると、以下の壁にぶつかります。
- 「割り当て」と「リソース」の混同
- プロジェクト全体のリソースリスト(Resources)を書き換えるのではなく、個々のタスクに紐づく「割り当て(Assignment)」を操作していることを意識してください。
- パフォーマンスの問題
- 数千タスクある大規模プロジェクトでこのコードを走らせると、描画のせいで非常に重くなります。`Application.ScreenUpdating = False` を冒頭に入れ、処理が終わったら `True` に戻す癖をつけましょう。これだけで実行速度が劇的に変わります。
- 再計算のタイミング
- VBAで一括置換した後は、Project内部のスケジュールエンジンが再計算を必要とします。コードの最後に `CalculateAll` を呼び出すことを忘れないでください。
—
最後に:自動化は「プロジェクトへの愛」である
今回紹介したコードは、単なる効率化ツールではありません。「担当者が変わっても、プロジェクトの歩みは止めない」という、PMとしての誠実さを表現するための手段です。
「マクロの記録」から卒業し、こうしてオブジェクトモデルを直接操作できるようになると、Projectは単なる「管理表」から「動的なエンジン」へと進化します。
皆さんのプロジェクトが、この自動化によって少しでもスムーズに、そして皆さんのストレスが少しでも軽減されることを願っています。もしコードで詰まったら、いつでも戻ってきてくださいね。また次の極意でお会いしましょう。
