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

スポンサーリンク

ようこそ、Microsoft Project VBAの深淵なる世界へ。
私は、数多の巨大プロジェクトをコードの力で統治してきたチーフアーキテクトです。

「マクロの記録」を卒業し、自分の手でロジックを組み上げたいと願うあなたの情熱、素晴らしいですね。Project VBAはExcel VBAと似て非なるもの。特有の「オブジェクト構造」さえ掴んでしまえば、スケジュール管理の自動化という、現場で最も重宝される武器を手にすることができます。

今回は、リソース管理の要である「Resource.Notes(備考)」フィールドを駆使して、各担当者への「作業指示書」を自動生成し、さらにメール通知の土台を作る仕組みを伝授しましょう。

ここをクリアすれば、Project VBAの基本はバッチリですよ。さあ、一歩先のエンジニアへと歩みを進めましょう。

—

1. なぜ「Notes」フィールドなのか?

Projectにおける「リソース」は、単なる名前の羅列ではありません。コスト、稼働時間、そして「誰が何をすべきか」という情報の集積地点です。

通常、タスクの詳細は「タスク」側に書きますが、作業者は「結局、自分は何をいつまでにやればいいの?」という視点でプロジェクトを見ます。そこで、VBAを使って「タスクの情報」を「リソースの備考欄(Notes)」に集約してあげるのです。

これができるようになると、リソースシートを印刷するだけで、そのまま個別の指示書として機能します。

—

2. Project VBAの心臓部:「割り当て(Assignment)」を理解する

コードを書く前に、これだけは覚えてください。
Project VBAには、Excelにはない「Assignment(割り当て)」という非常に重要な概念があります。

  • Task(タスク): やるべき事
  • Resource(リソース): やる人
  • Assignment(割り当て): 「誰」が「何を」やるかという繋ぎ役

今回のマクロでは、「リソース」から出発して、その人に紐づく「割り当て」を全走査するというアプローチを取ります。

—

3. 実践コード:作業指示書の自動生成

以下のコードは、プロジェクト内の全リソースをチェックし、その人が担当しているタスクの名前と期間を、リソースの「備考」欄に美しく書き込むものです。

Sub GenerateResourceInstructions()
‘ ———————————————————
‘ 目的: 各リソースの備考欄に担当タスクのサマリーを自動入力する
‘ ———————————————————
Dim rs As Resource
Dim asgn As Assignment
Dim msg As String

‘ プロジェクト内の全リソースをループする
For Each rs In ActiveProject.Resources

‘ リソース名が空(未割り当て行)の場合はスキップ
If Not rs Is Nothing Then
If rs.Name <> “” Then

‘ 指示書のヘッダーを作成
msg = “【自動生成:担当作業指示書】” & vbCrLf
msg = msg & “更新日: ” & Format(Date, “yyyy/mm/dd”) & vbCrLf & String(30, “-“) & vbCrLf

‘ そのリソースに割り当てられた全タスク(Assignment)をループ
If rs.Assignments.Count > 0 Then
For Each asgn In rs.Assignments
‘ タスク名、開始日、終了日を整形して追加
msg = msg & “・タスク: ” & asgn.TaskName & vbCrLf
msg = msg & ” 期間: ” & Format(asgn.Start, “mm/dd”) & ” ~ ” & Format(asgn.Finish, “mm/dd”) & vbCrLf
msg = msg & ” 進捗率: ” & asgn.PercentWorkComplete & “%” & vbCrLf
msg = msg & String(20, “-“) & vbCrLf
Next asgn
Else
msg = msg & “現在、割り当てられているタスクはありません。”
End If

‘ 最後に、リソースのNotesプロパティに流し込む
‘ これがProject上の「備考」欄に反映されます
rs.Notes = msg

‘ デバッグ用:イミディエイトウィンドウに出力(Ctrl+Gで確認可能)
Debug.Print rs.Name & ” の備考を更新しました。”
End If
End If
Next rs

MsgBox “全リソースの作業指示書を備考欄に生成しました!”, vbInformation, “完了”
End Sub

—

4. コードの解説と「初心者が陥りやすい罠」

① `For Each rs In ActiveProject.Resources`

これは「プロジェクトに登録されている人を一人ずつ呼び出す」魔法の言葉です。
罠: Projectには「空の行」もリソースとして存在することがあります。`If rs.Name <> “”` で名前があるかどうかを確認するのは、エラーを避けるためのプロの作法です。

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

初心者は「タスク」から人を探そうとしますが、それは非効率です。「リソースに紐づくアサインメント(rs.Assignments)」を直接見に行くことで、コードは劇的にシンプルになります。

③ `Notes` フィールドの特性

`rs.Notes` は文字列を保持できますが、あまりに長すぎると視認性が落ちます。適度に `vbCrLf`(改行)や `String(30, “-“)`(区切り線)を入れて、人間が読みやすい形に整えるのが「現場のエンジニア」の優しさです。

—

5. 発展編:メール送信へのステップアップ

備考欄に情報を集約できたら、次はそれをメールで飛ばしたくなりますよね。
Outlookを操作する基本構造も少しだけお見せしましょう。

‘ ※参照設定で Microsoft Outlook Object Library を有効にするとスムーズです
Sub NotifyResourceByEmail(rs As Resource)
Dim OutlookApp As Object
Dim MailItem As Object

Set OutlookApp = CreateObject(“Outlook.Application”)
Set MailItem = OutlookApp.CreateItem(0) ‘ 0 = olMailItem

With MailItem
.To = rs.EMailAddress ‘ リソース情報の「メールアドレス」欄を使用
.Subject = “【要確認】今週の作業指示書:” & rs.Name
.Body = rs.Notes ‘ 先ほど生成したNotesをそのまま本文に!
‘.Send ‘ 実際に送る場合はコメントアウトを外す
.Display ‘ まずは画面表示で確認
End With
End Sub

これを先ほどのループの中で呼び出せば、ボタン一つで全メンバーに個別指示書が届く「完全自動化」の完成です。

—

6. 最後に:Project VBAをマスターするコツ

Project VBAは、データ(期間やコスト)と人間(リソース)の架け橋です。

最初は `Debug.Print` を使って、今自分がどのリソースを処理しているのか、イミディエイトウィンドウに表示させることから始めてみてください。画面上でデータが動く瞬間を体験すれば、もうマクロの記録には戻れなくなるはずです。

「このコードで、現場の誰が幸せになるか?」

この視点を持つあなたのツールは、どんな高価なアドインよりも価値があります。
もしエラーで行き詰まったら、オブジェクトの繋がり(Resource -> Assignment -> Task)を紙に書いて整理してみてくださいね。

あなたはもう、立派なProjectアーキテクトへの第一歩を踏み出しています。
応援していますよ!

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