【入門編】リソースの「稼働率」が閾値を超えた場合に警告を出す「リアルタイム・モニタリング」 – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの自動記録から一歩踏み出し、コードを自分で書いてプロジェクトを自動制御できるようになると、業務効率化の景色がガラリと変わります。

今回は、Microsoft Project(以下、MS Project)を開いた瞬間に発動する「リソース稼働率のリアルタイム・モニタリング機能」を作成します。

「メンバーのAさんが、いつの間にか稼働率150%(オーバーアロケーション)になっていて納期遅延が起きてしまった…」といったトラブルを、ファイルを開いた「1秒後」に自動検知して警告ダイアログを出す仕組みです。

ここをクリアすれば、Project VBAの基本概念である「イベント」と「リソースオブジェクトの操作」はバッチリですよ!一緒にステップ・バイ・ステップで学んでいきましょう。

—

1. なぜ「リアルタイム・モニタリング」が必要なのか?

MS Projectでスケジュールを組んでいると、タスクの追加や期間変更に気を取られ、特定の個人に作業が集中していること(過負荷)を見落としがちです。

マクロの記録機能では「現在選択しているセルを操作する」ような静的な処理しか記述できません。しかし、本当に欲しいのは「プロジェクトを開いた時に、自動で全リソースの健康状態をチェックしてくれる仕組み」ですよね。

これを実現するために、今回は「イベントハンドラ」というVBAの強力な機能を活用します。

稼働率の計算メカニズム(図解イメージ)

MS Project内部では、リソースの負荷状態を次のように管理しています。

【リソースのキャパシティ判定モデル】

標準最大単位 (Max Units) : 100% (1.0) ← その人の定格キャパシティ
ピーク単位 (Peak Units) : 150% (1.5) ← タスク重なりによる最大負荷

[稼働率] = ( Peak Units / Max Units ) × 100
= ( 1.5 / 1.0 ) × 100 = 150% ⇒ 【 警告対象! 】

VBAを使って、全リソースの `PeakUnits`(最大割り当て)と `MaxUnits`(標準割り当て)を比較・計算し、指定した閾値(しきいち)を超えている場合に警告を発令します。

—

2. 実装の準備:コードを書く「場所」がポイント!

Project VBAには、コードを書く場所が大きく分けて2つあります。

1. 標準モジュール(Module1など):手動でボタンを押して実行するプログラムを書く場所
2. ThisProject モジュール:「ファイルを開いた時」などのイベントに応じて自動実行するプログラムを書く場所

今回は「ファイルを開いた時」に発動させたいので、必ず `ThisProject` にコードを記述します。

配置手順

1. MS Projectを開き、`Alt + F11` キーを押してVBE(Visual Basic Editor)を開きます。
2. 左側のプロジェクトエクスプローラーから `ThisProject` をダブルクリックします。
3. 開いたコードウィンドウに、以下のコードを貼り付けます。

—

3. 実装コード(コピペOK・詳細コメント付き)

以下のコードをそのまま `ThisProject` モジュールに貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ イベント名: Project_Open
‘ 概要: プロジェクトファイルが開かれた際に自動実行され、
‘ リソースの稼働率(PeakUnits / MaxUnits)を監視・警告します。
‘ ==============================================================================
Private Sub Project_Open(ByVal pj As Project)
On Error GoTo ErrorHandler

‘ 1. パフォーマンス最適化:画面の再描画を一時停止
Dim app As MSProject.Application
Set app = pj.Application
app.ScreenUpdating = False

‘ ————————————————————————–
‘ 設定値
‘ ————————————————————————–
‘ 警告を出す閾値(1.0 = 100%)。例えば 1.2 にすると「120%超え」で警告します。
Const WARNING_THRESHOLD As Double = 1.0

Dim res As Resource
Dim warningMessage As String
Dim overLoadedCount As Long

overLoadedCount = 0
warningMessage = “【⚠️ リソース過負荷アラート】” & vbCrLf & _
“以下の作業リソースが稼働率の閾値(” & (WARNING_THRESHOLD 100) & “%)を超えています:” & vbCrLf & vbCrLf

‘ ————————————————————————–
‘ 2. 全リソースのループ処理
‘ ————————————————————————–
For Each res In pj.Resources
‘ 空行(割り当てのないリソース行)の回避
If Not res Is Nothing Then

‘ 【重要】作業リソース(Work)のみを対象とする(コストや材料リソースを除外)
If res.Type = pjResourceTypeWork Then

‘ ゼロ割防止:MaxUnits(割り当て可能上限)が0より大きい場合のみ計算
If res.MaxUnits > 0 Then

