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

スポンサーリンク

Project VBAを掌握せよ:リソース単価を一括更新し、プロジェクトの「呼吸」を可視化する

こんにちは。現場の最前線でVBAと格闘してきた皆さんに、今日は少しだけ「一段上の景色」をお見せしましょう。

多くの人が「マクロの記録」から入りますが、Microsoft Projectの世界では、記録機能は残念ながらほとんど役に立ちません。Project VBAをマスターするには、「プロジェクトという巨大な有機体を、オブジェクトの階層構造として捉える」という、エンジニアとしての視座が必要になります。

今回は、財務管理の要である「リソース標準単価の更新」をテーマに、Project VBAの核心に触れていきます。ここをクリアすれば、あなたはもう「コードを書かされる人」から「プロジェクトを制御する設計者」へ進化できますよ。

1. 階層の理解:Projectオブジェクトモデルの「地図」

VBAでProjectを操作する際、まず頭に入れておくべきなのがこの階層構造です。

  • Application: プロジェクト全体を統括する親(ExcelでいうExcel本体)
  • Project: 開いているプロジェクトファイルそのもの
  • Resource: リソース(人や設備)の集まり
  • Task: リソースが割り当てられる作業の最小単位

私たちがやりたいのは、「Resource」の単価を書き換え、その結果として「Project」全体のコストを再計算させることです。単純な値の代入に見えますが、「値を変更した直後に計算ロジックを走らせる」という手順が、実務上の肝になります。

2. 実践コード:標準単価の一括更新エンジン

以下のコードは、全リソースの単価を一律で10%アップさせ、計算を強制的に反映させるための実用的なスクリプトです。

Sub UpdateResourceStandardRate()
‘ 変数の宣言:メモリ効率を意識して型を明示的に指定します
Dim proj As Project
Dim res As Resource
Dim rateIncrease As Double

‘ 1.1 = 10%アップの意味
rateIncrease = 1.1

‘ 現在アクティブなプロジェクトを操作対象として取得
Set proj = ActiveProject

‘ エラー回避:リソースが一人もいない場合を考慮
If proj.Resources.Count = 0 Then
MsgBox “リソースが登録されていません。”, vbExclamation
Exit Sub
End If

‘ オブジェクトのループ処理:For Eachが最も安全で高速です
For Each res In proj.Resources
‘ リソースが「作業リソース」であるかを確認(コストリソース等は除外)
If res.Type = pjResourceTypeWork Then
‘ 標準単価(StandardRate)を更新
res.StandardRate = res.StandardRate rateIncrease
End If
Next res

‘ ここが重要!計算の再実行
‘ プロジェクトのコスト計算を強制的にトリガーします
Application.CalculateAll

MsgBox “全リソースの単価更新が完了しました。予算を再計算しました。”, vbInformation
End Sub

3. なぜ「Application.CalculateAll」が必要なのか?

初学者が最もハマる罠が、「値を書き換えたのに、画面上のコストが変わらない」という現象です。

Projectは、パフォーマンスのために「都度の再計算」を裏側で保留することがあります。VBAでプロパティを更新した直後は、Excelでいう「再計算待ち」の状態になることが多いのです。ここで明示的に `Application.CalculateAll` を呼び出すことで、プロジェクトのエンジンに「今すぐコストを再集計せよ」と命じることができます。この「呼応関係」を理解しているかどうかで、プロのエンジニアかどうかが分かれます。

4. 陥りやすいエラーと対処法(現場の知恵)

1. 型不一致エラー:
`StandardRate` は通貨型ですが、計算時に数値として扱われます。もしリソースの種類が「コストリソース」だった場合、`StandardRate` を持たないためエラーになります。必ず `If res.Type = pjResourceTypeWork` でガードをかけましょう。

2. 読み取り専用の罠:
プロジェクトが「共有ファイル」として保存されており、他の誰かが開いている場合、VBAでの書き込みが拒否されることがあります。実行前に `proj.ReadOnly` をチェックする習慣を持つと、現場でのトラブルが激減します。

3. 無制限のループ:
大規模プロジェクトではリソースが数千人になることもあります。ループ処理中に `DoEvents` を挟むことで、処理中のフリーズを防ぎ、Windows OSに制御を戻す余裕を与えるのが、優しいエンジニアのコードです。

まとめ:ここをクリアすれば、もう怖くない

リソース単価の更新は、財務管理の第一歩に過ぎません。しかし、この「オブジェクトを特定し、属性を書き換え、計算エンジンを回す」という一連の流れは、Project VBAにおけるあらゆる自動化のテンプレートとなります。

次は、タスクの進捗率(% Complete)に基づいてリソースの残コストを算出する、といった応用にも挑戦してみてください。

コードを書くことは、プロジェクトの時間をコントロールすることです。皆さんの手元で、プロジェクトがより正確に、より美しく動き出すことを願っています。

また次のステップでお会いしましょう!応援していますよ。

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