【実務・中級編】Resourceの「標準単価」をVBAで更新し、プロジェクト全体の予算を再計算する – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵へ:リソース単価一括更新による「動的予算シミュレーション」の構築

こんにちは。プロジェクト管理における自動化の最前線に立つ諸君。

多くの現場で、Project VBAは「マクロ記録ができない」という一点で敬遠されがちだ。しかし、それは大きな誤解だ。Projectのオブジェクトモデルを掌握すれば、Excelの行操作とは比較にならないほどの高精度なデータ構造を制御できる。

今回は、最も実務的かつ破壊的なリソース管理手法である「標準単価の一括更新と予算再計算」をテーマに据える。単なる値の書き換えではなく、「Projectの再計算サイクルを制御し、整合性を担保する」という、プロフェッショナルが守るべき鉄則を伝授する。

1. 破壊的なバグを避けるための「オブジェクトライフサイクル」の理解

Projectにおける`Resource`オブジェクトは、単なるデータの塊ではない。`Task`、`Assignment`と密接にリンクしており、単価を変更した瞬間に、プロジェクト全体の「コスト(Cost)」が再計算(再計算キューが発火)される。

ここで初心者が陥る罠は、「ループの中で頻繁に再計算を強制すること」だ。
Projectの計算エンジンは強力だが、大規模プロジェクトでループごとに再計算を走らせれば、ツールはフリーズする。

極限の設計指針

  • 計算の先延ばし: 更新中は再計算を抑制し、処理の最後で一度だけコミットする。
  • キャッシュの利用: 外部DBやCSVから単価を読み込む際は、一度メモリ上のコレクションに格納してから更新せよ。ファイルI/Oをループ内に含めるのは自殺行為だ。

2. 実装コード:堅牢なリソース単価更新ロジック

以下は、保守性を重視し、エラーハンドリングを組み込んだプロダクションレベルのコードだ。これをベースに、貴殿の環境に合わせて拡張してほしい。

Option Explicit

‘ ———————————————————
‘ リソース標準単価を更新し、プロジェクトコストを再計算する
‘ ———————————————————
Public Sub UpdateResourceStandardRate(ByVal csvFilePath As String)
Dim proj As Project
Dim res As Resource
Dim dict As Object ‘ 外部データ保持用辞書

Set proj = ActiveProject
Set dict = LoadRateDataFromCSV(csvFilePath) ‘ 外部データ読み込み

‘ プロジェクトの再計算を一時停止(パフォーマンス最適化)
Application.Calculation = pjManual

On Error GoTo ErrorHandler

For Each res In proj.Resources
If Not res Is Nothing Then
‘ 辞書に存在するリソースID/名称と一致する場合のみ更新
If dict.Exists(res.Name) Then
res.StandardRate = dict(res.Name)
End If
End If
Next res

‘ 再計算の実行
Application.Calculation = pjAutomatic
MsgBox “全リソースの単価更新が完了しました。”, vbInformation

Exit Sub

ErrorHandler:
Application.Calculation = pjAutomatic
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub

‘ 外部ファイル(CSV等)から単価をDictionaryにロードする関数
Private Function LoadRateDataFromCSV(ByVal path As String) As Object
Dim dict As Object
Set dict = CreateObject(“Scripting.Dictionary”)
‘ ここにファイルI/Oのロジックを実装
‘ 例: dict.Add “山田太郎”, 5000
Set LoadRateDataFromCSV = dict
End Function

3. なぜこの設計なのか?(アーキテクトの視点)

① `pjManual` への切り替えの必然性

`Application.Calculation` を `pjManual` に設定することで、更新中のコスト再計算トリガーを無効化している。数千行のタスクがあるプロジェクトでは、この一手で処理速度が数十倍に跳ね上がる。

② `Dictionary` を挟む設計思想

なぜCSVを直接読まないのか。それは「疎結合」を実現するためだ。
将来的に単価マスターがCSVからSQL ServerやAPI経由のデータに変わったとしても、`LoadRateDataFromCSV` 関数の中身を差し替えるだけで済む。メインのロジックを汚さないことが、長期間運用されるツールの条件だ。

③ エラーハンドリングの徹底

「正常系」だけを書くのはエンジニアではない。何らかの理由で処理が中断した際に、再計算モードが `pjManual` のまま放置されるのは最悪のケースだ。必ず `ErrorHandler` 内で再計算を戻す(または終了時に戻す)設計にせよ。

4. 現場のリーダーたちへ

Excelで管理された数千行の工数表を、手作業でProjectに転記する時代は終わった。
今回伝授した「単価更新ツール」は、単なる自動化ツールではない。経営層が「来期の予算はどうなる?」と問うた瞬間に、即座にシミュレーション結果を提示できる「意思決定支援エンジン」の核となるものだ。

君たちが書くコードは、単なるVBAではなく、組織を動かすための知性であるべきだ。
この設計図を手に、より強固で美しい自動化基盤を構築してほしい。

次のステージで待っている。

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