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

スポンサーリンク

【実務中級】Taskの「Text1〜30」フィールドを活用した外部システムとのデータマッピング戦略

MS Projectを単なる「ガントチャートのお絵描きツール」として使っているうちは、業務自動化の恩恵の1割も受けていない。真のシニアエンジニアやシステム管理者にとって、MS Projectとは「リソースとスケジュールを管理する分散データベース」に他ならない。

基幹システム(ERP)や進捗管理DB(SQL Server / PostgreSQL等)とMS Projectを完全に同期させ、双方向のデータ整合性を担保するためには、Taskオブジェクトが持つ拡張フィールド(`Text1` 〜 `Text30`、および `Number1` 〜 `Number20` 等)を如何に戦略的にルーティングするか――これが成否の9割を握る。

今回は、VBAのオブジェクトモデルの深層と、外部システム連携における致命的な罠を回避するための「極限の知見」を共有する。

1. 外部連携における「Text1〜30」のアーキテクチャ設計

MS Projectのカスタムテキストフィールド(`Text1` 〜 `Text30`)は、外部システムとのマッピングにおいて「複合主キー(Composite Key)」または「外部キー(Foreign Key)」の格納庫として機能させる。

安易に「タスク名」をキーにして外部システムと突き合わせる設計は、現場の担当者がタスク名を勝手に変更した瞬間にシステムが破綻するため、絶対に避けるべきアンチパターンである。

推奨されるマッピング構造の例

  • `Text1`: 外部システムのユニークID(UUID または 連携先タスクコード)
  • `Text2`: 連携ステータス(`Synced`, `Modified_Local`, `Error`)
  • `Text3`: 最終同期タイムスタンプ(`YYYY-MM-DD HH:MM:SS`)
  • `Text4` 〜 `Text10`: 外部マスタの属性データ(コストセンター、外注先コード等)

ここで重要なのは、VBAからこれらのフィールドを操作する際、UIの再描画コストとメモリリークの対策を怠ると、数千行規模の大規模工程表でVBAがフリーズ、あるいはExcel等へのデータ流出・破損を引き起こす点にある。

2. VBA実装:高速同期とオブジェクトライフサイクルの管理

MS Project VBAにおいて、最大のパフォーマンスキラーは「不要な画面描画(ScreenUpdating)」と「不適切なオブジェクト参照の解放漏れ」である。

以下のコードは、外部DB(またはCSV/JSON)からのデータを想定し、`Text1`(外部ID)をキーにしてProject側のTaskを特定・更新、または新規作成する実務レベルの同期エンジンの骨子である。

Option Explicit

‘ ==============================================================================
‘ 外部システム連携:Task同期エンジン
‘ Architect Note: 画面描画の抑制とオブジェクトの明示的解放によるメモリ最適化
‘ ==============================================================================
Sub SyncTasksFromExternalSystem()
Dim prj As Project
Set prj = ActiveProject

‘ 1. パフォーマンス劇的改善のための環境設定
Dim oldScreenUpdating As Boolean
oldScreenUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False

On Error GoTo ErrorHandler

Dim tsk As Task
Dim targetTask As Task
Dim externalID As String
Dim isFound As Boolean

‘ 【模擬データ】外部システムから取得したと仮定するデータ
‘ 本来はADODB.ConnectionやWinINet/WinHttpを用いたAPI通信に置き換える
externalID = “EXT-TASK-001”

isFound = False

‘ 2. Text1 (外部ID格納フィールド) を走査して既存タスクを検索
‘ ※Find機能は遅いため、コレクションを直接イテレートするかDictionaryを使用する
For Each tsk In prj.Tasks
If Not tsk Is Nothing Then
‘ カスタムフィールドへのアクセスは必ず .Text(N) プロパティを使用する
If tsk.Text1 = externalID Then
Set targetTask = tsk
isFound = True
Exit For
End If
End If
Next tsk

