【入門編】Resource.Groupを活用したリソース階層管理の自動化 – Project VBA解析バイブル

スポンサーリンク

こんにちは、プロジェクト管理の自動化という迷宮へようこそ。私は長年、Microsoft Project(以下、MS Project)という気高くも気難しいツールと向き合ってきたチーフアーキテクトです。

「マクロの記録」を卒業し、自分の手でコードを書き始めようとしている君へ。今日は、MS Project VBAの真髄の一つである「リソース管理の自動化」、特に`Resource.Group`プロパティを駆使した階層管理とレポート生成の世界へ招待しましょう。

「誰が、どのチームに属し、いくらコストをかけて、どれくらい働いているのか」。これを手動で更新するのは苦行ですが、VBAを味方につければ、一瞬で「生きたデータ」に変わります。

準備はいいですか?ここをクリアすれば、Project VBAの基本はバッチリですよ。

—

1. なぜ「Group」プロパティが重要なのか?

MS Projectのリソースには多くの属性がありますが、`Resource.Group`(グループ)は非常に強力です。なぜなら、このプロパティは単なるラベルではなく、「プロジェクトを組織の視点で切り出すためのフィルター」になるからです。

  • 部署ごとの予算消化率を知りたい。
  • チームごとの稼働率の偏りを是正したい。
  • 社外パートナーだけのコストを抽出したい。

これらをすべて手作業で行うのは非効率の極み。VBAで`Group`を制御することは、プロジェクトの「家計簿」と「シフト表」を自動生成する司令塔になることを意味します。

—

2. 実践:リソースの一括登録とグループ化

まずは、バラバラに登録されているリソースに「部署名」という魂を吹き込み、整理整頓するコードを見てみましょう。

コード例:チーム割り当ての自動化

Sub OrganizeResourceGroups()
Dim rs As Resource
Dim teamName As String

‘ プロジェクト内の全リソースをループで精査します
For Each rs In ActiveProject.Resources
‘ リソース名が空でないことを確認(MS Projectの作法です)
If Not rs Is Nothing Then

‘ 名前によってグループを自動判定するロジック(例)
‘ 実際の実装では、外部Excelなどから読み込むのがスマートです
Select Case True
Case rs.Name Like “開発”
teamName = “エンジニアリング部”
Case rs.Name Like “デザイナ”
teamName = “クリエイティブ部”
Case Else
teamName = “その他・外部協力”
End Select

‘ ここがポイント:Groupプロパティに値を代入
rs.Group = teamName

‘ デバッグ用にイミディエイトウィンドウに出力
Debug.Print “Resource: ” & rs.Name & ” -> Assigned to: ” & rs.Group
End If
Next rs

MsgBox “リソースの階層化が完了しました。ビューの『グループ化』で確認してください。”, vbInformation
End Sub

【プロの視点】ここが大切!

MS Projectのオブジェクトモデルにおいて、`Resources`コレクションを回す際は必ず`If Not rs Is Nothing`を意識してください。また、MS Projectには「リソースID 0」という、プロジェクト全体を指す特殊なリソースが存在する場合があります。これに触れてエラーを出さないよう、条件分岐で守るのが「壊れないコード」への第一歩です。

—

3. 応用:グループ別コスト・稼働率の自動集計

次に、グループ化したリソースを使って、簡単なレポートを生成してみましょう。
「今のプロジェクト、エンジニア部門にいくらコストがかかっている?」という問いに即答できるコードです。

コード例:グループ別コスト集計レポート

Sub GenerateGroupCostReport()
Dim rs As Resource
Dim groupCosts As Object
Set groupCosts = CreateObject(“Scripting.Dictionary”)

Dim gName As String
Dim currentCost As Double

‘ 1. データを辞書オブジェクト(Dictionary)に集計
For Each rs In ActiveProject.Resources
If Not rs Is Nothing Then
gName = rs.Group
‘ グループ名が空の場合は「未定義」とする
If gName = “” Then gName = “未定義”

‘ 既存のコストを取得して加算
If groupCosts.Exists(gName) Then
groupCosts(gName) = groupCosts(gName) + rs.Cost
Else
groupCosts.Add gName, rs.Cost
End If
End If
Next rs

‘ 2. 集計結果を表示(あるいはExcelへ出力)
Dim report As String
Dim k As Variant
report = “— グループ別コスト集計結果 —” & vbCrLf

For Each k In groupCosts.Keys
‘ FormatCurrencyで通貨形式に整えるのが優しさです
report = report & k & ” : ” & FormatCurrency(groupCosts(k)) & vbCrLf
Next k

MsgBox report, vbInformation, “コスト分析レポート”

‘ オブジェクトの解放(ライフサイクル管理の基本)
Set groupCosts = Nothing
End Sub

【コードの意味を噛み砕く】

  • `Scripting.Dictionary`: データの入れ物です。「グループ名」を鍵にして、そこに「コスト」を足し込んでいく、集計作業のベストパートナーです。
  • `rs.Cost`: これはリソースに割り当てられたタスクの合計コストです。VBAなら、複雑な計算をせずともこのプロパティを叩くだけで「答え」が手に入ります。

—

4. 陥りやすいエラーと回避策

Project VBAに挑む多くの人が躓くポイントを、先輩として共有しておきます。

1. 「リソースが見つからない」エラー

  • 原因:タスクが一つも割り当てられていないリソースや、空白行を読み込もうとしている。
  • 対策:`If Not rs Is Nothing` でチェックを欠かさないこと。

2. コストが 0 になる

  • 原因:リソースの「標準単価」が設定されていない、またはタスクの期間が 0 になっている。
  • ヒント:VBAを疑う前に、Project側の「リソースシート」で単価が入っているか確認しましょう。

3. パフォーマンスの低下

  • 原因:数千のリソースがある場合、画面の更新が重荷になります。
  • 対策:コードの冒頭に `Application.ScreenUpdating = False` を入れ、最後に `True` に戻す魔法を使いましょう。

—

5. 最後に:Project VBAを掌握する君へ

お疲れ様でした。`Resource.Group` を使った自動化の扉が開きましたね。

最初は「ただの文字列の代入」に見えるかもしれません。しかし、これによって数千行のリソースが意味のある「組織」へと姿を変え、ボタン一つで経営層が喜ぶレポートが生成されるようになります。それはもう、単なる作業ではなく、プロジェクトを成功に導くための「アーキテクチャの構築」です。

MS Projectは奥が深いですが、オブジェクトの一つひとつに「なぜこれが存在するのか」を問いかければ、必ず応えてくれます。

次は、このグループ情報を使って「特定のチームだけガントチャートの色を変える」なんて自動化に挑戦してみるのも面白いかもしれませんね。

一歩ずつ、楽しみながらコードを書いていきましょう。君なら、きっとこのツールを完全に掌握できるはずです。応援していますよ!

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