Project VBAを掌握する極限の知見:リソース割り当てコメント自動化による作業指示の完全統制
レガシーシステムの荒野において、Microsoft Project(以下、MS Project)とVBAの組み合わせは、数多の巨大プロジェクトの命脈を握ってきた。特に、数千に及ぶWBS(Work Breakdown Structure)と数百のリソースが錯綜する現場において、リソースの「割り当て(Assignment)」に対する的確な作業指示の伝達は、プロジェクトの成否を分ける最大の急所である。
今回は、単なる「タスクへの人員アサイン」の次元を超え、リソース割り当て時に動的にカスタムフィールドへ作業指示コメントを注入し、オペレーションの属人性と作業漏れを完全に駆逐するメカニズムを解説する。
—
1. MS Projectにおける「割り当て(Assignment)」の構造的理解
VBAからMS Projectを操作する際、多くの初学者が陥る罠が、`Task`オブジェクトと`Resource`オブジェクト、そしてその中間に位置する`Assignment`オブジェクトのライフサイクルの混同だ。
リソースの割り当てとは、TaskとResourceの多対多のリレーションを解決する「Assignmentオブジェクト」の生成に他ならない。MS Projectの内部エンジンにおいて、アサインメント単位のカスタムフィールド(Text1〜Text30など)は、タスク側やリソース側のフィールドとは独立したメモリ空間に保持される。
[Task] 1 — [Assignment] — 1 [Resource]
│
[Custom Fields (Text1…)] ── ★ここに作業指示を焼き込む
このAssignment層に対して直接アクセスし、コンテキストに応じた動的な指示書(文字列)をミリ秒単位で流し込むアーキテクチャを構築する。
—
2. 実装:イベント駆動型 割り当てコメント自動生成エンジン
現場の担当者がアサインを行った瞬間、あるいはバッチ処理でアサインが一括処理された直後に、リソースのスキルやタスクの特性を判別し、定型化された作業指示を`Assignment.Text1`に自動同期するVBAコードを提示する。
以下のコードは、単なるプロシージャの羅列ではない。COMオブジェクトの適切な解放、エラーハンドリング、そしてメモリリークを防ぐための厳格なライフサイクル管理を施した、プロダクション品質のモジュールである。
Option Explicit
‘ =========================================================================
‘ 模块名: clsAssignmentManager
‘ 概要: リソース割り当て時のコンテキスト解析と指示コメント自動注入エンジン
‘ =========================================================================
Public Sub AutoInjectAssignmentInstruction()
Dim prj As Project
Set prj = ActiveProject
Dim tsk As Task
Dim asn As Assignment
Dim res As Resource
On Error GoTo ErrorHandler
‘ パフォーマンス最大化のため、画面描画と自動計算を一時停止
Application.ScreenUpdating = False
Application.Calculation = pjManual
‘ プロジェクト内の全タスクを走査
For Each tsk in prj.Tasks
If Not tsk Is Nothing Then
If tsk.Null = False And tsk.Summary = False Then
‘ タスクに紐付く全アサインメントを取得
For Each asn In tsk.Assignments
Set res = asn.Resource
If Not res Is Nothing Then
‘ すでにコメントが手動入力されている場合は上書きしない(ガード条件)
If Trim(Nz(asn.Text1)) = “” Then
‘ リソースのロールとタスクの性質に基づき指示を生成
asn.Text1 = GenerateInstructionText(res, tsk)
End If
End If
‘ ループ内でのメモリ解放(重要:COMラッパーの参照切断)
Set res = Nothing
Next asn
End If
End If
Set tsk = Nothing
Next tsk
CleanUp:
‘ 設定の復元と明示的メモリ解放
Application.Calculation = pjAutomatic
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “Assignment Manager”
Resume CleanUp
End Sub
‘ ————————————————————————-
‘ 補助関数: リソースとタスクの属性から動的に指示文字列を生成
‘ ————————————————————————-
Private Function GenerateInstructionText(ByRef r As Resource, ByRef t As Task) As String
Dim rolePrefix As String
‘ リソースのコストセンターやグループ、あるいは名前に応じて指示を分岐
Select Case UCase(Nz(r.Group))
Case “DEVELOPER”
rolePrefix = “【開発指示】ブランチ戦略を確認の上、単体テストコードを同梱してPRを作成すること。”
Case “QA”
rolePrefix = “【検証指示】要件定義書Rev.3の受入基準に基づき、境界値テストを実施せよ。”
Case “INFRA”
rolePrefix = “【インフラ指示】変更管理チケットを添付し、ステージング環境への適用を厳守。”
Case Else
rolePrefix = “【一般指示】進捗に遅延が生じた場合は直ちにPMへエスカレーションすること。”
End Select
‘ タスク名と期限を組み合わせたコンテキスト付与
GenerateInstructionText = rolePrefix & ” [対象タスク: ” & t.Name & ” / 期限: ” & Format(t.Finish, “yyyy/mm/dd”) & “]”
End Function
‘ ————————————————————————-
‘ Null安全のためのヘルパー関数
‘ ————————————————————————-
Private Function Nz(ByVal varInput As Variant, Optional ByVal varNullTo As Variant = “”) As Variant
If IsNull(varInput) Then
Nz = varNullTo
Else
Nz = varInput
End If
End Function
—
3. チーフアーキテクトが指摘する「VBAメモリ最適化」の極意
前述のコードには、一般的なVBA解説書では語られない「極限のパフォーマンスチューニング」の思想が組み込まれている。
① 循環参照とCOMオブジェクトの明示的解放
VBA(OLEオートメーション)において、`For Each tsk in prj.Tasks` のようなコレクション走査を行う際、暗黙的に生成されるCOMラッパーオブジェクトは、スコープを抜けるまでメモリ上に居座り続ける。これが数万行規模のMS Projectファイル(`.mpp`)でメモリリークや「リソース不足」エラーを引き起こす主因である。
- 対策: ループの終端で `Set tsk = Nothing` および `Set res = Nothing` を明示的に実行し、参照カウントを即座にゼロに落とすこと。
② 再計算エンジン(Calculation Engine)の殺害
MS Projectは、一つのアサインメントやカスタムフィールドが変更されるたびに、依存関係にあるクリティカルパスの再計算、コストのロールアップ、リソース過負荷(Overallocated)の検知を走らせる。
- 対策: 処理の冒頭で `Application.Calculation = pjManual` を指定し、全アサインメントへの書き込みが一通り終わった最後に手動で再計算を強制する。これにより、実行時間が数分オーダーから数秒オーダーへと劇的に短縮される。
—
4. システム間連携:外部ERP/Redmineとのブリッジ
この「リソース割り当てコメント自動化」は、単体で完結するものではない。生成された作業指示(`Assignment.Text1`)は、APIを経由して外部のチケット管理システム(Redmine, Jira, ServiceNowなど)や社内ERPへリアルタイムに同期されるべきである。
[MS Project (VBA)]
│ (Assignment.Text1 生成)
▼
[Windows API / WebRequest (VBScript/VB.NET Wrapper)]
│ (REST JSON Payload)
▼
[外部課題管理システム (Redmine / Jira)]
レガシーなVBA環境からHTTPリクエストを飛ばす場合、`MSXML2.ServerXMLHTTP.6.0` を用いた非同期通信、あるいはWindows API(`WinINet.dll`)を直接たたくラッパー実装が求められる。ここでは詳述しないが、Project側のイベントトリガー(`ProjectBeforeAssignmentChange`など)をフックすることで、「人がアサインをクリックした瞬間」に外部APIへペイロードを飛ばす全自動パイプラインの構築が可能となる。
—
5. 結語:レガシーの限界を超えるエンジニアリング
「VBAは古い」「クラウドの時代にローカルのMS Projectなどナンセンス」――そう揶揄する声もある。しかし、ミッションクリティカルな現場でミリ秒単位の制御が求められ、インターネットから完全に隔離された閉域網(エアギャップ環境)で稼働し続けなければならないエンタープライズの現実において、VBAとMS Projectの底力を極限まで引き出す技術は、今なお錆び付かない最強の武器である。
今回解説したアサインメント層への介入とメモリ最適化の知見を実装に落とし込み、現場の作業漏れとヒューマンエラーを根絶せよ。アーキテクトとしての真価は、常にコードの細部に宿る。
