【入門編】リソースの「割り当て」にコメントを付与し、作業指示を自動化する仕組み – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけの日常から一歩抜け出して、「自分の手でプロジェクトを意のままにコントロールしたい」そう思ってこのページを開いてくれたあなたへ。

今回は、現場でめちゃくちゃ役立つ「リソースの割り当てにコメントを付与し、作業指示を自動化する仕組み」を一緒に作っていきます。

「タスクを割り当てたはいいけれど、担当者が『具体的に何をやればいいのか』迷ってしまい、作業漏れや手戻りが発生する……」
プロジェクトマネジメントの現場で、こんな悩みに直面したことはありませんか?

ここをクリアすれば、Project VBAの基本構造や、オブジェクトの裏側の動きがグッと身近になりますよ。温かく、そして本質的なアプローチで解説していくので、リラックスしてついてきてくださいね。

—

1. なぜ「タスク割り当て時の自動コメント化」が必要なのか?

Excelと違って、Microsoft Projectには独自の「三次元データ構造」があります。

  • タスク(Task): 「何をするか」
  • リソース(Resource): 「誰がやるか」
  • 割り当て(Assignment): 「タスクとリソースを結びつける接点」

多くの人が、「タスクにリソースの名前を入れたら終わり」にしてしまいがちです。しかし、実際の現場では「誰が・どのタスクの・どの部分に・どんな注意を払って作業すべきか」という作業指示(コンテキスト)が不可欠です。

これを手動でやろうとすると、タスクが増えた瞬間に破綻します。だからこそ、VBAを使って「リソースを割り当てた瞬間、あるいは一括処理のタイミングで、カスタムテキストフィールドに自動的に作業指示を流し込む」仕組みを作るのです。

—

2. Project VBAの全体像:オブジェクトの階層構造を理解する

コードを書く前に、Project VBAがどのように世界を見ているのか、頭の中に地図を描いておきましょう。

Application (Project本体)
┗ ActiveProject (開いているプロジェクト)
┣ Tasks (タスクのコレクション)
┃ ┗ Task (個々のタスク)
┣ Resources (リソースのコレクション)
┃ ┗ Resource (個々のリソース)
┗ Assignments (割り当てのコレクション ※Task配下にも存在)
┗ Assignment (個々の割り当て)

今回の主役は `Assignment`(割り当て) オブジェクトです。
「どのタスクに、どのリソースが割り当てられているか」という関係性を握っているのがこのオブジェクトであり、ここに作業指示用のカスタムフィールド(Text1〜Text30など)がぶら下がっています。

—

3. 実装コード:作業指示を自動化するマクロ

それでは、実際に現場でそのままコピペして使える実用コードを見ていきましょう。
このコードは、プロジェクト内のすべての「割り当て(Assignment)」をループし、担当しているリソースの種類やタスクの条件に応じて、カスタムフィールド(Text1)に自動で作業指示のコメントを流し込むものです。

Sub AutoAssignInstructions()
‘ 変数の宣言
Dim tsk As Task
Dim asn As Assignment
Dim resName As String

‘ エラーハンドリングの基本(画面描画を停止して高速化)
Application.ScreenUpdating = False

On Error GoTo ErrorHandler

‘ アクティブなプロジェクトの全タスクをループ
For Each tsk In ActiveProject.Tasks
‘ タスクが有効(存在し、概要タスク等ではない)かチェック
If Not tsk Is Nothing Then
If tsk.Null = False And tsk.Summary = False Then

‘ そのタスクに紐づく「割り当て(Assignment)」をループ
For Each asn In tsk.Assignments
‘ 割り当てられたリソースの名前を取得
resName = asn.ResourceName

‘ 【ロジック】リソース名やタスク名に応じた指示内容を分岐させる
Select Case True
‘ 例: リソース名に「シニア」が含まれる場合
Case InStr(resName, “シニア”) > 0
asn.Text1 = “【要レビュー】後輩の指導と成果物の品質チェックを兼務してください。”

‘ 例: タスク名に「テスト」が含まれる場合
Case InStr(tsk.Name, “テスト”) > 0
asn.Text1 = “【重要】バグ発見時は必ずチケット起票と画面キャプチャを添付すること。”

‘ デフォルトの指示
Case Else
asn.Text1 = “通常作業です。進捗に遅れが出る場合は前日までに報告してください。”
End Select

Next asn

End If
End If
Next tsk

‘ 処理終了の通知
Application.ScreenUpdating = True
MsgBox “作業指示の自動設定が完了しました!”, vbInformation, “成功”
Exit Sub

ErrorHandler:
‘ エラー時の安全装置
Application.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

—

4. コードの深掘り解説:ここがポイント!

初心者から一歩抜け出すために、このコードの重要なポイントを3つ解説します。

① `For Each asn In tsk.Assignments` の重み

タスクの数だけループを回し、さらにその中にある「割り当て(Assignments)」を回しています。Project VBAでは、この「親子関係(Task -> Assignment)」を正確に辿ることがすべての基本です。ここを間違えると、リソースに紐づかない余計なデータを触ってしまい、ランタイムエラーを引き起こします。

② `Application.ScreenUpdating = False` による爆速化

Projectは、タスクや割り当てのデータを変更するたびに画面のガントチャートを再描画しようとします。タスクが数百件ある場合、これが原因でマクロがフリーズしたかのように遅くなります。
処理の最初に画面更新を止め、最後に `True` に戻す。これがプロのエンジニアの作法です。

③ カスタムフィールド(`Text1`)の活用

Projectには、ユーザーが自由に使えるカスタムフィールド(Text1〜30、Cost1〜10など)が用意されています。今回はここに文字データを流し込みました。これをプロジェクトのガントチャートビューに列として追加しておけば、メンバー全員が「自分の作業で何を注意すべきか」が一目でわかるようになります。

—

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

Project VBAを書き始めると、必ずと言っていいほど次のような壁にぶつかります。

  • 罠1: 「オブジェクトが必要です」エラー(Error 424)
  • 原因: `For Each tsk In ActiveProject.Tasks` を回す際、削除されたタスクの残骸や、空白行(Nothing)をそのまま触ろうとしたときに起きます。
  • 対策: コード内に入れた `If Not tsk Is Nothing Then` のような「空チェック」を必ず挟む癖をつけましょう。
  • 罠2: サマリータスク(要約タスク)への誤爆
  • 原因: プロジェクト全体をまとめる親タスク(サマリータスク)にも、リソースが割り当てられることがあります(親リソースの工数集約など)。しかし、通常ここに個別の作業指示を出しても意味がありません。
  • 対策: `If tsk.Summary = False` という条件を入れて、末端の作業タスク(リーフタスク)だけに処理を限定するのが実務的です。

—

6. おわりに

お疲れ様でした!
今回は「リソースの割り当てにコメントを付与し、作業指示を自動化する仕組み」を通じて、Project VBAのオブジェクト構造、ループ処理、そして実務で使えるエラー回避の知見を解説しました。

「マクロの記録」では絶対にたどり着けない、オブジェクトを意のままに操る感覚が少し掴めたのではないでしょうか?

ここをクリアできれば、あなたのプロジェクト管理の自動化スキルは間違いなく一段階上にレベルアップしています。ぜひ自分の環境でコードを動かし、カスタマイズしてみてくださいね。
それでは、快適なVBAライフを!

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