プロジェクトの「心臓部」を入れ替える:ActualWorkを壊さずにリソースを置換する極意
こんにちは。現場の最前線で、数々の過酷なプロジェクトをVBAで救ってきたチーフアーキテクトです。
Project VBAを触り始めると、誰もが一度は「リソースの入れ替え」で頭を抱えます。メンバー交代の際、単純にアサインを消して新メンバーを入れれば、それまで積み上げた「実績工数(ActualWork)」が霧散してしまう。かといって無理やり値を書き換えれば、Projectの整合性チェックが働いてエラーの嵐……。
今日は、「実績を保持したまま、安全かつスマートにリソースを入れ替える」という、実務で最も要望が多く、かつ最も事故りやすいプロセスをマスターしましょう。
—
なぜ「そのまま入れ替え」てはいけないのか?
Projectのデータ構造は、非常に繊細な「親子関係」と「依存関係」で成り立っています。
- Assignment(割り当て): タスクとリソースを結ぶ接着剤。
- ActualWork(実績工数): その接着剤に刻まれた、過去の努力の記録。
これを単純に `Delete` して `Add` すると、プロジェクト管理の歴史(ヒストリー)が断絶します。我々エンジニアがやるべきは、「情報のバトンタッチ」です。
—
安全な置換のための3ステップ
1. 実績の退避: 旧リソースの実績値を読み取る。
2. 新規割り当て: 新リソースをアサインする。
3. 実績の転写: 新しい割り当てに対し、退避した実績を書き込む。
この一連の流れをVBAで制御します。
—
実装コード:リソース置換のセーフティ・エンジン
このコードは、現在選択中のタスクを対象に、旧リソースから新リソースへ実績を引き継いで交代させるためのテンプレートです。
Sub ReplaceResourceSafely()
Dim tsk As Task
Dim oldResName As String, newResName As String
Dim oldAsn As Assignment, newAsn As Assignment
Dim actualWork As Variant
‘ 1. 対象設定(本来はダイアログ等で指定させるとより実用的です)
oldResName = “田中”
newResName = “佐藤”
‘ 選択中のタスクを取得
Set tsk = ActiveCell.Task
If tsk Is Nothing Then Exit Sub
‘ 2. 旧割り当ての探索と実績のバックアップ
Set oldAsn = tsk.Assignments.Item(oldResName)
If oldAsn Is Nothing Then
MsgBox “旧リソースが見つかりません。”
Exit Sub
End If
‘ ActualWorkはVariantで受け取る(単位のブレを防ぐため)
actualWork = oldAsn.ActualWork
‘ 3. 新しいリソースを割り当て
Set newAsn = tsk.Assignments.Add(ResourceID:=ActiveProject.Resources(newResName).ID)
‘ 4. 実績の引き継ぎ
‘ ここが重要:Projectは実績を書き込む際、整合性を保つために計算が走る
newAsn.ActualWork = actualWork
‘ 5. 旧割り当ての削除
oldAsn.Delete
MsgBox “リソース置換完了:実績 ” & actualWork & ” 分を引き継ぎました。”
End Sub
—
初学者が陥りやすい「3つの落とし穴」
コードを書いていて「動かない」「エラーが出る」と悩んだら、ここを確認してください。
① `Assignments.Add` の引数エラー
`Add` メソッドにはリソース名ではなく、`ResourceID` を渡すのが鉄則です。リソース名で直接探すと、同姓同名のリソースが存在する場合に意図しない挙動を引き起こします。
② 単位の不一致
`ActualWork` はデフォルトで「分(Minute)」単位で扱われることが多いです。Excelなどから取得したデータをそのまま入れると、桁がずれることがあります。必ずProjectの標準単位(`Application.DefaultDurationUnits`)を確認しましょう。
③ 削除のタイミング
実績を引き継ぐ前に旧リソースを削除してはいけません。Projectの仕様上、割り当てがなくなったタスクの実績は、親タスクの属性へ吸収されるか、単純に消失する挙動をとる場合があります。必ず「新しい器(Assignment)を用意してから古い器を捨てる」という順序を守ってください。
—
先輩エンジニアからのアドバイス:自動化の先へ
今回紹介した手法は、いわば「外科手術」です。一度マスターすれば、リソース管理の自動化レベルが一気に上がります。
さらに上を目指すなら、`Application.Calculation = pjManual` を活用してみてください。マクロ実行中にProjectが自動計算を繰り返すとパフォーマンスが落ち、予期せぬ整合性エラーが起きやすくなります。実行前に計算モードをオフにし、終了後にオンに戻す。この「一呼吸置く」配慮こそが、伝説のエンジニアの流儀です。
ここをクリアすれば、Project VBAの「リソース制御」はもう怖くありません。自信を持って、現場の自動化を推し進めてくださいね。応援しています!
