【実務・中級編】Assignment.PeakUnitsを監視してリソースのピーク稼働を特定する分析スクリプト – Project VBA解析バイブル

スポンサーリンク

プロジェクト管理の「見えない過負荷」を暴く:PeakUnits監視によるリソース最適化の極意

プロジェクトマネジメントにおいて、スケジュールは守られていても、特定のメンバーに負荷が集中し「燃え尽き」が発生するケースは後を絶ちません。Project VBAを扱うエンジニアとして、単にタスクを管理するだけでなく、「リソースの真の稼働率」を定量的かつ自動的に監視する仕組みを構築することは、プロジェクトを成功に導くための必須スキルです。

今回は、Projectの`Assignment`オブジェクトが持つ`PeakUnits`(期間中の最大稼働率)を監視し、閾値を超えたリソースを早期発見してExcelへレポート出力する、実務直結のアーキテクチャを伝授します。

—

なぜ「平均」ではなく「PeakUnits」なのか

多くの初学者は、リソースの稼働率をタスクの期間と工数から安易に計算しようとします。しかし、Projectの内部エンジンは複雑です。タスクの山崩し(Resource Leveling)が行われると、日々の稼働率は細かく変動します。

`Assignment.PeakUnits`は、プロジェクト期間中、そのリソースがどの瞬間にどれほどの負荷をかけられたかを示す最高値です。この数値を監視することで、カレンダー上の「見かけ上の平準化」に騙されることなく、真のオーバーアサインメント(過負荷)を検知できるのです。

—

堅牢な設計のための3つの鉄則

1. オブジェクトの解放を怠るな
VBAのメモリ管理は甘くありません。`Project`や`Assignment`のループ処理では、必ず参照オブジェクトを`Nothing`にセットし、メモリリークを防ぐ設計にします。
2. Excelとの連携は「疎結合」に
Project VBAから直接Excelのセルを叩くのは非効率です。一旦Array(配列)にデータを格納し、最後に一括でExcelへ流し込むことで、I/Oコストを劇的に下げます。
3. エラーハンドリングの徹底
リソースが未割り当てのタスクや、例外的なカレンダー設定を持つタスクでスクリプトが止まるのはプロとして失格です。`On Error Resume Next`を多用するのではなく、`If Not … Is Nothing`で存在判定を厳密に行いましょう。

—

実装コード:リソース・ピーク稼働分析エンジン

このスクリプトは、Projectのプロジェクトデータから「稼働率100%超え(1.0以上)」のリソースを抽出し、アクティブなExcelブックにレポートを生成します。

Option Explicit

‘ 閾値設定(1.0 = 100%)
Private Const THRESHOLD_UNITS As Double = 1.0

Public Sub ReportOverloadedResources()
Dim proj As Project
Dim res As Resource
Dim asn As Assignment
Dim results() As Variant
Dim i As Long

Set proj = ActiveProject
ReDim results(1 To 1000, 1 To 3) ‘ 一旦多めに確保
i = 0

‘ プロジェクト内の全リソースを走査
For Each res In proj.Resources
If Not res Is Nothing Then
For Each asn In res.Assignments
‘ PeakUnitsが閾値を超えているか判定
If asn.PeakUnits > THRESHOLD_UNITS Then
i = i + 1
‘ 配列に格納(Excelへの書き込みは最後に一括で行う)
results(i, 1) = res.Name
results(i, 2) = asn.TaskName
results(i, 3) = Format(asn.PeakUnits, “0%”)
End If
Next asn
End If
Next res

‘ Excelへの出力処理
If i > 0 Then
ExportToExcel results, i
Else
MsgBox “過負荷リソースは検出されませんでした。”, vbInformation
End If
End Sub

Private Sub ExportToExcel(dataArray() As Variant, rowCount As Long)
Dim xlApp As Object
Dim xlBook As Object

‘ Excelアプリケーションの制御
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add

‘ ヘッダーの設定
With xlBook.Sheets(1)
.Cells(1, 1).Value = “リソース名”
.Cells(1, 2).Value = “タスク名”
.Cells(1, 3).Value = “最大稼働率(PeakUnits)”

‘ 配列からの一括転記(高速化の肝)
.Range(.Cells(2, 1), .Cells(rowCount + 1, 3)).Value = dataArray
.Columns(“A:C”).AutoFit
End With

‘ オブジェクトの後始末
Set xlBook = Nothing
Set xlApp = Nothing
End Sub

—

プロダクション環境への導入アドバイス

  • 保守性の確保: このコードを`Global.MPT`(グローバルテンプレート)に入れて運用する場合、`ThisProject`を常に意識してください。特定のファイルに依存させず、どのプロジェクトを開いていても実行できることが重要です。
  • データベース連携: もしリソースの稼働履歴を長期保存したいなら、Excelではなく`SQL Server`や`Azure SQL`へADODB経由でログを書き込む構成にシフトしてください。VBAは「分析のトリガー」であり、データの「永続化ストレージ」ではないことを理解しておくべきです。

このスクリプトは、あなたのプロジェクト管理の「目」となります。リソースの悲鳴がデータとして可視化されたとき、初めて本当のプロジェクトマネジメントが始まります。ぜひ、明日の定例会議の前にこの分析を走らせ、余裕を持ったリソース配置を実現してください。

技術は、管理者の意図を補完するために存在します。コードが語る事実を、プロジェクトの成功という結果に変えていきましょう。

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