【入門編】Assignment.WorkContourを操作して「フロントローディング」型の工数配分を自動適用する – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で、日々スケジュールやリソースの調整に奮闘していませんか?

「マクロの記録」ボタンを押してVBAを触り始めたけれど、複雑なオブジェクトの階層構造や、Microsoft Project特有のクセにぶつかって頭を抱えていませんか?

大丈夫。安心してください。今回は、Project VBAの真髄である「リソースの割り当て(Assignment)と工数配分(WorkContour)」をテーマに、実務で即戦力となるテクニックを伝授します。

ここをクリアすれば、あなたも単なる「マクロの記録の利用者」から、現場を自動化で救う「チーフアーキテクト」への階段を確実に登ることができますよ。それでは、一緒に深掘りしていきましょう!

—

なぜ「フロントローディング」なのか?:現場の現実味を高める工数配分

プロジェクト計画を立てるとき、こんな悩みはありませんか?

  • 「タスクの期間に対して、工数が綺麗に均等(フラット)に割り振られてしまい、実際の作業感と合わない」
  • 「プロジェクトの初期段階で一気にパワーを注ぎ込み、リスクを先につぶす『フロントローディング』型の計画に変えたいが、手動でガントチャートのセルをいじるのは気が遠くなる……」

Microsoft Projectのデフォルトでは、リソースをタスクに割り当てると、工数は期間全体に均等にばらまかれます(これを「平準型」や「標準」と呼びます)。しかし、実際の現場では、「着手直後にエンジン全開で突っ走り、後半は徐々に収束させる」というフロントローディング型の配分が求められることが多々あります。

これをVBAで一括制御できたら、どれほど計画策定がスマートになるでしょうか?
今回は、`Assignment.WorkContour`(ワークコンター:作業輪郭)というプロパティを操り、このフロントローディングを完全自動化する方法を解説します。

—

Project VBAの基本構造:プロジェクト・タスク・リソース・割り当ての関係

コードを書く前に、Microsoft Projectの「世界観」を少しだけ整理しておきましょう。Excel VBAと違って、Project VBAには独特の「4大オブジェクト」が存在します。

[Project (プロジェクト)]
┣━━ [Task (タスク)] ━━★ここをターゲットにする
┗━━ [Resource (リソース)]
┗━━ [Assignment (割り当て)] ━━★今回操作する主役!

  • Task(タスク): やるべき仕事(例:「基本設計」「コーディング」)
  • Resource(リソース): 人や機械(例:「山田くん」「シニアプログラマ」)
  • Assignment(割り当て): 「誰が・どのタスクに・どれくらい関わるか」という結びつき

今回操作する `Assignment` は、TaskとResourceを繋ぐ架け橋です。特定のタスクに割り当てられたリソースの「時間の使い方(工数の波形)」を、VBAから自由自在に変更することができます。

—

実装コード:フロントローディングを自動適用するマクロ

それでは、実際に動くコードを見てみましょう。
以下のコードは、アクティブなプロジェクトに含まれるすべての「割り当て(Assignment)」に対して、作業輪郭を「フロントローディング(前倒し型)」に変更する実用的なマクロです。

開発画面(`Alt + F11`)を開き、標準モジュールに貼り付けてそのまま実行してみてください。

Sub ApplyFrontLoadingContour()
‘ —————————————————————-
‘ 目的: プロジェクト内の全リソース割り当てに
‘ 「フロントローディング(前倒し型)」の工数配分を適用する
‘ —————————————————————-

Dim tsk As Task
Dim asn As Assignment
Dim updatedCount As Long

‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お約束のテクニック)
Application.ScreenUpdating = False

updatedCount = 0

‘ エラーハンドリングの準備
On Error GoTo ErrorHandler

‘ プロジェクト内のすべてのタスクをループ
For Each tsk In ActiveProject.Tasks
‘ サマリータスク(親タスク)や削除されたタスクはスキップ
If Not tsk Is Nothing Then
If Not tsk.Summary Then

‘ そのタスクに紐づくすべてのリソース割り当て(Assignment)をループ
For Each asn In tsk.Assignments

‘ pjContourFrontLoaded は「フロントローディング」を表す定数
asn.WorkContour = pjContourFrontLoaded

updatedCount = updatedCount + 1

Next asn

End If
End If
Next tsk

‘ 画面描画を再開
Application.ScreenUpdating = True

‘ 完了メッセージ
MsgBox “処理が完了しました。” & vbCrLf & _
“更新された割り当て数: ” & updatedCount, vbInformation, “自動化完了”
Exit Sub

ErrorHandler:
‘ エラー時の後始末
Application.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub

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

1. `Application.ScreenUpdating = False`
Projectは、タスクや割り当てを1件変更するたびに画面のガントチャートを再描画しようとします。データ量が多いプロジェクトでこれをやると激重(ゲキオモ)になります。処理の最初に画面更新を止め、最後に戻すのは、プロのエンジニアにとって常識のテクニックです。
2. `If Not tsk.Summary Then`
プロジェクトの「親タスク(サマリータスク)」には、直接リソースを割り当てるべきではありません(スケジュールが狂う原因になります)。そのため、子タスク(実作業)だけに処理を限定するガードを設けています。
3. `asn.WorkContour = pjContourFrontLoaded`
これが今回の核心です。`WorkContour` プロパティに定数 `pjContourFrontLoaded` を代入するだけで、Microsoft Project標準の「前倒し」の工数配分アルゴリズムが瞬時に適用されます。

—

陥りやすい罠とエラー回避の知見

実務でこのコードを運用する際、初心者が必ずと言っていいほどハマる「罠」があります。事前に知っておくことで、無駄なデバッグ時間をゼロにしましょう。

罠1: 「マニュアル入力(Fixed Units等)」との競合

リソースの割り当て方法(タスクの種類)が「固定単位」や「固定期間」になっている場合、勝手に工数配分(WorkContour)を変更すると、Projectが「ユーザーが入力した工数と計算結果が矛盾するぞ」と判断して、意図しない警告を出したり、変更を弾いたりすることがあります。

  • 対策: プロジェクト全体で工数配分をコントロールしたい場合は、タスクの作成初期段階、あるいはリソースをアサインした直後のイニシャル処理としてこのマクロを走らせるのが最も安全です。

罠2: 割り当て(Assignment)が存在しないタスクへのアプローチ

「まだ誰もアサインされていないタスク」に対して `tsk.Assignments` を回そうとすると、エラーこそ起きませんが、ループの中身がスルーされます。逆に、サマリータスクにリソースを誤ってアサインしている汚染されたプロジェクトデータだと、予期せぬコスト計算のズレを生みます。

  • 対策: 先ほどのコードのように、サマリータスクの除外フィルター(`Not tsk.Summary`)を必ず挟みましょう。

—

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

今回は、`Assignment.WorkContour` を用いた「フロントローディング」型の工数配分自動化について解説しました。

  • プロジェクト・タスク・リソース・割り当ての階層構造を理解すること
  • 画面描画の抑制(ScreenUpdating)でパフォーマンスを最適化すること
  • 定数(`pjContourFrontLoaded`)を使ってリソースの波形を自在に操ること

これらをマスターしたあなたなら、もはや単なる「マクロの記録の卒業生」ではありません。現場のプロジェクトマネージャーが喉から手が出るほど欲しい「現実的なスケジュール自動生成ツール」を作れるエンジニアです。

この知見を武器に、ぜひあなたの現場のワークフローを劇的に効率化してください。それでは、次のステップでお会いしましょう!

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