こんにちは、プロジェクト管理の自動化という迷宮へようこそ。私は長年、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は奥が深いですが、オブジェクトの一つひとつに「なぜこれが存在するのか」を問いかければ、必ず応えてくれます。
次は、このグループ情報を使って「特定のチームだけガントチャートの色を変える」なんて自動化に挑戦してみるのも面白いかもしれませんね。
一歩ずつ、楽しみながらコードを書いていきましょう。君なら、きっとこのツールを完全に掌握できるはずです。応援していますよ!
