Project VBAの深淵へ:リソースの「コストセンター」を一括制御し、予算管理をマスターする
こんにちは。現場の最前線でVBAと格闘し続けている皆さんに、今日は少しだけ「深い」話をしましょう。
Project VBA(Microsoft Projectの自動化)は、単なる作業の効率化ツールではありません。プロジェクトという「生き物」のデータを制御し、経営の意思決定を左右する心臓部です。今回は、多くのプロジェクトマネージャーが頭を抱える「リソースのコストセンター管理」を、VBAで一瞬にして終わらせる極意を伝授します。
「マクロの記録」から一歩踏み出し、プロジェクトのコストを自在に操るエンジニアへの第一歩です。
—
1. なぜ「カスタムフィールド」なのか?
Microsoft Projectには、標準で用意されているフィールド(名前や単価など)以外に、「ユーザー設定フィールド」が存在します。
なぜコストセンターをここに流し込むのか? それは、プロジェクトの収支を部門別に見たいという現場の切実なニーズに応えるためです。これを手作業で100人分入力するのは苦行ですよね。VBAを使えば、Excel上のマスターデータから数秒で全リソースに同期させることができます。
—
2. リソース管理の核となる「Resourceオブジェクト」
Project VBAにおけるリソース操作の基本は、`ActiveProject.Resources` コレクションを制御することです。
【今回使用するコード:リソースコストセンター一括設定】
以下のコードは、アクティブなプロジェクト内のリソースを走査し、指定した名前のリソースに対して、コストセンター情報をカスタムフィールド(今回は「テキスト1」を使用)に書き込むものです。
Sub BatchSetCostCenter()
‘ 変数の宣言
Dim res As Resource
Dim costCenter As String
‘ 設定したいコストセンターの定義
costCenter = “開発一部-001”
‘ エラーハンドリング:プロジェクトが開かれているか確認
On Error Resume Next
‘ 全リソースをループして回す(ここが効率化の鍵!)
For Each res In ActiveProject.Resources
‘ リソースが空(ダミー)でないか確認
If Not res Is Nothing Then
‘ 特定の条件で絞り込む(例:特定の部署や名前など)
‘ ここでは「テスト」という名前が含まれるリソースに設定する例
If InStr(res.Name, “テスト”) > 0 Then
‘ リソースの「テキスト1」フィールドにコストセンターを書き込み
res.Text1 = costCenter
‘ 成功したことをイミディエイトウィンドウに表示
Debug.Print “設定完了: ” & res.Name & ” -> ” & costCenter
End If
End If
Next res
MsgBox “リソースのコストセンター設定が完了しました!”, vbInformation
End Sub
—
3. このコードを理解するための「3つのポイント」
初学者の皆さんが躓きやすいポイントを整理しました。ここさえ押さえれば、他のフィールド操作も応用が効きます。
- `For Each res In ActiveProject.Resources` の魔力
- これは「リソース全員に一人ずつ声をかける」イメージです。Project内には「空のリソース」が存在する場合があるため、`If Not res Is Nothing` という安全装置を入れるのが、現場で生き残るエンジニアの作法です。
- `Text1` って何?
- Projectのカスタムフィールドは `Text1` 〜 `Text30` まで用意されています。GUI上で「テキスト1」と名前を変えていても、プログラムからは `Text1` と呼び出す必要があります。ここが混乱の元ですが、慣れれば簡単です。
- `On Error Resume Next` の正しい使い方
- 処理を止めないための魔法の言葉ですが、使いすぎるとエラー原因が分からなくなります。開発中はコメントアウトしてデバッグし、配布時に有効にするのがベストです。
—
4. 陥りやすいエラーと対策
1. 「オブジェクト変数または With ブロック変数が設定されていません」
- 原因:プロジェクトが開かれていない、あるいはリソースが一件も登録されていない状態で実行していませんか?
- 対策:`If ActiveProject Is Nothing Then Exit Sub` をコードの冒頭に入れましょう。
2. フィールド名が反映されない
- 原因:表示上の名前を変えても、内部名は変わりません。
- 対策:Projectの「ツール」>「ユーザー設定フィールド」で、内部名(Text1など)と表示名の対応を必ず確認してください。
—
5. 先輩エンジニアからのアドバイス
VBAの最大のメリットは「再現性」です。一度このスクリプトを組んでしまえば、どんなに大規模なプロジェクトでも、リソースの入れ替わりが激しい現場でも、コスト管理は「ワンクリック」で完了します。
最初は難しく感じるかもしれませんが、この「リソースのプロパティを書き換える」という操作ができるようになれば、あなたはもうProject VBAの初級者ではありません。次は、ExcelからCSVを読み込んで一括割り当てをする……といった、より実用的な自動化に挑戦してみてください。
「自動化」とは、単に楽をすることではなく、あなたが本来注力すべき「プロジェクトの価値向上」に時間を割くための投資です。
さあ、今日からコードを書いて、自分だけの管理ツールを育てていきましょう。応援しています!
