【入門編】リソースの「稼働可能時間」をプロジェクト期間に合わせて自動調整するツール – Project VBA解析バイブル

スポンサーリンク

こんにちは!今日もプロジェクト管理の自動化、楽しんでいますか?

Microsoft Project(以下、MS Project)を使いこなしていくと、避けて通れないのが「リソース(人員)の稼働可能時間(アベイラビリティ)」の管理です。

「プロジェクトの期間が急に変更になったのに、リソースの稼働可能期間が古いままだったせいで、割り当ての警告(オーバーアロケーション)が真っ赤に出てしまった……」
「リソース一人ひとりの稼働開始日と終了日を、プロジェクトの期間に合わせて手作業で修正していくのが苦痛すぎる……」

こんな悩みに直面したことはありませんか?

マクロの記録から一歩踏み出し、VBAの力でこれを自動化できれば、プロジェクトのスケジュール変更に一瞬で追従する「知的な計画表」が完成します。

今回は、リソースの「稼働可能時間」をプロジェクト期間に合わせてスマートに自動調整(トリミング)するVBAツールを一緒に作っていきましょう。ここをクリアすれば、Project VBAの基本、そして「オブジェクトの扱い方」はバッチリマスターできますよ!

—

1. MS Projectにおける「リソース稼働可能時間」の構造を知ろう

コードを書く前に、まずはMS Projectが「リソースの稼働可能時間」をどのように管理しているか、頭の中を整理しておきましょう。
専門用語ではこれを「オブジェクト階層」と呼びます。図解すると、以下のような美しいピラミッド構造になっています。

[ActiveProject] (現在開いているプロジェクト)
│
└── [Resources] (プロジェクトに登録された全リソースの集まり)
│
└── [Resource] (特定のメンバー。例:「佐藤さん」)
│
└── [ResourceAvailability] (稼働可能期間のリスト)
│
└── [Availability Item] (「○月〜×月は 100% 稼働可能」という1行分のデータ)

「佐藤さん」というリソースに対して、「プロジェクト開始日から終了日までは100%稼働できる」という設定を与えるには、このピラミッドの一番下にある `ResourceAvailability` コレクションを操作してあげる必要があります。

これを手作業でやると、リソースの数だけダイアログを開いてカレンダーをポチポチすることになりますが、VBAなら一瞬で、すべての人員に対して一括処理が可能です。

—

2. 稼働可能時間を自動調整する極上のVBAコード

それでは、さっそく実用的なコードを見てみましょう。
このコードは、「プロジェクトの開始日・終了日を自動で読み取り、すべての『作業リソース(人)』の稼働可能期間をその期間にぴったり合わせる」という処理を行います。

標準モジュールにコピー&ペーストしてそのまま使えますので、まずは眺めてみてください。

Sub SyncResourceAvailabilityToProjectPeriod()
‘ =================================================================
‘ ツール名:リソース稼働可能期間・自動トリミングツール
‘ 開発目的:プロジェクト期間の変更に合わせてリソースの稼働可能枠を自動同期する
‘ =================================================================

Dim proj As Project
Set proj = ActiveProject

‘ 1. プロジェクト全体の開始日と終了日を取得
Dim projStart As Date
Dim projFinish As Date
projStart = proj.ProjectStart
projFinish = proj.ProjectFinish

‘ ユーザーへの安心感のための確認メッセージ
Dim confirmMsg As String
confirmMsg = “現在のプロジェクト期間に合わせて、リソースの稼働可能期間を調整します。” & vbCrLf & _
“【対象期間】: ” & Format(projStart, “yyyy/mm/dd”) & ” 〜 ” & Format(projFinish, “yyyy/mm/dd”) & vbCrLf & _
“実行しますか?”

If MsgBox(confirmMsg, vbQuestion + vbYesNo, “リソース自動調整”) = vbNo Then
Exit Sub
End If

‘ 画面更新を一時停止して処理を高速化
Dim originalScreenUpdating As Boolean
originalScreenUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False

Dim r As Resource
Dim availabilities As ResourceAvailability
Dim newAvail As ResourceAvailability

‘ 2. プロジェクト内の全リソースを順番にループ処理
For Each r In proj.Resources
‘ 【重要】リソースが「空」でなく、かつ「作業(Work)リソース」である場合のみ処理
‘ (材料リソースやコストリソースには稼働可能時間という概念がないため、エラーを回避します)
If Not (r Is Nothing) Then
If r.Type = pjResourceTypeWork Then

‘ リソースの稼働可能時間コレクションを取得
Set availabilities = r.ResourceAvailability

‘ 既存の古い設定を一旦すべてクリア(リセット)
‘ ※これをしないと古い日付の設定がゴミとして残ってしまいます
On Error Resume Next ‘ エラーが発生しても処理を止めない(安全対策)
Do While availabilities.Count > 0
availabilities.Item(1).Delete
Loop
On Error GoTo 0 ‘ エラーハンドリングを元に戻す

