プロジェクト管理の「神」になる:Project VBAでタスク工数とリソースを自動最適化する極意
こんにちは。現場の最前線で自動化アーキテクトをしている私から、今日は「Project VBAによるリソース自動割り当て」という、プロジェクト管理の聖杯とも言える領域についてお話しします。
「マクロの記録」を卒業し、Projectのオブジェクトモデルを支配下に置くことは、単なる効率化ではありません。それは、不透明なプロジェクトの霧を晴らし、計算可能な未来を設計する力を持つことです。
さあ、泥臭い手作業から解放され、真のエンジニアリングの世界へ足を踏み入れましょう。
—
1. なぜ「自動割り当て」が必要なのか?
プロジェクトの規模が大きくなると、タスクの工数に対して「誰が、いつ、どれだけ稼働できるか」を管理するのは人間には限界が来ます。
- 見積もりと現実の乖離
- 特定のメンバーへの負荷集中
- 手作業による転記ミスの連鎖
これらを解決するのが、Projectの「Assignment(割り当て)」オブジェクトを直接制御するVBAの力です。
—
2. 核心:Project VBAのオブジェクト階層を理解する
Project VBAを扱う上で、まずはこの3つの階層を頭の中に刻んでください。
1. Project(プロジェクト全体)
2. Task(タスク:何をするか)
3. Resource(リソース:誰がやるか)
4. Assignment(割り当て:タスク×リソースの結合点)
「Assignment」は、ただの紐付けではありません。「タスクの工数」と「リソースの稼働可能時間」が交差する、プロジェクトの経済活動そのものです。
—
3. 実践:タスク工数から自動アサインするコード
それでは、特定のタスクに対して、工数に基づいた割り当てを自動生成するコードを見てみましょう。
Sub AutoAssignResource()
Dim proj As Project
Dim tsk As Task
Dim res As Resource
Dim assn As Assignment
Set proj = ActiveProject
‘ プロジェクト内の全タスクをループ
For Each tsk In proj.Tasks
‘ 完了済みやサマリータスクはスキップ(重要:バグの温床になります)
If Not tsk Is Nothing And Not tsk.Summary Then
‘ 例えば「開発」という名前のタスクにリソースを割り当てる想定
If InStr(tsk.Name, “開発”) > 0 Then
‘ リソースが既に割り当てられていないか確認してから生成
If tsk.Assignments.Count = 0 Then
‘ リソース「山田太郎」をIDで取得し割り当て
‘ Work(工数)はタスクのDurationから自動算出される
Set assn = tsk.Assignments.Add(TaskID:=tsk.ID, ResourceID:=1)
‘ 割り当て率を100%に設定
assn.Units = 1
Debug.Print “タスク: ” & tsk.Name & ” にリソースを割り当てました。”
End If
End If
End If
Next tsk
MsgBox “割り当て処理が完了しました。”, vbInformation
End Sub
このコードのポイント
- `Not tsk.Summary` のチェック: これを忘れると、サマリータスク(親タスク)に工数を割り当ててしまい、プロジェクトの計算が壊滅します。初学者が最も陥る罠です。
- `tsk.Assignments.Add`: これが心臓部です。ここで「どのタスクに」「どのリソースを」結合するかを決定します。
—
4. 陥りやすいエラーと回避策
① 「リソースが存在しない」エラー
リソース名で指定しようとすると、同姓同名や表記揺れで死にます。必ず `ResourceID` を使用してください。 リソースリストはデータベースとして一意なIDで管理するのが鉄則です。
② 計算の不整合(WorkとDuration)
Projectには「工数(Work)=期間(Duration)×稼働率(Units)」という基本式があります。VBAで `Units` を触ると、期間が自動計算されてスケジュールが崩れることがあります。
- 対策: 重要な計算の前後には `Application.Calculation = pjManual` を挟み、最後に自動計算を走らせることで、プロジェクト全体の計算負荷を抑えつつ整合性を保てます。
—
5. 次のステップへ:プロへの道
ここまでで、あなたは「タスクに人を割り当てる」という第一歩を踏み出しました。
次は、リソースの「空き時間(Availability)」をAPIで取得し、空いている人に自動で仕事を振るという、「リソース平準化の自動化」に挑戦してみてください。
Project VBAは、一度味方につければ、あなたのプロジェクト管理能力を10倍に引き上げてくれる最強の武器になります。
「ここが動かない」「もっと高度なロジックを組みたい」という時は、いつでも聞いてください。壁を越えた先にある景色を、一緒に見に行きましょう。
—
エンジニアとしての心得:
自動化コードを書くときは、常に「このロジックは他人が読んだときに、プロジェクトの意図を正しく反映しているか?」を自問自答してください。それが、ただのプログラマーと、価値を生むアーキテクトの境界線です。
