【実務・中級編】【中級者向け】ファイルオープン時にリンクされたリソースプールを自動で再接続するエラー回避策 – Project VBA解析バイブル

スポンサーリンク

【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と連携させれば、君の業務自動化ツールは「個人のスクリプト」から「組織のインフラ」へと進化するはずだ。

さあ、コードを書いて検証せよ。ダイアログに屈する時間はもう終わりだ。

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