‘ 3. 新しい稼働可能期間を設定
‘ 引数: (開始日, 終了日, 稼働可能パーセント)
‘ ※ 100% 稼働可能とする場合、引数には「100」を指定します。
‘ ※ ここでは各リソースの現在の「最大単位(MaxUnits)」を基準に設定します。
Dim defaultUnits As Double
defaultUnits = r.MaxUnits 100 ‘ MaxUnitsは 1.0 が 100% なので 100倍します

‘ コレクションに新しい期間を追加
availabilities.Add projStart, projFinish, defaultUnits

End If
End If
Next r

‘ 画面更新を元に戻す
Application.ScreenUpdating = originalScreenUpdating

‘ 完了報告
MsgBox “すべての作業リソースの稼働可能期間を、プロジェクト期間に合わせて最適化しました!”, _
vbInformation, “処理完了”

End Sub

—

3. 初学者のためのコード徹底解説!

このコードが何を行っているのか、大切なポイントを3つのステップで噛み砕いて解説します。マクロの記録から脱却するための「本質」がここに詰まっています。

ステップ①:プロジェクトの「期間」を正確に掴む

projStart = proj.ProjectStart
projFinish = proj.ProjectFinish

MS Projectは、プロジェクトの情報として「いつから始まって、いつ終わるか」を常に保持しています。手動で日付を入力するのではなく、システムからこの値を自動で取得することで、スケジュールがズレた時でも常に「最新の正しい期間」をプログラムが認識できるようになります。

ステップ②:ゴミデータを残さない「クリア&ビルド」

Do While availabilities.Count > 0
availabilities.Item(1).Delete
Loop

すでに設定されている古い期間のデータが残っていると、新しく追加した日付と重なってしまい、MS Projectが混乱します。
そのため、「新しい設定を適用する前に、古い設定を一度すべてきれいに削除する(Deleteする)」という処理を挟んでいます。これが、バグを起こさないプロのコードの書き方です。

ステップ③:`MaxUnits`(最大単位)を引き継ぐ賢さ

defaultUnits = r.MaxUnits 100

一律で「100%」と決め打ちにするのではなく、そのリソース自身が持っている「最大稼働率(MaxUnits)」を読み取って適用しています。
時短勤務で「普段は50%(0.5)稼働」と設定されている佐藤さんは、自動トリミング後もちゃんと「50%稼働」として登録される仕組みです。

—

4. プロへの関門!陥りやすいエラーと回避策

Project VBAを書き始めた人が、必ずと言っていいほどぶつかる「3大落とし穴」があります。ここをあらかじめ知っておけば、エラーが出ても慌てずに済みますよ!

落とし穴①:作業リソース以外に処理を行おうとしてエラーになる

MS Projectのリソースには、以下の3つのタイプがあります。

  • 作業リソース(人や設備。時間が経つとコストが発生する)
  • 材料リソース(コンクリートやケーブルなど、数量で管理するもの)
  • コストリソース(旅費や外注費など、固定の金額)

「材料」や「コスト」には、カレンダーや稼働可能時間という概念がありません。そのため、これらに対して `ResourceAvailability` を操作しようとすると、「実行時エラー 1101(引数が正しくありません)」が発生してプログラムが止まってしまいます。

【対策】
コード内の以下の判定を入れることで、確実に「作業リソース(人)」だけを狙い撃ちしています。

If r.Type = pjResourceTypeWork Then

落とし穴②:日付の前後関係がバグる

プロジェクトの終了日が、開始日よりも過去になっている(あるいは何らかの入力ミスでデータが破損している)場合、期間の追加(`Add`)に失敗します。
今回のコードでは、プロジェクト全体の開始・終了日(`ProjectStart` / `ProjectFinish`)をそのまま使っているため安全ですが、手動で日付を計算する場合は「開始日 < 終了日」の関係が崩れないように注意しましょう。

—

まとめ:ここをクリアすれば、Project VBAの基本はバッチリ!

お疲れ様でした!
今回ご紹介したツールを使えば、プロジェクトの期間が変更されても、ボタン一つでリソースの稼働可能時間を一括最適化できるようになります。

この記事で学んだ、
1. オブジェクトの階層構造を意識する
2. 既存データをクリアしてから新しいデータを追加する
3. リソースの「タイプ(作業/材料/コスト)」を判定してエラーを防ぐ

という考え方は、Project VBAにおけるすべての開発の基礎であり、最も重要な極意です。

マクロの記録を卒業し、自分の手でオブジェクトをコントロールする楽しさを感じていただけたら嬉しいです。一歩ずつ、頼れる自動化エンジニアへの道を歩んでいきましょう!応援しています!

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