【入門編】リソースの「コストレートテーブル」を複数切り替えるための自動設定マクロ – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけの日常から一歩抜け出し、「本物の自動化エンジニア」としての扉を開いたあなたを心から歓迎します。

現場でプロジェクトマネジメントをしていると、こんな悩みに直面しませんか?

  • 「基本設計フェーズと開発フェーズで、同じエンジニアの単価(コストレート)が変わるんだけど、手動で変更するのが面倒すぎる…」
  • 「フェーズが変わるたびに、何十人ものリソース単価をExcelと睨めっこしながら打ち替えている…」

Microsoft Projectには、リソースごとに最大5つの単価テーブル(レートテーブル:A, B, C, D, E)を持たせる強力な機能があります。しかし、これをGUIでポチポチ切り替えるのは、大規模プロジェクトになればなるほど悪夢のような作業です。

今回は、この「コストレートテーブルの切り替え」をVBAで一瞬にして自動化する極意を伝授します。ここをクリアすれば、Project VBAのオブジェクト構造の基本はバッチリですよ!一緒に優しく紐解いていきましょう。

—

1. そもそも「レートテーブル」って何?なぜVBAでやるの?

Microsoft Projectのリソースには、時間あたりのコスト(単価)を複数設定できます。

  • レートテーブル A:通常の標準単価
  • レートテーブル B:外部パートナー用、あるいは特定フェーズ(例:実装・テストフェーズ)の特別単価
  • レートテーブル C:保守フェーズの単価 など

プロジェクトの進捗や契約形態の変更に伴い、このテーブルを「AからBへ」一斉に切り替えることで、コスト計算の精度を保つことができます。これを手動でやるとヒューマンエラーの元になりますが、VBAなら一撃です。

—

2. Project VBAの基本構造を理解しよう

Excel VBAと違い、Project VBAには独特の「階層構造(オブジェクトモデル)」があります。今回操作するのは以下のルートです。

Application (Project全体)
└── ActiveProject (現在開いているプロジェクト)
└── Resources (リソースの集合体)
└── Resource (個々のリソース)
└── CostRateTable (コストレートテーブルの指定)
※ここで “A”, “B”, “C” などを指定します!

Excelでいう `Cells(row, col)` のような感覚で、`ActiveProject.Resources` から一人ひとりのリソースにアクセスし、そのプロパティを書き換えていきます。

—

3. 【実践】コストレートテーブル一括切替マクロ

それでは、現場でそのままコピペして使える実用コードを公開します。
このマクロは、プロジェクト内の全リソースのコストレートテーブルを、指定したテーブル(”A”, “B”, “C”など)に一括で切り替えるものです。

Sub SwitchAllResourceCostRateTable()
‘ =====================================================================
‘ 目的:プロジェクト内の全リソースのコストレートテーブルを一括切り替えする
‘ 対象:すべてのリソース(通常、コスト、材料リソースは除外する安全設計)
‘ =====================================================================

Dim r As Resource
Dim targetTable As String
Dim targetIndex As Integer
Dim countChanged As Long

‘ 1. ユーザーにどのテーブルに変更するか入力させる
targetTable = UCase(Application.InputBox( _
Prompt:=”切り替え先のコストレートテーブルを入力してください (A, B, C, D, E のいずれか)”, _
Title:=”コストレートテーブル一括変更”, _
Default:=”B”, _
Type:=2))
ネ
‘ キャンセルされた場合や空欄の場合は処理を中断
If targetTable = “FALSE” Or targetTable = “” Then Exit Sub

‘ 入力された文字が有効かチェック
Select Case targetTable
Case “A”: targetIndex = pjRateTableA
Case “B”: targetIndex = pjRateTableB
Case “C”: targetIndex = pjRateTableC
Case “D”: targetIndex = pjRateTableD
Case “E”: targetIndex = pjRateTableE
Case Else
MsgBox “無効なテーブルが指定されました。「A」~「E」の半角文字で入力してください。”, vbCritical, “エラー”
Exit Sub
End Select

countChanged = 0

‘ 2. プロジェクト内の全リソースをループ処理
For Each r In ActiveProject.Resources
‘ リソースが「存在する(空行ではない)」かつ「仕事・材料リソースである」場合のみ処理
If Not r Is Nothing Then
If r.Type = pjResourceTypeWork Or r.Type = pjResourceTypeMaterial Then

‘ 3. コストレートテーブルの割り当てを変更
‘ CostRateTableプロパティにインデックス(pjRateTableA等)を設定します
r.CostRateTable = targetIndex

countChanged = countChanged + 1
End If
End If
Next r

‘ 4. 完了メッセージ
MsgBox “処理が完了しました。” & vbCrLf & _
“対象リソース数: ” & countChanged & ” 名” & vbCrLf & _
“新しいコストレートテーブル: 【 ” & targetTable & ” 】”, vbInformation, “一括変更完了”

End Sub

コードのここがポイント!

  • `Application.InputBox`: 実行時にダイアログを出し、ユーザーに対象のテーブル(A〜E)を選ばせます。
  • `pjRateTableA` などの定数: Project VBAには、テーブルを指定するための専用の「定数(定まった数値)」が用意されています。これを使うことでバグを防げます。
  • 安全フィルター (`r.Type`): コストが発生しない「コストリソース」や、名前だけの空行を誤って書き換えないよう、人(仕事)と材料のリソースだけに絞って処理しています。この配慮が「プロのエンジニア」の証です。

—

4. 初学者が陥りやすい罠とエラー回避の知見

Project VBAを書き始めると、多くの人が次のような壁にぶつかります。ここを知っておくだけで、開発スピードが何倍も変わります。

① 「実行時エラー ‘1100’:その名前のリソースはありません」系エラー

リソースが1人も登録されていない状態でこのマクロを走らせると、`For Each r In ActiveProject.Resources` でつまずくことがあります。
現場のコードでは、必ず `If ActiveProject.Resources.Count > 0 Then` のような事前チェックを入れるのが、堅牢なシステムを作る極意です。

② 「変更がスケジュールやコストに反映されない?」

VBAで `r.CostRateTable = pjRateTableB` に切り替えても、すでに割り当てられているタスクのコストが即座に再計算されない場合があります。そんなときは、コードの最後に `CalculateProject` メソッドを挟むことで、プロジェクト全体のコストとスケジュールを強制再計算させることができます。

‘ 変更の直後に全体を再計算させる場合
CalculateProject

—

5. おわりに:ここから広がる自動化の世界

お疲れ様でした!この「リソースのプロパティをループで書き換える」という技術をマスターすれば、単価だけでなく、最大稼働率(MaxUnits)の一括調整や、特定のカスタムフィールドへの自動値流し込みなど、あらゆるリソース管理を自動化できるようになります。

「マクロの記録」というトレーニングホイール(補助輪)を外し、自分の手でオブジェクトを操る感覚は掴めましたか?
あなたのプロジェクト管理業務が、このコードによって劇的にスマートになることを心から応援しています。

それでは、次の極限の知見でお会いしましょう!

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