こんにちは!プロジェクト管理の現場で、日々「あっちのスケジュールとこっちのスケジュールが連動していなくて更新漏れが起きる…」と頭を悩ませていませんか?
マクロの記録から一歩抜け出して、本格的にProject VBAを使いこなそうとしているあなたへ。今日は、現場のエンジニアなら誰もが一度は直面する、「プロジェクト横断の依存関係(外部ファイル間リンク)」をVBAで完全に自動化する極意を伝授します。
ここをクリアすれば、バラバラに管理された複数プロジェクトの複雑な糸を、プログラム一本で美しく紡ぎ合わせられるようになります。VBAの視界が一気に広がる瞬間ですよ。一緒にマスターしていきましょう!
—
なぜ「外部プロジェクトのリンク」をVBAで自動化するのか?
MS Projectでは、ファイルAのタスクが完了しないと、ファイルBのタスクが始まらない――という「外部先行タスク(External Predecessor)」を設定できます。
通常これをやるときは、GUIでファイルをポチポチ開き、「先行タスク」の欄に `[外部ファイル名]ID` のような文字列を打ち込みます。しかし、これが 「プロジェクトの数が10個、20個と増えたら?」 「フォルダの構成が変わってファイルパスが無効になったら?」……想像するだけで冷汗が出ますよね。
手作業によるリンク設定は、ヒューマンエラーの温床です。だからこそ、ファイルパスの動的解決とリンク生成をVBAに丸投げするのです。
—
まずは基本の心構え:Projectオブジェクトの階層構造
コードを書く前に、MS Projectの頭の中(オブジェクトモデル)を少しだけ覗いてみましょう。
Project VBAの頂点には `Application` があり、その下に `Projects`(開かれているプロジェクトの集まり)がいます。そして、個々のプロジェクトの中には `Tasks`(タスクの集まり)が存在します。
外部タスクをリンクするということは、「別ファイルをバックグラウンド(またはアクティブ)で開いて、自ファイルのタスクからあちらのタスクへ『橋(リンク)』を架ける」という作業に他なりません。
—
実践!外部プロジェクトのタスクを自動リンクするVBAコード
それでは、現場でそのままコピペして使える実用的なコードをお見せします。
今回は、「現在のプロジェクト(後続)」にある特定タスクに対し、「共有フォルダにある別プロジェクト(先行)」のタスクを自動でリンクするシナリオです。
Sub LinkExternalTaskAutomatically()
Dim prjCurrent As Project
Dim tskTarget As Task
Dim externalFilePath As String
Dim externalProjectName As String
Dim externalTaskID As Long
Dim predecessorString As String
‘ 1. 現在アクティブなプロジェクトを取得
Set prjCurrent = ActiveProject
‘ 【重要】エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ 2. 外部プロジェクトのファイルパスとタスク情報を定義
‘ (実際の現場では、セルや外部設定ファイルから動的に読み込むとスマートです)
externalFilePath = “C:\ProjectData\2023_SubProjectB.mpp”
externalProjectName = “2023_SubProjectB.mpp”
externalTaskID = 15 ‘ リンクしたい先行タスクのID
‘ 3. 外部プロジェクトがすでに開いているか確認し、なければ開く(読み取り専用が安全)
Dim isAlreadyOpen As Boolean
isAlreadyOpen = False
Dim p As Project
For Each p In Application.Projects
If p.Name = externalProjectName Then
isAlreadyOpen = True
Exit For
End If
Next p
If Not isAlreadyOpen Then
‘ バックグラウンドに近い形で開く(ReadOnly: True)
FileOpenEx Name:=externalFilePath, ReadOnly:=True, Notify:=False
End If
‘ 4. 自プロジェクト側の「リンク先としたいタスク」を指定
‘ ここでは例として、IDが 10 のタスクを対象にします
Set tskTarget = prjCurrent.Tasks(10)
‘ 5. 外部先行タスクの構文を組み立てる
‘ Projectにおける外部参照の書式は “[ファイル名]タスクID” です
predecessorString = “[” & externalProjectName & “]” & externalTaskID
‘ 6. 先行タスク(Predecessors)プロパティに代入してリンクを確立
‘ すでに他の先行タスクがある場合は “&” で繋ぐなどの配慮が必要ですが、今回はシンプルに代入
tskTarget.Predecessors = predecessorString
MsgBox “外部先行タスクのリンクが正常に完了しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
‘ 必要に応じてファイル閉じる処理などをここに記述
End Sub
—
コードの注目ポイントと「初心者がハマる罠」
上記のコードには、Project VBAを実務で使う上で絶対に外せない重要なポイントが詰まっています。
1. 外部ファイル名の「厳密な一致」が命
コード内の `predecessorString = “[” & externalProjectName & “]” & externalTaskID` に注目してください。
MS Projectが外部タスクを認識するためには、現在開いている(またはリンク先のパスに含まれる)プロジェクトのファイル名と、大文字小文字を含めて完全に一致していなければなりません。「拡張子(.mpp)を書き忘れた!」というミスだけでリンクは容赦なく崩れます。
2. パスの動的解決(ハードコーディングからの脱却)
サンプルコードではパスを直接書いていますが、実務ではフォルダ構造が変わるリスクがあります。例えば、親プロジェクトと同じフォルダにあるサブプロジェクトなら、`ActiveProject.Path & “\SubFolder\SubProject.mpp”` のように、相対パスを基準に動的に文字列を組み立てるのが、プロのエンジニアの作法です。
3. ファイルを開くコストとメモリ管理
外部タスクを参照するためには、原則として先行プロジェクトがメモリ上に読み込まれている必要があります。コード内で `FileOpenEx` を使って開いていますが、多用しすぎるとメモリを圧迫します。処理が終わったら閉じる(`Projects(externalProjectName).Close pjDoNotSave`)といったライフサイクルの管理も、ゆくゆくは意識できるようになりましょう。
—
まとめ:ここをクリアすれば、もう怖くない!
今回解説した「プロジェクト横断の依存関係の自動化」は、単なる便利マクロを超えて、組織全体のスケジュール管理の精度を底上げする強力な武器になります。
- 「別ファイルを開いて、正しいファイル名で文字列を組み立てる」
- 「タスクの `Predecessors` プロパティに代入する」
この2つの原理原則さえ押さえておけば、どんなに複雑なWBSの連携もVBAで自在にコントロール可能です。「マクロの記録」では絶対に作れない、知的な自動化の世界へようこそ。
ここをクリアしたあなたなら、もうProject VBAの基本はバッチリです!自信を持って、日々の業務の自動化に挑んでいってくださいね。それでは、また次の極限知見でお会いしましょう!
