こんにちは!Project VBAの世界へようこそ。
マクロの記録から一歩踏み出し、「現場で本当に使える自動化」を目指すあなたへ、最高にエキサイティングな知見をお届けします。
今回は、Project VBAにおける「リソースの割り当て優先度(Priority)を自動制御するロジック」を徹底解説します。
「プロジェクトの遅延を防ぐために、重要度が高いタスクに優先的にリソースを割り当てたい」
「でも、何百もあるタスクのリソース優先度を手動でポチポチ設定していくなんて、発狂しそう……」
そんな現場の悲鳴を、たった数行の洗練されたVBAコードでスマートに解決していきましょう。ここをクリアすれば、あなたのProject VBAスキルは間違いなく中級者の領域を突破します。一緒にマスターしていきましょう!
—
1. なぜ「優先度(Priority)」の自動化が必要なのか?
Microsoft Projectには、リソースの過負荷(キャパシティオーバー)を自動で解消してくれる「リソース平準化(Leveling)」という強力な機能があります。
しかし、この平準化機能、デフォルトのままだと「どのタスクを優先し、どのタスクを後ろにずらすべきか」をプロジェクトマネージャーの意図通りに動かすのが難しいのです。そこで重要になるのが、各「リソース割り当て(Assignment)」に設定されている`Priority`(優先度:0〜1000)というプロパティです。
手動運用の限界とVBAの役割
- 手動の場合: タスクが増えるたびにガントチャートの列を表示し、数値を手入力。スケジュールを変更するたびに再設定の嵐。
- VBAの場合: タスクの「重要度(フラグやカスタムフィールド)」をトリガーに、一瞬で全リソースの優先度を最適値に書き換える。
この自動化を組み込むことで、「平準化を実行したときに、絶対に死守すべき重要タスクが後ろに押しやられない環境」を完璧に構築できます。
—
2. 【図解的イメージ】タスク・リソース・割り当ての関係性
Project VBAで最もつまずきやすいポイントが、オブジェクトの階層構造です。ここで頭を整理しておきましょう。
[プロジェクト全体 (Project)]
┣━━ [タスク (Task)] ── 例:「基幹システム設計」(重要度:高)
┗━━ [リソース (Resource)] ── 例:「シニアエンジニア Aさん」
┃
┗━━ ⚡【ここを操作!】 [割り当て (Assignment)]
┗━━ 優先度 (Priority) : 0 ~ 1000
- Task(タスク):「何をするか」
- Resource(リソース):「誰が・何がやるか」
- Assignment(割り当て):「タスクにリソースが割り付いた状態(ここが今回の主役!)」
私たちが操作したい「Priority」は、Taskそのものではなく、TaskとResourceを結びつける「Assignment(割り当て)」オブジェクトに属しています。ここを間違えると「プロパティが見つかりません」というエラーの沼にハマるので注意してくださいね。
—
3. 実装コード:重要度に応じて優先度を自動設定する
それでは、実際の現場でそのままコピペして使える実用的なコードをご紹介します。
今回は、タスクの「テキスト1 (Text1)」フィールドに「重要」と入力されているタスクの割り当て優先度を最高値の「1000」に、それ以外をデフォルトの「500」に自動設定するロジックです。
Sub AutoSetAssignmentPriority()
‘ =================================================================
‘ 目的: タスクの重要度に応じて、リソース割り当ての優先度を自動設定する
‘ 対象: アクティブプロジェクトの全タスク・全割り当て
‘ =================================================================
Dim tsk As Task
Dim asn As Assignment
Dim updatedCount As Long
‘ 画面描画を停止してマクロの実行速度を爆速にする(VBA高速化の基本!)
Application.ScreenUpdating = False
updatedCount = 0
‘ プロジェクト内のすべてのタスクをループ処理
For Each tsk In ActiveProject.Tasks
‘ タスクが存在し、かつサマリータスク(要約タスク)ではない場合のみ処理
If Not tsk Is Nothing Then
If Not tsk.Summary Then
‘ タスクのテキスト1フィールドに「重要」と入っているか判定
‘ ※現場の運用に合わせて、フラグフィールドや数値カスタムフィールドに変更可能
If tsk.Text1 = “重要” Then
‘ そのタスクに紐づくすべてのリソース割り当てをループ
For Each asn In tsk.Assignments
‘ 優先度を最高値(1000)に設定
asn.Priority = 1000
updatedCount = updatedCount + 1
Next asn
Else
‘ 「重要」以外の場合は標準値(500)に設定
For Each asn In tsk.Assignments
asn.Priority = 500
Next asn
End If
End If
End If
Next tsk
‘ 画面描画を再開
Application.ScreenUpdating = False
Application.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “処理が完了しました。” & vbCrLf & _
“優先度を更新した割り当て数: ” & updatedCount & “件”, _
vbInformation, “リソース優先度自動化ツール”
End Sub
—
4. コードの深掘り解説 & 現場で役立つ知見
このコードには、伝説のアーキテクトが推す「実務で絶対に外せないポイント」が詰まっています。
① `If Not tsk Is Nothing Then` の重要性
Projectのタスクコレクションは、途中でタスクが削除されると「空のオブジェクト(Nothing)」が挟まることがあります。これをスルーしてプロパティ(`Text1`など)にアクセスすると、容赦なく実行時エラー(オブジェクト変数が設定されていません)が発生します。このガードを忘れないのがプロの証です。
② 要約タスク(Summary Task)の除外
`tsk.Summary` が `True` の場合、それは親タスク(子タスクをまとめる見出しのようなもの)です。要約タスク自体には直接リソースを割り当てない(割り当てても実体を伴わない)ため、明外に弾くロジックを入れることで、無駄なエラーや意図しない挙動を防ぎます。
③ 画面描画の停止 (`ScreenUpdating`)
百〜千行を超える大規模なプロジェクトファイルでこれをやると、画面がパチパチと点滅し、処理が極端に遅くなります。`Application.ScreenUpdating = False` で裏側だけで処理を完結させ、最後に `True` に戻すテクニックは、Project VBAでも必須の作法です。
—
5. 陥りやすい罠とエラー回避のコツ
罠:「タスクの優先度」を変えたつもりなのに、平準化がうまく動かない!
> 【原因】
> UI上からタスクの「優先度」列を変更すると、タスク自体のPriorityが変わりますが、リソース平準化が参照するのはあくまで「割り当て(Assignment)のPriority」です。タスク側の優先度だけを変えても、割り当て側の優先度がデフォルトのままでは平準化エンジンは無視します。
>
> 【解決策】
> 今回のコードのように、必ず `tsk.Assignments` のループを回して、`asn.Priority` を直接操作してください。ここが今回の記事の最大の核心です!
—
おわりに
お疲れ様でした!
今回は、リソース割り当ての「優先度」を自動制御するロジックを通じて、Project VBAのオブジェクト構造の深部を解説しました。
「タスク」と「リソース」の間に存在する「割り当て(Assignment)」という隠れた主役をコントロールできるようになれば、あなたはもう単なるマクロの記録者ではありません。プロジェクトのスケジュールとリソースを意のままに操る、本物の自動化エンジニアです。
現場の複雑なスケジュール管理に、ぜひこのコードを取り入れてみてください。
「ここをこう改造したいんだけど…」といった疑問があれば、いつでも先輩エンジニアに聞いてくださいね。あなたのVBAライフを心から応援しています!
