【入門編】FSOを用いて複数のProjectファイルを横断的に検索し、依存関係を可視化する – Project VBA解析バイブル

スポンサーリンク

プロジェクト管理の「見えない糸」を解き明かす:Project VBAで依存関係を可視化せよ

こんにちは。現場で泥臭い自動化を積み重ね、いつしか「Project VBAの魔術師」と呼ばれるようになったエンジニアです。

皆さんは、複数のMS Projectファイル(.mpp)を跨ぐ「タスクの依存関係」に頭を悩ませたことはありませんか?「Aプロジェクトのこのタスクが終わらないと、Bプロジェクトのあのタスクが始まらない」。そんな依存関係が網の目のように広がると、管理画面をポチポチ操作しているだけでは全貌が見えなくなりますよね。

今日は、FSO(FileSystemObject)を使ってフォルダ内の全プロジェクトを総当りし、外部依存関係を抽出・可視化するツールの作り方を伝授します。マクロの記録を卒業し、Projectの「深層」に触れる準備はいいですか?

1. そもそも「外部依存関係」とは何か?

MS Projectにおける依存関係は、`Task.TaskDependencies` オブジェクトに格納されています。
通常、同じファイル内なら「ID:12」のようにリンクしますが、別ファイルを参照している場合は「`<パス>\Project名.mpp\ID:12`」という特殊な形式で保持されます。

この「`<`」から始まるパスを探し出すことこそが、今回の攻略の鍵です。 ---

2. 実装のステップ:FSOで武装する

Excel VBAで書きます。まずはVBE(Alt+F11)を開き、`ツール` > `参照設定` から 「Microsoft Scripting Runtime」 にチェックを入れてください。これがFSOを使うためのパスポートです。

抽出ツールコード(基幹部分)

Sub ExtractExternalDependencies()
Dim fso As New FileSystemObject
Dim folder As folder, file As file
Dim projApp As Object
Dim proj As Project
Dim tsk As Task, dep As TaskDependency
Dim folderPath As String

‘ 1. プロジェクトアプリをバックグラウンドで起動
Set projApp = CreateObject(“MSProject.Application”)
folderPath = “C:\Your\Project\Files\Path\” ‘ 対象フォルダを指定

Set folder = fso.GetFolder(folderPath)

‘ 2. フォルダ内の全ファイルをループ
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = “mpp” Then
Set proj = projApp.Projects.Open(file.Path, ReadOnly:=True)

‘ 3. タスクと依存関係を深掘り
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
For Each dep In tsk.TaskDependencies
‘ 外部リンクは「<」で始まるパスを持つ If Left(dep.FromTask.ProjectName, 1) = "<" Then Debug.Print "対象ファイル: " & proj.Name Debug.Print "タスク: " & tsk.Name & " -> 依存先: ” & dep.FromTask.ProjectName
End If
Next dep
End If
Next tsk
proj.Close SaveChanges:=False
End If
Next file

projApp.Quit
MsgBox “抽出完了!イミディエイトウィンドウを確認してください。”
End Sub

3. ここでつまずく!初心者が陥りやすい3つの罠

① オブジェクトの解放を忘れる

コード内で `CreateObject` した場合、必ず `projApp.Quit` を実行してください。これを忘れると、バックグラウンドに「見えないProject」が溜まり続け、メモリを食いつぶします。最悪の場合、PCが重くなりタスクマネージャーから強制終了する羽目になります。

② `Nothing` の罠

`proj.Tasks` には、時折 `Nothing`(空のタスク枠)が存在することがあります。`For Each tsk In proj.Tasks` の直後に `If Not tsk Is Nothing Then` を入れるのは、伝説的なエンジニアたちの「おまじない」であり、必須の防衛策です。

③ ReadOnlyの重要性

解析するだけのツールなら、必ず `ReadOnly:=True` で開いてください。誤って上書き保存するリスクを物理的にゼロにします。

4. なぜこのコードが強力なのか?

このコードの本質は、「手作業では不可能な広域スキャンを、VBAの高速なオブジェクト走査能力で代行させる」という点にあります。

  • 拡張性: `Debug.Print` の部分を、Excelシートへの書き出し処理に変えれば、そのまま「プロジェクト横断管理台帳」が完成します。
  • 汎用性: パスを変えるだけで、どんな階層構造のプロジェクト群にも対応できます。

最後に:自動化の先にあるもの

このスクリプトをマスターすれば、皆さんは「プロジェクトの全体像が見えない」という悩みから解放されます。データが集まれば、そこから「どのプロジェクトがボトルネックになっているか」を分析することも可能です。

Project VBAは単なる「自動入力ツール」ではありません。プロジェクトという複雑な生命体の「神経系」を操作する、極めて知的なツールなのです。

次は、このデータを元に、依存関係を視覚的にグラフ化する「ネットワーク図自動生成」に挑戦してみませんか?ここをクリアすれば、あなたはもう立派な自動化エンジニアです。

現場からは以上です。コードに関する質問があれば、いつでも聞かせてくださいね!

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