【実務・中級編】Resource.Notesフィールドを活用したリソース別作業指示書の自動生成ツール – Project VBA解析バイブル

スポンサーリンク

はじめに:MS Projectを「単なるガントチャート」で終わらせるな

プロジェクトマネジメントの世界において、Microsoft Project(以下、MS Project)を単なる進捗管理の描画ツールとして使っているなら、君はフェラーリで近所のスーパーに買い物に行っているようなものだ。

MS Projectの本質は、「リソース」「タスク」「コスト」が複雑に絡み合ったリレーショナルデータベースである。特に「リソース(Resource)」オブジェクトは、プロジェクトの心臓部だ。ここを自動化の起点にすることで、現場の作業員への指示出し、稼働率の調整、そしてヒューマンエラーの排除を劇的に加速させることができる。

今回は、リソースの「備考(Notes)」フィールドを単なるメモ帳から「動的な作業指示書」へと昇華させ、VBAを用いて自動生成・通知する仕組みを解説する。これは、私が数々の大規模開発プロジェクトを救ってきた、堅牢で保守性の高い設計思想の断片だ。

—

1. 設計思想:なぜ「Notes」フィールドなのか?

初心者はよく、新しいExcelファイルを作って作業指示書を管理しようとする。それは「情報の二重管理」という地獄への入り口だ。

  • 単一ソースの原則(Single Source of Truth): タスクの期間、担当者、先行関係はすべてProjectファイル内にある。ならば、指示書もそのデータをソースにすべきだ。
  • Notesフィールドの特性: `Resource.Notes` は長文テキスト(RTF形式)を保持できる。ここを「一時的なバッファ」として利用し、リソースに関連付けられた全タスクをサマライズして書き込む。

データの流れ

1. 全リソースを走査する。
2. 各リソースに紐づく「割り当て(Assignment)」を抽出する。
3. タスク名、開始日、終了日、およびタスク側のメモを集約し、文字列を整形する。
4. リソースの `Notes` フィールドを更新し、必要に応じてOutlook経由で配信する。

—

2. 実装:ResourceInstructionGenerator

以下に、プロダクション環境でそのまま通用するレベルのコードを示す。
このコードの肝は、「オブジェクトのライフサイクル管理」と「エラーハンドリング」だ。

Option Explicit

‘ =================================================================
‘ ツール名:Resource Instruction Automator
‘ 概要:リソースのNotesフィールドに割り当てタスクの詳細を自動集約する
‘ 設計者:Legendary Chief Architect
‘ =================================================================

Public Sub GenerateResourceInstructions()
Dim rs As Resource
Dim asgn As Assignment
Dim instructionText As String
Dim taskCount As Integer

‘ パフォーマンス最適化:画面更新を停止
On Error GoTo ErrorHandler
Application.ScreenUpdating = False

Debug.Print “— 自動生成プロセス開始: ” & Now & ” —”

‘ 1. プロジェクト内の全リソースをループ
For Each rs In ActiveProject.Resources
‘ 空のリソース(行)や材料リソースはスキップ
If Not rs Is Nothing And rs.Type = pjResourceTypeWork Then

instructionText = “【自動生成:作業指示書】” & vbCrLf
instructionText = instructionText & “リソース名: ” & rs.Name & vbCrLf
instructionText = instructionText & “出力日時: ” & Now & vbCrLf
instructionText = instructionText & “———————————–” & vbCrLf

taskCount = 0

‘ 2. リソースに割り当てられたタスク(Assignments)を走査
For Each asgn In rs.Assignments
taskCount = taskCount + 1
instructionText = instructionText & “タスク[” & taskCount & “]: ” & asgn.TaskName & vbCrLf
instructionText = instructionText & ” – 期間: ” & Format(asgn.Start, “yyyy/mm/dd”) & ” ~ ” & Format(asgn.Finish, “yyyy/mm/dd”) & vbCrLf

‘ タスク側の備考があればそれも取得
If asgn.Task.Notes <> “” Then
instructionText = instructionText & ” – 注意事項: ” & asgn.Task.Notes & vbCrLf
End If
instructionText = instructionText & vbCrLf
Next asgn

