【Project VBA極意】リソースプール消失の悪夢を断つ──動的リンク再接続のアーキテクチャ
現場のProjectマネージャー諸君。リソース共有プロジェクトを開くたび、あの「リソースプールが見つかりません」というダイアログに時間を奪われ、手動でパスを叩き直す作業を繰り返してはいないか?
「設定でなんとかなる」と放置しているなら、それはエンジニアとして怠慢だ。MS Projectのリンク構造は非常に脆く、ネットワークドライブのパスが変わるだけで、プロジェクトの整合性は崩壊する。今回は、このダイアログをプログラム的に封殺し、実行時に動的にパスを再構築する「堅牢な接続アーキテクチャ」を授ける。
—
1. なぜ「手動接続」がプロジェクトを腐らせるのか
MS Projectの `FileOpenEx` を安易に使うと、パスが切れた瞬間にVBAの実行は停止し、UIスレッドがダイアログでブロックされる。これが自動化ツールにおける「最大の癌」だ。
我々が目指すべきは「ダイアログを一切出さない」ことだ。
プロジェクトをオープンする前に、対象のリソースプールが「どこに存在すべきか」をロジックで判定し、ファイルが存在しない場合は警告ログを吐いて処理を中断するか、正しいパスへ誘導する。この「事前のパス検証(Pre-flight Check)」こそが、堅牢なシステムの要諦である。
—
2. 実装コード:堅牢な動的リンク再接続の設計
以下のコードは、単にファイルを開くだけではなく、接続先のパスを環境に合わせて動的に解決するプロダクションコードだ。
‘ ———————————————————
‘ プロジェクトファイルを開き、リソースプールを動的に再接続する
‘ ———————————————————
Public Sub OpenProjectWithResourcePool(ByVal projPath As String, ByVal poolPath As String)
Dim projApp As Object
Set projApp = Application
‘ 1. ダイアログの抑制(これが最も重要)
projApp.DisplayAlerts = False
On Error GoTo ErrorHandler
‘ 2. リソースプールの存在確認(ファイルシステムレベルで検証)
If Not FileExists(poolPath) Then
Err.Raise vbObjectError + 1001, “ProjectManager”, “リソースプールが見つかりません: ” & poolPath
End If
‘ 3. ファイルオープン(ReadOnly/ReadWriteは要件に応じて設定)
‘ FileOpenExはProject 2010以降の標準
projApp.FileOpenEx Name:=projPath, _
ReadOnly:=False, _
Merge:=pjMergeNone
‘ 4. リソースプールの明示的な再接続
‘ 既に開いているプロジェクトに対して動的にプールを割り当てる
ActiveProject.ResourcePoolName = poolPath
Debug.Print “Success: リソースプールを接続しました – ” & poolPath
CleanExit:
projApp.DisplayAlerts = True
Exit Sub
ErrorHandler:
MsgBox “致命的なエラー: ” & Err.Description, vbCritical
Resume CleanExit
End Sub
‘ 簡易的なファイル存在チェック関数
Private Function FileExists(ByVal filePath As String) As Boolean
FileExists = (Dir(filePath) <> “”)
End Function
—
3. 現場で生き残るための「3つの絶対鉄則」
コードをコピペして満足してはいけない。開発者が必ず守るべき設計指針を共有する。
① `DisplayAlerts` の制御は「try-finally」構造で
VBAには `try-finally` はないが、`On Error GoTo` を使った `CleanExit` ラベルの実装は必須だ。エラーで止まった瞬間に `DisplayAlerts = False` が放置されると、その後のMS Project操作がすべて見えなくなり、ユーザーは混乱する。必ず終了処理で元に戻せ。
② UNCパスの活用
「Zドライブ」のようなマップされたドライブ名は、ユーザーによって環境が異なる。必ず `\\Server\Share\Project\Pool.mpp` のようなUNCパスを使用すること。 これだけで、ネットワーク接続の問題の8割は解決する。
③ リソースプールの「二重開き」を防ぐ
リソースプールをプログラムから操作する際、既に誰かが開いていると書き込みロックがかかる。`FileOpenEx` を発行する前に、対象ファイルがロックされていないかを `Open #` で試行して確認するアーキテクチャを組むのが、真のプロフェッショナルの仕事だ。
—
最後に:自動化とは「エラーを消す」ことではない
自動化の真髄は、「エラーを予測し、発生した瞬間に適切に制御すること」にある。
MS Projectのリンク機構は確かに古い。だが、その癖を理解し、手懐ければこれほど強力な管理ツールはない。今回の手法をベースに、各プロジェクトの環境変数や構成管理DBと連携させれば、君の業務自動化ツールは「個人のスクリプト」から「組織のインフラ」へと進化するはずだ。
さあ、コードを書いて検証せよ。ダイアログに屈する時間はもう終わりだ。
