Project VBAを掌握せよ:FSOで紐解く「外部依存関係」の可視化戦略
大規模なプロジェクト管理において、`mpp`ファイルが乱立し、どのタスクがどの外部プロジェクトに依存しているか追跡不能になる――。これは「管理の死」を意味します。
多くのエンジニアが陥る罠は、GUI操作で外部リンクをポチポチ確認することです。本稿では、`FileSystemObject (FSO)` と `MS Project Object Library` を駆使し、複数プロジェクトの依存関係を瞬時に掃き出す「堅牢な解析エンジン」の設計思想を伝授します。
—
1. なぜ「力技」ではいけないのか?
多くのVBAコードが「処理落ち」や「メモリリーク」を起こすのは、オブジェクトのライフサイクルを制御していないからです。特にMS Projectのオブジェクトモデルは巨大です。`Application.Projects`を不用意に操作すれば、バックグラウンドで不要なインスタンスが残り、数分でPCがフリーズします。
今回の設計の鉄則は以下の3点です。
1. Applicationの隠蔽: 処理中は `Visible = False` で描画を止め、パフォーマンスを最大化する。
2. 参照の厳密な解放: `Set obj = Nothing` を怠ることは、プロのコードでは許されない。
3. パスの正規化: FSOを利用し、UNCパスとローカルパスの揺らぎを吸収する。
—
2. 実装:外部プロジェクトリンク解析エンジン
このコードは、指定フォルダ内の全 `.mpp` ファイルを走査し、外部タスクへのリンク(`ExternalProject`)を持つタスクを抽出します。
Option Explicit
‘ 参照設定: Microsoft Scripting Runtime / Microsoft Project 16.0 Object Library
Public Sub ExtractExternalDependencies()
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim folderPath As String: folderPath = “C:\ProjectData\” ‘ 対象フォルダ
Dim projApp As Object
Dim targetFile As Object
‘ プロジェクトのインスタンスを生成(Invisibleで高速化)
Set projApp = CreateObject(“MSProject.Application”)
projApp.Visible = False
‘ フォルダ内の全mppを走査
For Each targetFile In fso.GetFolder(folderPath).Files
If LCase(fso.GetExtensionName(targetFile.Path)) = “mpp” Then
Call AnalyzeProjectLinks(projApp, targetFile.Path)
End If
Next
projApp.Quit
Set projApp = Nothing
Set fso = Nothing
End Sub
Private Sub AnalyzeProjectLinks(ByRef app As Object, ByVal filePath As String)
Dim proj As Object
Dim tsk As Task
‘ ReadOnlyで開くのが鉄則。誤編集を防ぐ。
Set proj = app.Projects.Open(filePath, ReadOnly:=True)
Debug.Print “解析対象: ” & proj.Name
For Each tsk In proj.Tasks
‘ 外部タスクかどうかの判定(ExternalTaskプロパティ)
If Not tsk Is Nothing Then
If tsk.ExternalTask Then
‘ 外部リンク情報(ExternalProject)を抽出
Debug.Print ” [依存タスク]: ” & tsk.Name
Debug.Print ” [参照先]: ” & tsk.ExternalProject
End If
End If
Next
proj.Close SaveChanges:=False
Set proj = Nothing
End Sub
—
3. 堅牢な設計のための「プロの技術的勘所」
① ReadOnly モードの強制
外部依存を解析する際、誤ってファイルを保存することは絶対にあってはなりません。`Projects.Open` メソッドの `ReadOnly` パラメータは必ず `True` に設定してください。これが「壊さない開発」の第一歩です。
② パフォーマンスのボトルネック排除
大規模なプロジェクトファイルの場合、タスクの走査は数秒~数分かかります。もし解析対象が数千タスクを超える場合は、`Application.Calculation = pjManual` を一時的に設定し、再計算プロセスをスキップすることで、処理速度を劇的に改善できます。
③ データベース連携の注意点
抽出したリストをExcelやSQL Serverに格納する場合、パスの「文字列変換」に注意してください。
- UNCパス問題: `\\Server\Share\` と `Z:\` が混在すると、リンクが切れていると誤判定されます。FSOの `GetAbsolutePathName` を使い、常に絶対パスへ正規化して比較するロジックを組み込むべきです。
—
4. 最後に:エンジニアへの提言
このツールは単なる「一覧表作成機」ではありません。プロジェクトの複雑性を可視化し、リスクを早期に発見するための「防波堤」です。
VBAは「レガシーな言語」などと揶揄されることもありますが、MS Projectの強力なCOM APIを叩けるのは、依然としてこの環境が最強です。保守性の高いコードを書くということは、「未来の自分が仕様変更に怯えなくて済むように書く」ことと同義です。
まずはこのテンプレートを自身の環境で動かし、プロジェクトの依存関係の「闇」を光の下に晒し出してください。それが、プロジェクト管理におけるあなたの支配力を高める唯一の道です。
