【入門編】リソースの「残業」を自動検知してコスト警告を出すマクロ – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で、日夜リソースの調整やスケジュールに頭を悩ませていませんか?

「マクロの記録は使ったことがあるけれど、VBAのコードを自分で書くとなると途端に手が止まってしまう……」
「Excelなら何となく分かるけれど、Microsoft Project(MSP)のオブジェクト構造は難解そう……」

そんな壁にぶぶかっているあなたへ。今日は、現場で即戦力となる「リソースの残業自動検知&コスト警告ツール」を一緒に作っていきましょう。

ここをしっかりとクリアすれば、Project VBAの基本と「リソース管理の本質」はバッチリです。背伸びをする必要はありません。優しい先輩エンジニアが、一つひとつ噛み砕いて案内しますね。

—

1. なぜ「残業の自動検知」をVBAでやるのか?

プロジェクトが炎上する兆候の多くは、「特定のリソースへの負荷集中(オーバーアロケーション)」と「知らぬ間に膨らむ残業コスト」にあります。

標準機能でもリソースグラフなどで確認できますが、大規模なプロジェクトになると、何十人ものメンバーの稼働状況を毎日目視でチェックするのは至難の業です。
だからこそ、「規定の労働時間を超えた瞬間に、VBAが自動で検知し、超過コストを計算してレポートしてくれる仕組み」を持っておくべきなのです。

Project VBAの心臓部:「Assignment(アサインメント)」を理解しよう

Excel VBAと大きく違うのは、Projectには「タスク」「リソース」「アサインメント(割り当て)」という3つの強力な軸がある点です。

  • タスク(Task): 「何をするか」
  • リソース(Resource): 「誰がやるか」
  • アサインメント(Assignment): 「誰が・どのタスクに・どれだけの時間割り当てられているか」

残業コストを計算するためには、「リソース」単体ではなく、「アサインメント単位の稼働時間」にアクセスする必要があります。ここが今回の最重要ポイントです!

—

2. 実装コード:残業自動検知&コスト警告マクロ

それでは、開発環境(Alt + F11キーでVBAエディタを開き、標準モジュールを追加)に、以下のコードをそのまま貼り付けてみてください。

実務ですぐに使えるよう、丁寧なコメントを入れています。

Sub DetectResourceOvertimeAndCost()
‘ =====================================================================
‘ 目的: リソースの残業(標準稼働時間を超えた工数)を検知し、超過コストを算出する
‘ 対象読者: マクロの記録からステップアップしたいあなたへ
‘ =====================================================================

Dim t As Task
Dim a As Assignment
Dim r As Resource

‘ 1日の標準労働時間(例: 8時間)
Const StandardHoursPerDay As Double = 8#

‘ 警告カウンターとレポート用文字列
Dim warningCount As Long
Dim reportMsg As String
warningCount = 0
reportMsg = “【リソース残業・コスト超過レポート】” & vbCrLf & String(40, “-“) & vbCrLf

‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お作法です)
Application.ScreenUpdating = False

‘ プロジェクト内の全タスクをループ
For Each t in ActiveProject.Tasks
‘ 概要タスク(サマリー)や削除されたタスクは無視する
If Not t Is Nothing Then
If Not t.Summary And t.Active Then

‘ タスクに割り当てられている全てのアサインメントをループ
For Each a In t.Assignments
Set r = a.Resource

‘ リソースが存在し、かつ「通常のリソース(仕事 = Work)」の場合
If Not r Is Nothing Then
If r.Type = pjResourceTypeWork Then

‘ アサインメントの「実働時間(Work)」が標準を超えているか判定
‘ ※ Projectの内部単位は「分」なので、時間に換算するため 評価値 / 60 を行う
Dim actualWorkHours As Double
actualWorkHours = a.Work / 60

‘ 例として、割り当て時間が「8時間(480分)」を超えている場合を検知
If actualWorkHours > StandardHoursPerDay Then
warningCount = warningCount + 1

‘ 超過時間の計算
Dim overHours As Double
overHours = actualWorkHours – StandardHoursPerDay

‘ 超過コストの計算(超過時間 × 標準単価)
‘ r.CostRateTables(1).StandardRate は時間あたりの単価
Dim hourlyRate As Double
hourlyRate = r.StandardRate

Dim overCost As Double
overCost = overHours hourlyRate

‘ レポート文字列の構築
reportMsg = reportMsg & _
“・タスク名: ” & t.Name & vbCrLf & _
“ 担当者: ” & r.Name & vbCrLf & _
“ 予定工数: ” & Format(actualWorkHours, “0.0”) & ” 時間 (超過: ” & Format(overHours, “0.0”) & “h)” & vbCrLf & _
“ 発生追加コスト: ¥” & Format(overCost, “#,

0″) & vbCrLf & _

String(30, “-“) & vbCrLf
End If

End If
End If

Next a

End If
End If
Next t

‘ 画面描画の再開
Application.ScreenUpdating = True

‘ 3. 判定結果の出力
If warningCount > 0 Then
MsgBox reportMsg & vbCrLf & “合計 ” & warningCount & ” 件の残業・コスト超過を検知しました!”, vbExclamation, “コスト警告アラート”
Else
MsgBox “素晴らしい!現在、規定時間を超える過剰なアサインメントはありません。”, vbInformation, “チェック完了”
End If

End Sub

—

コードのここがポイント!初心者がハマりやすい罠

1. 時間の単位は「分(Minutes)」であること

  • Excel感覚で `a.Work` を見ると「8」という数字を期待してしまいますが、Microsoft Projectの内部データでは時間は「分」で保持されています。そのため、`a.Work / 60` とすることで「時間(Hours)」に変換しているのがミソです。ここを知らないと、永遠に計算が合わずに頭を抱えることになります。

2. `Not t Is Nothing` のガード節

  • Projectのタスクコレクションには、途中で行が削除された「空っぽのオブジェクト」が挟まることがあります。これ対策せずに `t.Name` などを呼び出すと、容赦なく「オブジェクト変数が設定されていません」というエラー(実行エラー 91)が発生します。これを防ぐのがガード節の役割です。

—

3. 現場で使えるようにするための「一工夫」

このマクロをそのまま実行するだけでも十分強力ですが、実務ではさらに一歩進めてみましょう。

  • Excelへの出力に拡張する
  • `MsgBox` でポップアップを出すだけでなく、このレポート内容を新しいExcelブックに書き出して保存するように改造すれば、そのまま週報や上長へのエスカレーション資料として使えます。
  • カスタムフィールドへの書き込み
  • 超過コストの金額を、タスクやリソースの「コスト1 (Cost1)」などのカスタムフィールドに自動書き込みし、甘口・辛口のビューで色分け表示させることもVBAなら簡単です。

—

まとめ:Project VBAは怖くない!

今回は、リソースの残業検知とコスト計算という、実務に直結するテーマでコードを解説しました。

最初は複雑に見える `Task` → `Assignment` → `Resource` の階層構造も、ループ処理の基本さえ押さえてしまえば、あなたの強力な武器に変わります。

「マクロの記録」という安全な岸を離れて、自分の手でオブジェクトを操るプログラミングの海へ漕ぎ出す第一歩として、ぜひこのコードをあなたのプロジェクトに導入してみてください。

ここをクリアできれば、Project VBAの基本はもうバッチリです!
あなたのプロジェクト管理が、よりスマートで快適なものになりますように。

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