【入門編】Assignment.ActualWorkの整合性を保ちながらリソースを置換する安全なマクロ – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「心臓部」を入れ替える: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の「リソース制御」はもう怖くありません。自信を持って、現場の自動化を推し進めてくださいね。応援しています!

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