こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進み、自分の手でプロジェクトを意のままにコントロールしたいあなたへ。
今回は、プロジェクトマネジメントの現場で絶対に避けて通れない「リソースの割り当てミス」を自動で検知するバリデーションチェックツールの作り方を解説します。
「タスクの性質とリソースのスキルがミスマッチを起こしている…」
「特定のエンジニアだけに負荷が集中して、オーバーアルロケーション(過剰割り当て)になっている…」
こうした現場の爆弾を、VBAの力で事前にすべて暴き出し、美しくリスト化する監査用マクロを一緒に作っていきましょう。
ここをクリアすれば、Project VBAの本質と実用的なロジックの組み立て方がグッと身につきますよ。それでは、優しく丁寧に解説していきますね!
—
1. なぜリソースのバリデーションチェックが必要なのか?
Excel管理からMS Projectへ移行した多くのチームが直面する壁。それは「リソース管理のブラックボックス化」です。
タスクが増え、人が増えるほど、人間の目によるチェックは機能しなくなります。
- スキルミスマッチ: インフラ構築のタスクに、フロントエンド専門のメンバーが割り当てられている。
- 過剰割り当て(オーバーアロケーション): 1日の稼働上限(通常8時間)を超えてタスクが詰め込まれている。
これらを放置すると、プロジェクトは確実に炎上します。だからこそ、「定期的かつ機械的にプロジェクトの健康状態を監査する仕組み」をVBAで構築するのです。
—
2. Project VBAの基本と「リソース・アサインメント」の構造
まずは、MS Projectのオブジェクトモデルにおける「リソース」と「割り当て(Assignment)」の関係を頭に叩き込みましょう。
MS ProjectのVBAでは、以下のような階層構造になっています。
Project (プロジェクト全体)
├── Tasks (タスク群)
│ └── Task (個々のタスク)
│ └── Assignments (そのタスクに割り当てられたリソースのリスト)
└── Resources (リソース群)
└── Resource (個々のリソース:人や機材)
特定のタスクに誰が割り当てられているかを調べるには、`Task.Assignments` というコレクションを巡回(ループ)する必要があります。ここがVBAコードを書く上での最重要ポイントです。
—
3. 実装コード:リソース監査ツール
それでは、実際に動くコードを見ていきましょう。
このマクロは、プロジェクト内のすべてのタスクと割り当てをスキャンし、以下の2点をチェックしてイミディエイトウィンドウ(または別シート)にレポートを出力します。
1. 過剰割り当ての検知: 割り当てられたリソースのピーク units が 100%(または指定値)を超えているか。
2. スキルミスマッチの検知: タスク名に特定のキーワード(例:「インフラ」「DB」など)が含まれているのに、該当するスキルを持たないリソースがアサインされていないか。
以下のコードを、ProjectのVBE(Visual Basic Editor)の標準モジュールに貼り付けてください。
‘ ==============================================================================
‘ ツール名: リソース割り当て・監査バリデーションマクロ
‘ 概要: スキルミスマッチと過剰割り当てを自動検知し、ログに出力します。
‘ ==============================================================================
Sub AuditResourceAssignments()
Dim t As Task
Dim assn As Assignment
Dim errCount As Long
errCount = 0
‘ ヘッダーの出力
Debug.Print “==================================================”
Debug.Print ” リソース監査レポート開始: ” & Now
Debug.Print “==================================================”
‘ プロジェクト内のすべてのタスクをループ
For Each t In ActiveProject.Tasks
‘ サマリータスク(親タスク)や削除済みタスクはスキップ
If Not t Is Nothing Then
If Not t.Summary And t.Active Then
‘ 1. タスクに割り当てられているリソース(Assignments)をチェック
For Each assn In t.Assignments
If Not assn.Resource Is Nothing Then
‘ — チェック①:過剰割り当て(オーバーアロケーション)の検知 —
‘ Units(unitsOfWork / 割り当て割合)が 100% を超えている場合
If assn.Units > 1# Then
Debug.Print “[過剰割り当て] タスクID: ” & t.ID & ” | タスク名: ” & t.Name & _
” | 担当者: ” & assn.Resource.Name & _
” | 割り当て率: ” & (assn.Units 100) & “%”
errCount = errCount + 1
End If
‘ — チェック②:簡易スキルミスマッチの検知 —
‘ 例:「インフラ」という名前のタスクに、”Frontend”という名前のリソースがアサインされている場合
If InStr(1, t.Name, “インフラ”, vbTextCompare) > 0 Then
If InStr(1, assn.Resource.Name, “フロント”, vbTextCompare) > 0 Then
Debug.Print “[スキル不一致] タスクID: ” & t.ID & ” | タスク名: ” & t.Name & _
” | 不適切な担当者: ” & assn.Resource.Name
errCount = errCount + 1
End If
End If
End If
Next assn
End If
End If
Next t
‘ フッターの出力
Debug.Print “==================================================”
Debug.Print ” 監査終了。検出された問題数: ” & errCount & ” 件”
Debug.Print “==================================================”
If errCount > 0 {
MsgBox “監査完了しました。VBEのイミディエイトウィンドウを確認してください。” & vbCrLf & _
“合計 ” & errCount & ” 件の問題が検出されました。”, vbExclamation, “リソース監査ツール”
} else {
MsgBox “素晴らしい!リソースの割り当てに問題は検出されませんでした。”, vbInformation, “リソース監査ツール”
End If
End Sub
—
4. コードの深掘り解説(ここが分かれば怖くない!)
初心者の方がつまずきやすいポイントを、エンジニアの視点で優しく解説します。
① `For Each t In ActiveProject.Tasks`
プロジェクト内にあるすべてのタスクを上から順に舐めていく、VBAの基本にして最強の構文です。Excel VBAでいう `For Each cell In Range(…)` と同じ感覚で使えます。
② `If Not t Is Nothing` のお約束
MS Projectのタスクやリソースは、途中で削除されたり空行が存在することがあります。そのため、`t Is Nothing`(オブジェクトが存在するかどうか)の安全確認を挟まないると、「オブジェクト変数が設定されていません」というエラー(実行エラー 91)の餌食になります。このガード節は必ずセットで覚えましょう。
③ `assn.Units > 1#` の意味
MS Projectにおいて、リソースのフル稼働(100%)は数値の `1#`(または `1.0`)で表現されます。したがって、`1.1` なら110%の過剰割り当てを意味します。ここを知っているだけで、リソースコスト管理の精度が段違いに上がります。
—
5. 初学者が陥りやすい罠とエラー回避の極意
Project VBAを書くときに、多くの人が最初にハマる罠がこれです。
- 罠:「あれ? リソースの名前が取得できない…」
- 原因: `Task.ResourceNames` プロパティを使って文字列として処理しようとすると、複数のリソースがアサインされている場合にカンマ区切りになり、判定が非常に難しくなります。
- 対策: 今回のコードのように、必ず `Task.Assignments` コレクションを経由して、1つひとつの `Assignment` オブジェクトから `Resource` を取得するようにしましょう。これがオブジェクト指向的にも最も堅牢なアプローチです。
—
まとめ:ここをクリアすれば、Project VBAの基本はバッチリです!
お疲れ様でした!今回はリソースの割り当てミスを検知するバリデーションツールの設計とコードを解説しました。
- プロジェクト全体のタスクをループする方法
- タスクとリソースを繋ぐ `Assignments` の概念
- オブジェクトの存在チェック(`Is Nothing`)の重要性
これらを理解できたあなたは、もう単なる「マクロの記録ユーザー」ではありません。立派なProject VBAエンジニアです。
現場の品質を守るこの監査ツールをベースに、自社のルールに合わせたキーワード検索条件を追加したり、結果をExcelに出力させたりと、ぜひ自分なりにカスタマイズしてみてください。
あなたのプロジェクト管理が、もっとスマートで快適になりますように。それでは、次のステップでお会いしましょう!