‘ PeakUnits(割り当てられたピーク時の負荷)が閾値を超えているか判定
If res.PeakUnits > (res.MaxUnits WARNING_THRESHOLD) Then

overLoadedCount = overLoadedCount + 1

‘ 稼働率の計算 (%)
Dim currentUtilization As Double
currentUtilization = (res.PeakUnits / res.MaxUnits) 100

‘ 警告メッセージの組み立て
warningMessage = warningMessage & “・” & res.Name & _
” : 稼働率 ” & Format(currentUtilization, “0.0”) & “% ” & _
“(ピーク割り当て: ” & Format(res.PeakUnits 100, “0”) & “% / 上限: ” & Format(res.MaxUnits 100, “0”) & “%)” & vbCrLf
End If

End If
End If

End If
Next res

‘ 3. 画面描画の再開
app.ScreenUpdating = True

‘ ————————————————————————–
‘ 4. 結果の通知ダイアログ表示
‘ ————————————————————————–
If overLoadedCount > 0 Then
‘ 警告アイコン付きでメッセージを表示
MsgBox warningMessage, vbExclamation + vbOKOnly, “リソース稼働率モニタリング”
End If

Exit Sub

‘ ——————————————————————————
‘ エラーハンドリング
‘ ——————————————————————————
ErrorHandler:
‘ 万が一エラーが起きても、画面更新だけは必ず再開させる(プロの嗜み)
app.ScreenUpdating = True
MsgBox “モニタリング処理中に予期せぬエラーが発生しました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
End Sub

—

4. コードの解説と初心者が陥りやすいポイント

このコードには、脱・初心者を目指す上で重要なプログラミングのテクニックが詰まっています。

① リソースタイプの判定(`res.Type = pjResourceTypeWork`)

MS Projectのリソースには「作業」「材料」「コスト」の3種類があります。「材料(ペンキなど)」や「コスト(旅費など)」には稼働率という概念がありません。
`res.Type` をチェックして「作業リソース(Work)」だけを絞り込むのが、エラーを出さないための秘訣です。

② `PeakUnits` と `MaxUnits` の関係

  • `res.MaxUnits`: そのリソースの最大能力値(1.0 = 100%)。
  • `res.PeakUnits`: スケジュール内で最も負荷がかかっている瞬間の割り当て値。

VBA内部では、「100%」は数値の `1.0` として扱われます。メッセージ表示時に ` 100` してパーセント表示に変換しています。

③ ゼロ割り算(Zero Division)の回避

もし `MaxUnits` が `0` のリソースが存在すると、`(res.PeakUnits / res.MaxUnits)` の計算時に 「0で除算しました」エラー でプログラムが停止してしまいます。プログラミングでは、割り算をする前に「分母が0でないか」を判定するのが鉄則です。

④ エラーハンドリングと `ScreenUpdating`

`app.ScreenUpdating = False` で描画を止めることで、処理速度が飛躍的に向上します。
ただし、途中でエラーが起きると画面が固まったように見えてしまうため、`On Error GoTo ErrorHandler` を配置して、エラー時でも必ず `ScreenUpdating = True` に戻す安全装置を組んでいます。

—

5. 動作確認してみよう!

1. コードを `ThisProject` に貼り付けたら、VBEを閉じます。
2. MS Projectの「リソースシート」を開き、誰か1人のタスクを重複させて過負荷状態(リソース名が赤字になる状態)を作ります。
3. 一度プロジェクトファイルを保存して閉じます。
4. 再度ファイルを開いてみてください!

ファイルが開いた直後、以下のような警告ダイアログがポコンと自動表示されれば大成功です!

> 【⚠️ リソース過負荷アラート】
> 以下の作業リソースが稼働率の閾値(100%)を超えています:
>
> ・山田 太郎 : 稼働率 150.0% (ピーク割り当て: 150% / 上限: 100%)

—

まとめ:Project VBAマスターへの第一歩

お疲れ様でした!
今回は「ファイルを開いた瞬間に、プロジェクト全体の健康状態を判定する」という、実用的なリアルタイム・モニタリングコードを作成しました。

マクロの記録では決して作れない「条件分岐(If)」「繰り返し(For Each)」「イベント(Project_Open)」というVBAの醍醐味を体験していただけたはずです。

慣れてきたら、`WARNING_THRESHOLD = 0.8`(80%以上の段階で早めに警告を出す)に変更してみたり、警告が出たら自動で特定のリソースビューを開くようにカスタマイズしてみるのも面白いですよ。

ここをクリアしたあなたなら、Project VBAの基本概念はすでにバッチリ身についています。自信を持って次の自動化にチャレンジしてくださいね!

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