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)に基づいてリソースの残コストを算出する、といった応用にも挑戦してみてください。
コードを書くことは、プロジェクトの時間をコントロールすることです。皆さんの手元で、プロジェクトがより正確に、より美しく動き出すことを願っています。
また次のステップでお会いしましょう!応援していますよ。
