【入門編】リソースの「最大単位(MaxUnits)」を稼働状況に応じて自動調整する – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、「自分の手でプロジェクトを意のままに動かしたい」と願うあなたへ。

今回は、実務で絶対に直面する「リソースの最大単位(MaxUnits)の動的コントロール」をテーマに掲げます。

「計画ではフル稼働(100%)のはずなのに、実際には他のプロジェクトと掛け持ちしていて実質50%しか稼働できない…」
「現場のリアルな稼働実績に合わせて、プロジェクト計画の現実味をもっと高めたい!」

そんな現場の悲鳴をスマートに解決するのが、今回のProject VBAによる自動化ツールです。ここをクリアすれば、あなたも立派なProject VBAのアーキテクトの仲間入りですよ。さあ、一緒に本質を学んでいきましょう!

—

1. なぜ「MaxUnits(最大単位)」の自動調整が必要なのか?

MS Projectにおいて、リソースの「最大単位(MaxUnits)」は、その人がどれだけプロジェクトに割けるかを示す生命線です。

しかし、人間は機械ではありません。急なトラブル、他業務のヘルプ、スキルアップ研修……。現実は常に計画通りには進みません。手動で何百人ものリソースのMaxUnitsを書き換えるなんて、気が遠くなりますよね。

ここでProject VBAの出番です。
「リソースの稼働状況や実績データ(あるいは外部の調整データ)を読み込み、瞬時にMaxUnitsを最適値に書き換える」。この仕組みを手に入れれば、あなたの作るスケジュール表は、机上の空論から「血肉の通った実行可能な計画」へと生まれ変わります。

—

2. Project VBAの基本とオブジェクトの階層構造

まず、Excel VBAとMS Project VBAの決定的な違いを押さえましょう。
Excelの基本が「Worksheets(1).Cells(1,1)」だとすれば、Projectの基本は「ActiveProject.Resources」です。

Application (アプリ全体)
┗ Project (アクティブなプロジェクト)
┣ Tasks (タスク群)
┗ Resources (リソース群) ── ★今回アプローチするのはここ!

リソースオブジェクトを操作する際、プログラミング初学者が最初に躓くのが「単位の罠」です。
MS Projectの画面上では「100%」と表示されているMaxUnitsですが、VBAの内部データでは「1.0」という実数(小数)として扱われます。つまり、50%なら `0.5`、200%(複数人体制)なら `2.0` です。ここを間違えると、リソースが突然超人化したり絶滅したりするので注意してくださいね。笑

—

3. 実装コード:稼働状況に応じてMaxUnitsを自動調整する

それでは、現場でそのままコピペして使える実用的なコードを公開します。
今回は、特定の条件(例:過負荷状態にある、あるいは特定のカスタムフラグが立っているなど)をもとに、リソースのMaxUnitsを動的に調整するロジックです。

Sub AdjustResourceMaxUnits()
‘ —————————————————-
‘ テーマ:リソースの稼働状況に基づくMaxUnitsの動的最適化
‘ —————————————————-
Dim r As Resource
Dim targetName As String
Dim adjustedUnits As Double
Dim updateCount As Long

‘ 処理カウンターの初期化
updateCount = 0

‘ エラーハンドリングの基本
On Error GoTo ErrorHandler

‘ アクティブプロジェクト内の全リソースをスキャン
For Each r In ActiveProject.Resources

‘ リソースが空白(Nothing)でないか、またコストリソースではないかを確認
If Not r Is Nothing Then
If r.Type = pjResourceTypeCode Then ‘ 念のため作業 ụリソースに限定

‘ 【サンプルロジック】
‘ ここでは例として、リソース名に「シニア」が含まれる人は
‘ 別のプロジェクトとの掛け持ちを考慮して MaxUnits を 80% (0.8) に制限する
‘ ※実務では、ここにExcel連携や独自のスループット判定を組み込みます

If InStr(r.Name, “シニア”) > 0 Then
adjustedUnits = 0.8 ‘ 80%に変更

‘ 現在の値と異なる場合のみ更新(無駄なイベント発火を防ぐプロの技)
If r.MaxUnits <> adjustedUnits Then
r.MaxUnits = adjustedUnits
updateCount = updateCount + 1

‘ イミディエイトウィンドウにログを出力
Debug.Print “調整完了: ” & r.Name & ” -> ” & (adjustedUnits 100 & “%”)
End If
End If

End If
End If

Next r

‘ 完了メッセージ
MsgBox “処理が完了しました。” & vbCrLf & “更新されたリソース数: ” & updateCount & “件”, vbInformation, “最適化完了”
Exit Sub

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

コードのここがポイント!

1. `For Each r In ActiveProject.Resources`
プロジェクトに登録されているすべてのリソースをループで総なめにする、王道かつ最も安全な走査方法です。
2. `r.MaxUnits <> adjustedUnits` による比較
変更前後の値をチェックせず闇雲に代入し続けると、パフォーマンスが低下します。知的なエンジニアは「変化がある時だけ書き換える」というガードを必ず入れます。
3. 単位の変換
画面上の「80%」は、コード内では `0.8` として扱う点にしっかり留意してくださいね。

—

4. 現場で陥りやすい「罠」とエラー対策

Project VBAを書き始めると、必ずと言っていいほど次のような壁にぶつかります。

罠1:マテリアル(材料)リソースやコストリソースをいじってしまう

人間(作業リソース)だけでなく、会議室やプロジェクターなどの「材料リソース」、あるいは旅費などの「コストリソース」に対してMaxUnitsを設定しようとすると、実行時エラーが発生します。

  • 対策: サンプルコードのように `r.Type` を判定し、人間(作業リソース)だけに処理を絞り込むガードを必ず書きましょう。

罠2:リソースプールとの同期ズレ

複数プロジェクトでリソースプールを共有している場合、ローカル側のマクロで勝手にMaxUnitsを変更すると、親プール側との整合性が崩れて警告ダイアログがポップアップし、マクロが途中で止まってしまいます。

  • 対策: バックグラウンドでバッチ処理的に動かす場合は、あらかじめ `Application.DisplayAlerts = False` を設定してダイアログを抑制する配慮が必要です(※ただし、エラー時のデバッグが難しくなる諸刃の剣なので、開発時は慎重に!)。

—

おわりに:ここをクリアすれば、Project VBAの基本はバッチリですよ!

お疲れ様でした!
今回はリソースの「最大単位(MaxUnits)」を切り口に、オブジェクトの走査、プロパティの型(小数の罠)、そして実務で必須のガード節について解説しました。

「ただスケジュールを描くだけのツール」から、「現場の躍動に合わせて自ら最適化されるスマートなシステム」へ。MS Projectのポテンシャルを引き出すカギは、まさにこのVBAによるリソースコントロールにあります。

このコードをベースに、次は「Excelの稼働表(CSV)を読み込んで自動反映させるツール」などに拡張してみてください。あなたのプロジェクト管理ライフが、劇的に劇的変わることを保証します。

それでは、次回の極限の知見でお会いしましょう!

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