【入門編】【実務中級】Taskの「Notes」フィールドへの一括書き込みと、RTF形式の制御によるレポート作成 – Project VBA解析バイブル

スポンサーリンク

こんにちは!ExcelやWordのVBAは触ったことがあるけれど、「Microsoft ProjectのVBA(Project VBA)は、なんだか勝手が違って難しいな……」と感じていませんか?

マクロの記録をそのまま動かそうとしても、Excelとは違うオブジェクトモデルの壁にぶつかり、途方に暮れてしまう方は少なくありません。

でも、大丈夫です。ここをクリアすれば、Project VBAの基本はバッチリですよ!

今回は、実務で絶対に役立つ「TaskのNotes(メモ)フィールドへの一括書き込みと、RTF形式の制御」をテーマに、プロジェクトの進捗報告を自動化する実践的なテクニックを解説します。

1. なぜ「Notes」への書き込みでつまずくのか?

タスクの「メモ(Notes)」欄は、議事録や詳細な申し送り事項を書くのに非常に便利なフィールドです。しかし、VBAからこのNotesを操作しようとすると、多くの人が次のような疑問や壁にぶつかります。

  • 「Excelのセルみたいに `Task.Notes = “文字列”` で入るけど、改行や太字はどうやるの?」
  • 「代入したはずなのに、なぜか文字化けしたり、フォントが崩れたりする……」

実は、MS ProjectのNotesフィールドの内部データは、単なるプレーンテキストではなく、RTF(リッチテキストフォーマット)形式で保持されています。そのため、VBAから大量のタスクへ構造化されたテキストを流し込むには、この「RTFの裏側」を少しだけ知る必要があるのです。

2. Projectオブジェクトモデルの基本とNotesの罠

Project VBAを操る上で、まず押さえておべき階層構造(オブジェクトモデル)は以下の通りです。

Application (Project全体を統括)
└── ActiveProject (現在開いているプロジェクト)
└── Tasks (タスクのコレクション)
└── Task (個別のタスク)
└── Notes (メモプロパティ)

ここで一つ、伝説的アーキテクトからの重要な忠告です。
「Task.Notesプロパティへの代入は、パフォーマンスが非常に重い」という特性があります。

数千件あるタスクに対して、ループの中で毎回 `Task.Notes = …` を実行すると、画面の再描画や内部のRTFパース処理が走り、処理がフリーズしたかのように遅くなります。
実務で使うときは、後述するように「処理中の画面描画を止める(`ScreenUpdating`)」などの最適化が必須となります。

3. 【実践】構造化されたテキストをNotesに流し込むVBAコード

それでは、実際にプロジェクト内の全タスク(または特定の条件に合致するタスク)に対し、進捗報告用のテンプレートをNotesに一括書き込みするコードを見てみましょう。

このコードでは、単なる文字の代入だけでなく、RTFのヘッダーを付与して「見出しを太字にする」といった装飾をプログラム側で制御しています。

Sub WriteStructuredNotesToTasks()
‘ =====================================================================
‘ 目的: タスクのNotesフィールドに構造化されたテキスト(RTF形式)を一括書き込みする
‘ 対象: 全タスク、または特定の条件を満たすタスク
‘ =====================================================================

Dim tsk As Task
Dim rtfHeader As String
Dim rtfFooter As String
Dim bodyText As String
Dim totalTasks As Long
Dim processedCount As Long

‘ 1. パフォーマンス最適化:画面描画と自動再計算を停止
Application.ScreenUpdating False

‘ RTFの基本ヘッダー(ANSIエンコード、デフォルトフォント指定など)
‘ ※ProjectのNotesはRTF形式を解釈するため、最小限のタグで囲みます
rtfHeader = “{\rtf1\ansi\ansicpg932\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset128 MS Pゴシック;}}” & vbCrLf & _
“{\colortbl ;\red0\green0\blue255;}” & vbCrLf & _
“\viewkind4\uc1\pard\f0\fs20 ”

rtfFooter = “}”

processedCount = 0
totalTasks = ActiveProject.Tasks.Count