‘ 3. データの更新または新規作成
If isFound Then
‘ — 既存タスクの更新 —
targetTask.Name = “[Sync] 要件定義完了”
targetTask.Start = #4/1/2026 8:00:00 AM#
targetTask.Duration = “5d”
targetTask.Text2 = “Synced”
targetTask.Text3 = Format(Now, “yyyy-mm-dd hh:nn:ss”)

Debug.Print “Updated Task ID: ” & targetTask.ID & ” (UID: ” & targetTask.UniqueID & “)”
Else
‘ — 新規タスクの作成 —
Set targetTask = prj.Tasks.Add(“[Sync] 要件定義完了”)
targetTask.Start = #4/1/2026 8:00:00 AM#
targetTask.Duration = “5d”

‘ カスタムフィールドへの書き込み
targetTask.Text1 = externalID
targetTask.Text2 = “Created_By_Sync”
targetTask.Text3 = Format(Now, “yyyy-mm-dd hh:nn:ss”)

Debug.Print “Created New Task. UID: ” & targetTask.UniqueID
End If

CleanUp:
‘ 4. オブジェクト参照の明示的解放 (Memory Optimization)
‘ VBAのガベージコレクションに依存せず、ローカル変数・オブジェクトを即座に破棄
Set targetTask = Nothing
Set tsk = Nothing
Set prj = Nothing

‘ 画面描画の復元
Application.ScreenUpdating = oldScreenUpdating
Exit Sub

ErrorHandler:
MsgBox “同期処理中に致命的なエラーが発生しました: ” & Err.Description, vbCritical, “System Error”
Resume CleanUp
End Sub

3. シニアエンジニアが知るべき「見落としがちな罠」と対策

罠A: `Task.TextN` と `Task.GetField / SetField` のパフォーマンス差

MS Projectのオブジェクトモデルにおいて、`Task.Text1 = “Value”` と書くのは簡便だが、内部的にフィールドIDへのマッピングが発生する。
数万回のループを回すような大規模バッチ処理では、フィールドConstant(例: `pjTaskText1`)を用いた `SetField` メソッドを使用する方が、内部オーバーヘッドを削減できる場合がある。しかし、可読性とのトレードオフになるため、数千件程度であれば直感的なプロパティアクセスで十分である。

罠B: ローカライズ(言語設定)によるカスタムフィールド名の乖離

MS Projectの厄介な仕様として、日本語版と英語版、あるいは組織内のカスタマイズによって、フィールドの「表示名(FieldName)」が動的に変わる点がある。
UI上で `Text1` が「外部ID」とリネームされていたとしても、VBAコード内からは必ず `Text1` (またはインデックス参照) でアクセスしなければならない
ユーザーが勝手にフィールド名を変更してもコードが耐えられるよう、マニュアルや設計書で「Text1はシステム連携専用とし、表示名の変更を禁止する」旨をガバナンスとして定めておくことが実務上極めて重要である。

罠C: 排他制御(ファイルロック)

複数ユーザーがサーバー上の `.mpp` ファイルを同時に開いている環境でVBAから書き込みを行うと、競合が発生しデータが破損する。
外部システム連携を自動化する背景には「バックグラウンドでのサイレント実行」が求められることが多いが、MS Projectの性質上、バックグラウンドインスタンス(`New Application`)でエンタープライズ環境(Project Server / Project Online)やローカルファイルを操作する際のセッション管理は、APIのタイムアウトやライセンス認証の壁に阻まれることが多い。
これを突破するには、ローカルキャッシュ層を挟んだJSONベースの中継アーキテクチャを採用するのが現代の定石である。

総括

MS Projectの `Text1` 〜 `Text30` は、単なるメモ欄ではない。それはレガシーな工程表管理ツールを、モダンなエンタープライズ・システムの一部へと昇華させるための「最強のインターフェース・パイプライン」である。

オブジェクトのライフサイクルを完全に制御し、不要な描画コストを削ぎ落としたVBAコードこそが、組織全体のスケジュールガバナンスを支える基盤となる。退屈な手作業の同期はコードで駆逐し、エンジニアとしての真価をアーキテクチャの構築に注いでほしい。

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