【入門編】【上級プロ】Project VBAによる「リソース平準化」の自動実行と、競合発生時のログ出力・分析 – Project VBA解析バイブル

スポンサーリンク

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

「人が足りない!」「同じ人が同時に別のタスクをやらされている……」
Microsoft Projectを使っていると、こうした「リソースの競合(オーバーアロケーション)」は避けて通れない壁です。

手動でタスクをズラして調整するのは、まるで終わりのないパズルのよう。これをVBA(Visual Basic for Applications)の力でスマートに自動化し、さらに「どこでどんな競合が起きているのか」を自動でレポートする品質管理エンジンを作ってみましょう。

ここをクリアすれば、あなたもマクロの記録から卒業し、Project VBAの本質を突く「上級プロ」の仲間入りです。一緒に優しく、深く、マスターしていきましょう!

1. Project VBAのオブジェクトモデルと「リソース平準化」の哲学

まずは、私たちが操るMS Projectの世界観を確認しておきましょう。
Excel VBAが「セル(Cell)」の集まりなら、Project VBAは「階層構造を持つプロジェクト(Project)」の宇宙です。

4大重要オブジェクト

1. Application: MS Projectそのもの。全体の環境設定を司ります。
2. Project: 現在開いているスケジュール(`.mpp`ファイル)。
3. Task: スケジュールを構成する作業の断片。
4. Resource: タスクを遂行する人間や機材。

「リソース平準化(Leveling)」とは?

リソース平準化とは、「キャパシティを超えた働き方をしている人(オーバーアロケーション)のタスクを、自動的に後ろにズラしたり調整したりして、無理のないスケジュールに組み替える機能」です。

これをUI(画面)からポチポチ操作するのではなく、VBAの `Project.LevelNow` メソッドと `LevelingOptions` を使ってコードから完全制御します。

2. 【実践】平準化の自動実行と競合検知エンジン

それでは、現場で即戦力として使える実用コードを公開します。
このコードは、以下の3つのステップを自動で行う「品質管理エンジン」です。

1. 平準化ルールの設定(LevelingOptions):どのような条件で平準化するかを定義します。
2. 平準化の実行(LevelNow):エンジンを回してスケジュールを最適化します。
3. 競合の検知とログ出力:平準化しきれなかった(あるいは残存している)リソースのオーバーアロケーションを検知し、イミディエイトウィンドウ(または別シート)にレポートします。

以下のコードを、ProjectのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。

‘ ==============================================================================
‘ プロジェクト名: Project VBA 実戦品質管理エンジン
‘ 概要 : リソース平準化の自動実行と、競合(オーバーアロケーション)の検知・レポート
‘ ==============================================================================
Sub RunLevelingAndAuditEngine()
Dim prj As Project
Set prj = ActiveProject

On Error GoTo ErrorHandler

‘ ————————————————————————–
‘ Step 1: リソース平準化オプションの構成
‘ ————————————————————————–
‘ 自動平準化を有効にし、優先順位や期間の制約をコードで明示的にコントロールします
With prj
.LevelingEntireProject = True ‘ プロジェクト全体を対象にする
.LevelingOrder = pjLevelStandard ‘ 標準的な平準化順序(ID、優先度など)
‘ 自動平準化の計算を手動モードに(予期せぬ自動計算を防ぎ、VBAでコントロールするため)
.AutoLevel = False
End With

‘ ————————————————————————–
‘ Step 2: リソース平準化の実行
‘ ————————————————————————–
MsgBox “リソース平準化を実行します。”, vbInformation, “エンジン起動”

‘ プロジェクト全体に対して平準化を即時実行
prj.LevelNow

‘ ————————————————————————–
‘ Step 3: 平準化後の「リソース競合」検知とログ出力(監査フェーズ)
‘ ————————————————————————–
Dim res As Resource
Dim conflictCount As Long
conflictCount = 0

Debug.Print “=========================================”
Debug.Print ” 【リソース平準化 & 競合監査レポート】”
Debug.Print ” 実行日時: ” & Now
Debug.Print “=========================================”

‘ すべてのリソースを走査
For Each res in prj.Resources
‘ リソースが存在し、かつ「コスト・Material(資材)」ではなく「Work(労働)」リソースを対象とする
If Not res Is Nothing Then
If res.Type = pjResourceTypeWork Then
‘ オーバーアロケーション(OverAllocated)プロパティをチェック
If res.OverAllocated = True Then
conflictCount = conflictCount + 1

‘ 競合情報をイミディエイトウィンドウに出力
Debug.Print ” [警告] 競合検知 #” & conflictCount
Debug.Print ” – リソース名 : ” & res.Name
Debug.Print ” – 最大割当 : ” & res.PeakUnits 100 & “%”
Debug.Print ” – 担当タスクの確認が必要です。”
Debug.Print “—————————————–”
End If
End If
End If
Next res

‘ 監査結果のサマリー
If conflictCount > 0 {
MsgBox “平準化が完了しましたが、” & conflictCount & ” 件の未解決の競合(リソース不足)が検知されました。” & vbCrLf & _
“詳細はイミディエイトウィンドウを確認してください。”, vbExclamation, “監査完了:要確認”
} else {
MsgBox “素晴らしい!すべてのリソース競合が綺麗に解消されました。”, vbInformation, “監査完了:正常”
}

Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

3. コードの解説:ここがプロの勘所

初心者から一歩抜け出すために、このコードの重要なポイントを解説します。

① `ActiveProject` とオブジェクトのスコープ

Excelと違い、Projectでは複数のプロジェクトウィンドウが同時に開くことがあります。そのため、曖昧な `ActiveCell` のような参照ではなく、`ActiveProject` を明示的に変数(`prj`)に格納して操作するのが、堅牢な(バグりにくい)コードを書く鉄則です。

② `res.OverAllocated` の真価

平準化を実行しても、プロジェクトの制約(「この日までに絶対に終わらせろ」というデッドラインなど)が厳しすぎると、システムがタスクをズラしきれずに「競合が残ったまま」になることがあります。
ここで紹介したコードは、平準化直後に `res.OverAllocated` を監視することで、「本当にスケジュールが安全な状態になったか」を機械的にチェック(監査)しています。これが品質管理エンジンの核心部分です。

4. 陥りやすいエラーと回避のコツ

1. 「オブジェクトが必要です」という実行時エラー (Error 424)

  • 原因: リソースが登録されていない、あるいはタスクに何も割り当てられていない状態でプロパティを呼び出すと発生します。
  • 対策: コード内の `If Not res Is Nothing Then` のように、オブジェクトの存在チェックを必ず挟みましょう。

2. 平準化しても何も変わらない?

  • 原因: タスクの「優先度(Priority)」が最高値(1000)に設定されている場合、平準化エンジンは「このタスクは絶対に動かしてはならない」と判断して動かなくなります。
  • 対策: 平準化を行う前に、タスクの優先度が適切にバラされているか確認してください。

まとめ

今回は、Project VBAを用いた「リソース平準化の自動化」と「競合の監査ログ出力」について解説しました。

ここをクリアすれば、単なる「マクロの記録の貼り付け」ではなく、「プロジェクトの品質を自動で担保するシステム」を自分の手で構築できるようになります。

現場のスケジュール管理を自動化し、スマートなエンジニアライフを送りましょう!それでは、次回の応用編でお会いしましょう。バッチリ使いこなしてくださいね!

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