【入門編】リソースの「稼働可能時間」をプロジェクトの祝日・休暇設定から自動計算する – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵へ:リソースの「真の稼働可能時間」を掌握する

こんにちは。プロジェクト管理という複雑な迷宮を、コード一本で切り拓くエンジニアの皆さん。
Project VBAの世界へようこそ。

「マクロの記録」ボタンを押して得られるコードは、いわば「おもちゃの車」です。しかし、Projectのオブジェクトモデルを理解した瞬間、それは「F1マシン」へと変貌します。

今回は、多くのエンジニアが頭を悩ませる「リソースの稼働可能時間の自動算出」に挑みます。単にカレンダーを見るだけではありません。祝日や休暇という「例外」を考慮し、プロジェクトの現実を数値化する。このロジックをマスターすれば、あなたのプロジェクト管理は「推測」から「精密な予測」へと進化します。

—

1. なぜ「カレンダー」をコードで制御する必要があるのか?

Projectの画面上では、リソースの稼働時間はカレンダー設定から自動計算されます。しかし、「特定の期間、このリソースが合計何時間稼働できるのか?」をレポートとして抽出したり、外部のコスト計算ロジックに組み込もうとすると、画面上の操作では限界が来ます。

VBAでこれを制御する最大のメリットは、「不確実性の排除」です。手動計算によるヒューマンエラーをゼロにし、プロジェクトの予実管理を鉄壁のものにする。それが、我々エンジニアの使命です。

—

2. 稼働時間を算出するための「思考の設計図」

コードを書く前に、Projectのオブジェクト構造を頭に焼き付けましょう。

  • Resourcesオブジェクト: リソースそのもの。
  • Calendarオブジェクト: 稼働時間を定義する心臓部。
  • Exceptionオブジェクト: 休日や特別休暇などの「例外」を保持するコレクション。

今回書くコードのアルゴリズムはこうです。
1. 指定した期間(開始日〜終了日)をループする。
2. その日がリソースの「稼働日」かどうかを判定する。
3. 稼働日であれば、その日の標準稼働時間を加算する。
4. 祝日や休暇(Exception)であれば、その時間を除外する。

—

3. 実装コード:稼働可能時間算出エンジン

このコードは、標準モジュールに貼り付けて使用してください。プロジェクト内に存在する全てのリソースの稼働時間を計算します。

‘ プロジェクト内の全リソースの稼働可能時間を算出する
Sub CalculateResourceAvailability()
Dim res As Resource
Dim startDate As Date
Dim endDate As Date
Dim targetDate As Date
Dim totalHours As Double

‘ 計算対象期間の設定
startDate = Date
endDate = DateAdd(“m”, 1, startDate) ‘ 今日から1ヶ月後まで

‘ 全リソースをループ
For Each res In ActiveProject.Resources
‘ リソースが人(Work)である場合のみ計算
If res.Type = pjResourceTypeWork Then
totalHours = 0

‘ 日付ごとに稼働を確認
For targetDate = startDate To endDate
‘ その日の稼働可能時間を取得するカスタム関数を利用
totalHours = totalHours + GetWorkingTimeForDate(res, targetDate)
Next targetDate

‘ 結果をイミディエイトウィンドウに出力
Debug.Print res.Name & “の稼働可能時間: ” & totalHours & “時間”
End If
Next res
End Sub

‘ 特定の日付の稼働時間を取得する関数
Function GetWorkingTimeForDate(res As Resource, targetDate As Date) As Double
Dim cal As Calendar
Set cal = res.Calendar

‘ その日が稼働日かチェック(休日なら0、稼働日なら標準稼働時間を返す)
‘ ※Projectの仕様上、DayWorkingがTrueなら稼働日
If cal.Period(targetDate).Working Then
‘ 1日8時間稼働を仮定(必要に応じてcal.WorkingTimesから取得可能)
GetWorkingTimeForDate = 8
Else
GetWorkingTimeForDate = 0
End If
End Function

—

4. 陥りやすい「罠」と解決のヒント

罠1:リソース固有カレンダーとプロジェクトカレンダーの混同

初心者が最もよくやるミスは、`ActiveProject.Calendar` を見てしまうことです。リソースには個別のカレンダーが設定されている可能性があります。必ず `res.Calendar` を参照してください。

罠2:日付の型変換エラー

VBAの `Date` 型は強力ですが、ProjectのAPIは時にシビアです。特に `DateAdd` や `Date` 関数を使う際は、システムの日付設定とProjectの設定が矛盾していないか注意してください。

罠3:パフォーマンスのボトルネック

リソースが数千人いる場合、単純なループは重くなります。大規模プロジェクトで運用する場合は、あらかじめ `Application.ScreenUpdating = False` を設定し、描画負荷を抑えるのがプロの作法です。

—

最後に:コードは、あなたの「分身」となる

今回学んだロジックは、単なる稼働時間算出にとどまりません。これを応用すれば、「リソースの負荷状況に応じたタスクの自動割り当て」や「コストの動的シミュレーション」だって可能です。

Project VBAは、Excel VBAよりも少しだけ気難しい相手です。しかし、その分、あなたのプロジェクトを劇的に強くしてくれます。

「コードを書くことは、プロジェクトの未来を設計すること」。
この感覚を忘れずに、次のコードに挑んでください。応援しています。

—
執筆者:Project VBA チーフアーキテクト
「迷ったら、まずはオブジェクトブラウザを叩け。それが全ての始まりだ。」

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