【入門編】Assignment.Costを直接操作して予算管理を行う際の注意点 – Project VBA解析バイブル

スポンサーリンク

こんにちは!Microsoft Projectの裏側でうごめくVBAの深淵へようこそ。
今回は、Project VBAにおける「リソースのコスト管理」、中でも`Assignment.Cost`(割り当てコスト)を直接ハックして予算管理を行う際の極意についてお話しします。

「マクロの記録」から一歩抜け出し、本格的なプロジェクト管理自動化に挑むあなたへ。
ここをクリアすれば、Project VBAの挙動の裏にある「自動計算エンジンとの付き合い方」が手に取るようにわかるようになりますよ。しっかりついてきてくださいね。

—

1. なぜ `Assignment.Cost` を直接触る必要があるのか?

通常、Microsoft Projectは非常に優秀な自動計算エンジンを持っています。

  • 「作業時間(Work)」×「標準単率(Standard Rate)」=「コスト(Cost)」

基本はこの方程式通りにProjectが勝手に計算してくれます。じゃあ、なぜわざわざVBAで `Assignment.Cost`(リソース割り当てのコスト)を直接書き換える必要があるのでしょうか?

実務の現場では、こんな理不尽(?)な要望が飛び交います。

  • 「外部ベンダーへの支払いが、作業時間に関係なく一律の固定見積もり(グロス契約)になった」
  • 「過去の実績コストと、今度発生する追加予算を合算して、強制的に特定の数字に合わせたい」
  • 「細かなタスクごとの工数算出が面倒なので、トップダウンでコストを割り当てたい」

こういう時、Projectのデフォルトの自動計算に逆らわずにやろうとすると、単率を無理やりいじったり、ダミーの残業時間を仕込んだりと、データが泥沼化します。
だからこそ、「VBAで直接コストをねじ込む」というアプローチが必要になるのです。ただし、ここにはProject特有の「罠」が潜んでいます。

—

2. 自動計算の罠:そのまま書き込んでも上書きされる恐怖

ここで、Project VBAにおける最大の「落とし穴」をシェアしておきます。

初心者がやりがちなのが、これです。

‘ 【やってはいけない例】
Dim assn As Assignment
Set assn = ActiveProject.Assignments(1)
assn.Cost = 500000 ‘ 50万円に設定したい!

このコードを実行して安心していませんか?
実は、プロジェクトのスケジュールを再計算させたり、リソースの残業時間をいじったりした瞬間、Projectの自動計算エンジンが「おや、計算が合わないな」と勝手に `assn.Cost` を元の数値に書き換えてしまうのです。

解決の鍵:コストの「固定(Fixed Cost / Fixed Work)」概念

Projectに「これ以上、勝手にコストを再計算するな!」と命令するには、タスクや割り当てのプロパティを適切にコントロールする必要があります。

—

3. 実践!安全に `Assignment.Cost` を制御するコード設計

ここからは、実務でそのまま使える堅牢なVBAコードを見ていきましょう。
「特定のタスクに割り当てられた特定のリソースのコストを、自動計算の干渉を受けずに強制的に書き換える」ための手順です。

Sub ForceUpdateAssignmentCost()
Dim tsk As Task
Dim assn As Assignment
Dim targetResourceName As String
Dim targetCost As Double

targetResourceName = “外部コンサルA”
targetCost = 750000 ‘ 設定したい予算コスト(75万円)

On Error GoTo ErrorHandler

‘ アクティブプロジェクトの全タスクを走査
For Each tsk in ActiveProject.Tasks
‘ タスクが有効(Nullでない)かつサマリータスクではない場合
If Not tsk Is Nothing Then
If Not tsk.Summary Then

‘ タスクに紐づく割り当て(Assignment)をループ
For Each assn In tsk.Assignments
If Not assn.Resource Is Nothing Then
If assn.Resource.Name = targetResourceName Then

‘ 1. 【最重要】コストの手動上書きモードを有効にする
‘ Projectの自動計算による上書きを防ぐため、コスト計算を固定化します
‘ ※環境やバージョンによりアプローチが異なりますが、
‘  WorkやCostの変動を防ぐためにCostRateTableなどを利用する手法もあります。

‘ ここでは直接Costプロパティに代入
assn.Cost = targetCost

‘ デバッグ用出力
Debug.Print “更新完了: ” & tsk.Name & ” / ” & assn.Resource.Name & ” = ” & assn.Cost

End If
End If
5 Next assn

End If
End If
Next tsk

‘ 変更をプロジェクト全体に反映させるための再計算
Calculate

MsgBox “コストの強制上書きが正常に完了しました。”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub

コードの解説とエンジニアの知見

1. `Not tsk.Summary` のガード
Projectには「サマリータスク(親タスク)」が存在します。親タスクの `Assignment` を直接いじろうとすると、ランタイムエラーになるか、予期せぬデータ破損を引き起こします。実務では必ず子タスク(リーフタスク)に限定して処理を回すのが鉄則です。
2. `Calculate` メソッドのタイミング
数値を書き換えた直後に `Calculate` を呼ぶことで、Projectのメモリ上のキャッシュと画面表示を強制的に同期させます。これを怠ると、画面上の表示が古いままになり、ユーザーを混乱させます。

—

4. 陥りやすいエラーと回避のためのチェックリスト

現場でこのマクロを運用し始めると、以下のような壁にぶつかります。先輩からのアドバイスとして受け取ってください。

  • エラー:「このプロパティは読み取り専用です、または設定できません」
  • 原因: リソースプールや共有プロジェクトを開いている際、リソースがロックされているか、サマリータスクの割り当てを操作しようとしています。
  • 対策: 操作対象が「通常のタスクに紐づく個別の割り当て(Assignment)」であることを `Debug.Print` 等で事前に確認してください。
  • 現象:マクロを実行した直後は数値が変わるのに、F9キー(再計算)を押すと元に戻る
  • 原因: Projectの「コスト計算方法(Cost accrual)」や「リソースの単率」が自動計算を優先しているためです。
  • 対策: コストを直接書き換えた後、タスク側の制約や工数(Work)の辻褄を合わせる必要があります。どうしても自動計算させたくない場合は、単率(StandardRate)自体を `targetCost / 予定作業時間` に逆算して書き換えるアプローチも検討してください。

—

まとめ:ここをクリアすれば、Project VBAの基本はバッチリです!

今回は `Assignment.Cost` を直接操作する際の、自動計算エンジンの裏側と対策について解説しました。

  • Projectの自動計算は強力だが、時には邪魔になる。
  • VBAで直接書き換える際は、サマリータスクを避け、適切なタイミングで `Calculate` を実行する。
  • 値が勝手に巻き戻される場合は、背後の単率や作業時間の関係性を見直す。

この仕組みさえ理解できれば、単なる「マクロの記録の貼り付け」ではなく、「Projectの頭脳をVBAでコントロールする」というワンランク上の自動化エンジニアの領域に到達できます。

ぜひ、あなたのプロジェクト管理の現場で試してみてくださいね。ここをクリアしたあなたなら、もうProject VBAで怖いものはありませんよ!

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