‘ 3. 結果をリソースのNotesに書き込み
If taskCount > 0 Then
rs.Notes = instructionText
Debug.Print rs.Name & ” の指示書を更新しました。”

‘ オプション:メール送信ルーチンを呼び出す(後述)
‘ SendInstructionEmail rs.EMailAddress, “今週の作業指示”, instructionText
Else
rs.Notes = “現在、割り当てられているタスクはありません。”
End If

End If
Next rs

Application.ScreenUpdating = True
MsgBox “全リソースの作業指示書をNotesフィールドに生成しました。”, vbInformation, “完了”
Exit Sub

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

—

3. アーキテクトの視点:なぜこのコードは「堅牢」なのか

① `Assignment` オブジェクトの活用

多くの初心者は `Task` オブジェクトからリソースを探そうとする。それは逆だ。リソース視点のツールを作るなら、`Resource.Assignments` コレクションを回すのが最も効率的だ。これにより、Project内部のインデックスを最小限のコストで参照できる。

② null値とリソースタイプの判定

`If rs.Type = pjResourceTypeWork` を入れている点に注目してほしい。MS Projectには「材料リソース」や「コストリソース」も存在する。これらに作業指示を出すのは論理的におかしい。また、何も入力されていない行(Nothing)への配慮は、実行時エラーを防ぐための鉄則だ。

③ 文字列連結の作法

`instructionText` を段階的に構築している。実務ではここに `Chr(13)` や `vbCrLf` の制御文字が混在することがあるが、MS ProjectのNotesフィールドは内部的にリッチテキストを扱うため、VBAからの流し込み時は `vbCrLf` で整形するのが最も安全で読みやすい。

—

4. 発展:Outlook連携による自動通知

Notesフィールドを更新するだけでは不十分だ。現場に届けてこそ価値がある。
以下の関数を組み込むことで、リソースに登録されたメールアドレスへ即座に送信が可能になる。

‘ ※参照設定に「Microsoft Outlook XX.X Object Library」が必要
Private Sub SendInstructionEmail(recipient As String, subject As String, body As String)
Dim outlookApp As Object
Dim mailItem As Object

On Error Resume Next
Set outlookApp = GetObject(, “Outlook.Application”)
If outlookApp Is Nothing Then
Set outlookApp = CreateObject(“Outlook.Application”)
End If
On Error GoTo 0

If Not recipient Like “@” Then Exit Sub ‘ 簡易的なメアドチェック

Set mailItem = outlookApp.CreateItem(0) ‘ olMailItem
With mailItem
.To = recipient
.Subject = subject
.Body = body
‘.Send ‘ 本番環境ではここを有効化
.Display ‘ 開発中は表示して確認
End With
End Sub

—

5. 注意点と運用の極意

1. Notesの文字数制限: MS ProjectのNotesフィールドは非常に大きいが、無限ではない。数万文字を超えるような巨大な指示を詰め込む設計は避け、詳細な仕様書は別途共有リンク(URL)としてNotesに記載する運用を推奨する。
2. パフォーマンス: リソース数が数百、タスク数が数千を超えるプロジェクトでは、全リソースのループは重くなる。その場合は、`ActiveSelection.Resources`(選択しているリソースのみ)に対して処理を行うように改良せよ。
3. データベース連携: もしリソースのスキル情報や単価が外部DB(SQL Server等)にあるなら、このVBAの中で `ADODB` を使って接続し、Notesに「現在の最新単価に基づく予算警告」を出すといった応用も可能だ。

おわりに

Project VBAは、単なるマクロではない。プロジェクトの「意思決定」を自動化するための武器だ。
今回紹介した `Resource.Notes` の活用は、その入り口に過ぎない。オブジェクトモデルを深く理解し、データの親子関係(Project > Resource > Assignment > Task)を自在に操れるようになれば、君の管理コストはゼロに近づき、プロジェクトの成功率は飛躍的に高まるだろう。

このコードをコピペして満足せず、なぜこのプロパティにアクセスしたのか、その「理由」を常に問い続けてほしい。それが、一流のエンジニアへの唯一の道だ。

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