【入門編】【実務中級】Taskの「Text1〜30」フィールドを活用した外部システムとのデータマッピング戦略 – Project VBA解析バイブル

スポンサーリンク

こんにちは!Microsoft Projectの裏側に潜む複雑なオブジェクトモデルに挑み、日々のプロジェクト管理を自動化しようとしているあなたへ。

マクロの記録ボタンを押して生成されたコードを眺めるだけの日々は、もう終わりです。今日からあなたには、Project VBAの核心に迫る「プロフェッショナルなアーキテクト」としての視点を持っていただきます。

今回のテーマは「Taskの『Text1〜30』フィールドを活用した外部システムとのデータマッピング戦略」です。

Excelや基幹システム、JiraやRedmineといった外部ツールとMS Projectを連携させる時、「タスクをどうやって同一人物(同一データ)だと識別するか」という永遠の課題に直面します。人間が目で見て「あ、これ同じタスクだな」と判断する曖昧なやり方は、自動化の世界ではご法度です。

ここをクリアすれば、あなたも立派なProject VBAの使い手です。さあ、一緒にその極意を紐解いていきましょう!

1. なぜ外部システム連携に「Text1〜30」が必要なのか?

MS Projectには、タスクに対して様々な標準フィールド(名前、開始日、終了日など)が用意されています。しかし、外部のデータベースやAPIと連携する際、「タスク名」や「WBS」をキーにしてデータを更新するのは極めて危険です。

  • 現場の担当者が勝手にタスク名を変更してしまう
  • プロジェクトの進捗に伴いWBSの階層構造が変わる

こうした「人間の揺らぎ」によって、外部システムとの紐付けが簡単に崩壊します。

そこで登場するのが、カスタムテキストフィールドである`Text1` から `Text30` です。ここに外部システムの「一意なID(UUIDや連番など)」を埋め込んでおくことで、タスク名がどう変わろうとも、システム間の「絶対的な絆(マッピング・キー)」を維持できるのです。

2. Project VBAのオブジェクト階層を理解する

コードを書く前に、MS Project特有の「オブジェクトのライフサイクル」を軽く頭に入れておきましょう。

Excel VBAでは `ActiveSheet.Cells…` と直感的にアクセスできますが、Project VBAでは少し階層が深くなります。

Application (アプリ全体)
┗ ActiveProject (現在開いているプロジェクト)
┗ Tasks (タスクのコレクション)
┗ Task (個々のタスク)
┗ Text1, Text2… (カスタムテキストフィールド)

この構造を意識するだけで、エラーの大部分を防ぐことができます。

3. 【実践】外部IDをキーにしたデータマッピングの実装

それでは、実務でそのまま使えるコードを見ていきましょう。
今回は、「外部システムから取得した進捗データを、`Text1`(外部ID)をキーにして探し出し、タスクの完了フラグやメモを更新する」というシナリオを想定しています。

Sub SyncExternalData()
Dim prj As Project
Dim tsk As Task
Dim targetText1 As String
Dim foundFlag As Boolean

‘ 1. アクティブなプロジェクトを取得
Set prj = ActiveProject

‘ 【重要】プロジェクトが空の場合のガード
If prj.Tasks.Count = 0 Then
MsgBox “タスクが存在しません。”, vbExclamation
Exit Sub
End If

‘ — ここから外部システムからデータを受け取ったと仮定 —
‘ (実務ではここでCSV読み込みやAPIリクエストのループを回します)
targetText1 = “EXT-ID-9999” ‘ 外部システムのタスクID
Dim newNotes As String
newNotes = “外部システムからの自動同期:要件定義完了”
‘ ————————————————–

foundFlag = False

‘ 2. Tasksコレクションをイテレート(走査)
For Each tsk In prj.Tasks
‘ 念のためタスクがNothing(空行など)でないかチェック
If Not tsk Is Nothing Then

‘ Text1フィールドの値が外部IDと一致するか比較
If tsk.Text1 = targetText1 Then

‘ 3. マッチしたタスクのデータを更新
tsk.Notes = newNotes

‘ ついでにカスタムフィールド(Text2)に最終更新日を刻印
tsk.Text2 = Format(Now, “yyyy-mm-dd hh:nn:ss”)

foundFlag = True
Exit For ‘ 見つかったらループを抜けてパフォーマンス向上
End If

End If
Next tsk

‘ 4. 結果のフィードバック
If foundFlag Then
MsgBox “外部ID: ” & targetText1 & ” の同期に成功しました!”, vbInformation, “同期完了”
Else
MsgBox “警告: 一致する外部IDが見つかりませんでした。”, vbExclamation, “同期エラー”
End If

End Sub

コードの解説とプロの知見

1. `If Not tsk Is Nothing Then` のお作法
MS Projectの `Tasks` コレクションには、途中に空行や削除されたタスクの残骸が含まれることがあります。これを無視せずにプロパティ(`Text1`など)にアクセスすると、容赦なく「オブジェクト変数が設定されていません」というエラー(実行時エラー 91)が発生します。これを防ぐためのガード節です。
2. `Exit For` によるパフォーマンス最適化
プロジェクト全体のタスクが数千件に及ぶ場合、目的のタスクが見つかった後も最後までループを回し続けるのはCPUの無駄遣いです。見つかった瞬間にループを抜け出す(`Exit For`)のが、大規模案件を扱うエンジニアの嗜みです。

4. 陥りやすい罠とトラブルシューティング

罠そのもの:「フィールド名」と「フィールドIndex」の混乱

VBAからアクセスする場合、UI上で「テキスト1」と表示されているフィールドは、コード上では `Text1` と指定します。しかし、プロジェクトの設定によってはフィールドの名前が変更されている場合があります(例: `Text1` を「外部ID」にリネームするなど)。

  • 対策: VBAからは可能な限り内部名である `Text1` ~ `Text30` で直接指定し、混乱を防ぐためにタスクの `Notes`(備考欄)やメッセージボックスで補足説明を入れるようにしましょう。

最後に:ここをクリアすれば、Project VBAの基本はバッチリですよ!

お疲れ様でした!
カスタムフィールド(Text1〜30)を外部キーに見立ててデータを同期する手法は、デスクトップ版MS Projectを「単なるガントチャートお絵描きツール」から「堅牢なエンタープライズ・ハブ」へと昇格させるための強力な武器です。

この構造さえ理解してしまえば、Excelとの双方向同期も、Web API経由の自動更新も、恐れるに足りません。

あなたの自動化ライフが、より知的で刺激的なものになりますように。
それでは、次の現場でお会いしましょう!

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