泥沼のプロジェクト管理を自動化せよ:Project VBAによる「静的生成」の極意
多くのエンジニアがMicrosoft Project(MSP)の自動化において陥る罠は、GUI操作を模倣するだけの低質なマクロだ。しかし、システム管理の最前線で我々が対峙すべきは、数千行のタスクと複雑な依存関係、そして容赦なくメモリを食い尽くすCOMオブジェクトのライフサイクルである。
今回は、Application.FileNewメソッドを起点とし、単なる「新規作成」を超えた、堅牢なシステム連携の基盤を構築する作法を伝授する。
—
1. COMオブジェクトのライフサイクルとメモリ解放の真実
VBAはガベージコレクションを備えていない。特にMSPのCOMオブジェクトは、明示的に破棄しなければメモリリークの温床となり、特に大規模プロジェクトを扱う際には、Excelとの連携プロセスがバックグラウンドで沈殿し、OS全体を不安定にさせる。
以下のコードは、単に新規ファイルを作成するだけではない。「異常系を検知し、メモリをクリーンに解放する」ための、現場で戦うための実装だ。
Option Explicit
‘ 伝説的なチーフアーキテクトの実装:プロジェクト生成のテンプレート
Public Sub CreateResilientProject()
Dim projApp As MSProject.Application
Dim projDoc As MSProject.Project
‘ プロセスが既に存在する場合はアタッチ、なければ生成
On Error Resume Next
Set projApp = GetObject(, “MSProject.Application”)
If projApp Is Nothing Then
Set projApp = New MSProject.Application
End If
On Error GoTo 0
‘ Application.FileNewを活用した初期化
‘ テンプレートパスを指定しない場合は空のプロジェクトが生成される
projApp.FileNew Template:=””, TemplateProjects:=False
Set projDoc = projApp.ActiveProject
‘ プロパティの初期化:システム間連携を見据えたメタデータ付与
With projDoc
.Title = “Automated_Project_” & Format(Now, “yyyymmdd_hhnnss”)
.ProjectStart = Date
‘ ここでベースライン設定の準備や、カスタムフィールドの動的生成を行う
End With
‘ 【重要】オブジェクトの明示的解放(NULL代入)
‘ 参照カウンタを確実にデクリメントし、メモリを解放させる
Set projDoc = Nothing
Set projApp = Nothing
End Sub
—
2. Windows APIによる「強制終了」の必要性
時として、COM連携は「ゾンビプロセス」を生む。特にMSPがバックグラウンドでハングアップした場合、VBA側で何を試みても回復不能だ。このような極限状態では、Windows APIを叩いてプロセスを「物理的に」掃除する必要がある。
If VBA7 Then
Private Declare PtrSafe Function TerminateProcess Lib “kernel32” (ByVal hProcess As LongPtr, ByVal uExitCode As Long) As Long
Else
Private Declare Function TerminateProcess Lib “kernel32” (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
End If
‘ 現場の知見:ゾンビプロセスを特定し、強制終了させるモジュールは必須である。
‘ 必要に応じてTaskKillコマンドをShell関数で呼ぶよりも、
‘ APIによる直接制御の方がオーバーヘッドが少なく、制御精度が高い。
—
3. レガシー環境とデータ連携の境界線
社内システム管理者が直面する最大の問題は「レガシーなCSVやSQL Serverとの連携」だ。MSPの自動生成を行う際は、「プロジェクトを保存する前に、すべての制約条件を確定させる」ことが鉄則である。
- ベースライン設定の自動化:
`projDoc.SaveBaseline` メソッドを呼び出す前に、必ず `CalculationMode` を `pjManual` に切り替えよ。自動計算が頻繁に走る環境でベースラインを保存すると、巨大なプロジェクトでは処理がスタックするリスクがある。
- 名前付きパイプラインによる連携:
MSPのファイル保存を待つのではなく、生成と同時に必要なタスクデータをメモリ上の配列で保持し、XML形式(MSPDI)でエクスポートする設計を推奨する。これは、データベースとの整合性を維持するための、最も安全な生存戦略だ。
—
終わりに:自動化は「設計」である
「コードが動くこと」は通過点に過ぎない。シニアエンジニアに求められるのは、システムが停止した時、あるいは数万タスクのロードが求められた時に、いかにして「再帰的に回復可能な状態」を維持できるかという設計思想である。
Application.FileNewは単なるコマンドではない。これから始まるプロジェクトの「魂」を吹き込む儀式だ。メモリを食い散らかす不格好なコードは捨て、堅牢かつ洗練されたエンジニアリングを追求してほしい。
諸君、次の自動化の現場で会おう。