‘ 2. タスクコレクションを走査
For Each tsk In ActiveProject.Tasks
‘ サマリータスク(見出し行)や空行を除外する場合のガード句
If Not tsk Is Nothing Then
If tsk.Summary = False And tsk.Name <> “” Then

‘ — 構造化されたテキストの組み立て —
‘ \b 0 が太字のオフ、\b 1 が太字のオンを表します
bodyText = “\b [進捗ステータス確認用テンプレート]\b0 \par ” & _
“・タスク名: ” & tsk.Name & ” \par ” & _
“・計画開始日: ” & Format(tsk.Start, “yyyy/mm/dd”) & ” \par ” & _
“・現在の進捗率: ” & tsk.PercentComplete & “% \par ” & _
“\cf1 【特記事項】\cf0 本タスクに関する懸念事項や申し送りをここに記載してください。”

‘ NotesプロパティにRTF文字列を流し込む
tsk.Notes = rtfHeader & bodyText & rtfFooter

processedCount = processedCount + 1
End If
End If
Next tsk

‘ 3. パフォーマンス設定を元に戻す
Application.ScreenUpdating True

‘ 完了メッセージ
MsgBox “処理が完了しました。” & vbCrLf & _
“対象タスク数: ” & processedCount & ” 件”, vbInformation, “一括書き込み完了”

End Sub

4. コードのポイントと実務で役立つ解説

初心者の方や、マクロの記録からステップアップしたい方が「おっ」と思うポイントをいくつか解説します。

① `Application.ScreenUpdating False` の魔法

先ほども触れた通り、ProjectはExcel以上に描画コストが高いアプリケーションです。VBAでタスクを1件ずつ触る処理を行う際、この1行を入れると入れないとでは、実行速度が文字通り「10倍以上」変わります。大量データを扱うプログラミングの鉄則として覚えておきましょう。

② RTF(リッチテキスト)の最小限の構造

MS ProjectのNotesは、プレーンテキストを入れたつもりでも、内部的にはRTFとして保持されます。
コード内の `rtfHeader` にある `\rtf1` や `\par`(改行を意味するRTFコマンド)、`\b`(太字)を組み合わせることで、メモ欄に綺麗にフォーマットされたレポート枠を自動生成できます。
「メモ欄を開いたときに、タイトルだけ太字になっていて見やすい!」といった、ちょっとした気配りが自動化ツールには求められます。

③ `If tsk Is Nothing Then` というお作法

ExcelのVBAにはあまり登場しませんが、Project VBAでは削除されたタスクの跡地などが「Nothing」としてコレクションに残ることがあります。これをそのまま `tsk.Name` などで呼び出すと「オブジェクト変数が設定されていません」という有名なエラーになります。
そのため、`If Not tsk Is Nothing Then` でガードするのがProject VBAの絶対的ルールです。

5. よくあるエラーと回避のチェックリスト

1. 「オブジェクト変数または With ブロック変数が設定されていません」が出る

  • $\rightarrow$ タスクのループ内で `If tsk Is Nothing Then` のガードを入れているか確認してください。

2. 文字化けして「\rtf1…」という文字列がそのまま表示されてしまう

  • $\rightarrow$ Project側がRTFとして正しく解釈できていない、あるいはヘッダーの構文(括弧の閉じ忘れなど)にミスがあります。まずはプレーンテキストに近い形(ヘッダーなし)で代入できるかテストしてみましょう。

3. 処理が異次元のように遅い

  • $\rightarrow$ ループの内外で `Application.ScreenUpdating` が正しく挟まれているか確認してください。

まとめ

今回は、Project VBAにおける「TaskのNotesフィールドへの一括書き込みとRTF制御」について解説しました。

ここをクリアできれば、単なるスケジュール管理ツールとしてのMS Projectが、「自動で美しい進捗レポートを量産する最強のデータベース」に生まれ変わります。ぜひ、あなたの手元のプロジェクトファイルで試してみてくださいね。

ここを突破したあなたなら、もうProject VBAの基礎はバッチリです!次の自動化の扉を、自信を持って叩いていきましょう。

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