こんにちは。業務自動化の世界へようこそ。
Project VBAの深淵へ足を踏み入れたあなたへ、今日は「リソースプール」という、多くのエンジニアが一度は頭を抱える難所に光を当てましょう。
マクロの記録ボタンを押すだけの世界から、一歩先へ。今日は「リンクされたリソースプールが迷子になった時、VBAでいかにしてエレガントに救出するか」という、実戦的な技術を伝授します。
—
なぜ、プロジェクトファイルは「迷子」になるのか?
プロジェクトファイル(.mpp)とリソースプール(.mpp)は、言わば「本体」と「脳」の関係です。通常、ファイルを開く際にProjectは自動でリンクを探しに行きますが、サーバーの移行や共有フォルダのパス変更により、リンクが切れると例の「あのダイアログ」が表示されます。
- 「ファイルが見つかりません」の呪縛: ダイアログが出ると、VBAプログラムはそこで停止し、ユーザーのクリックを待ちます。自動化の敵ですね。
- 根本原因: プロジェクトファイルが持つ「リソースプールのパス情報」が、現在の環境と一致していないためです。
これを解決するには、「ファイルを開く前に、パスを制御する」というアプローチが必要になります。
—
秘伝:リソースプールを「強制再接続」するVBAコード
以下のコードは、ファイルを開く際に発生するダイアログを抑制し、指定したパスへリソースプールを強制的に差し替えるためのテンプレートです。
Sub ConnectResourcePoolDynamically()
‘ プロジェクトの警告ダイアログを一時的に黙らせる
‘ これを忘れると、エラーで処理が止まってしまいます
Application.DisplayAlerts = False
Dim projectPath As String
Dim poolPath As String
‘ 実際のファイルパスに書き換えてください
projectPath = “C:\Projects\MainProject.mpp”
poolPath = “C:\Projects\ResourcePool.mpp”
On Error Resume Next ‘ 予期せぬエラーでクラッシュを防ぐ
‘ プロジェクトを開く
‘ リンク切れを起こす前に、まずは単体で開きます
FileOpenEx Name:=projectPath, ReadOnly:=False
‘ ここでリソースプールを明示的に接続し直します
‘ ResourceSharing メソッドでプールを再指定
ActiveProject.ResourceSharing poolPath
If Err.Number <> 0 Then
MsgBox “リソースプールの接続に失敗しました。” & vbCrLf & “パスを確認してください。”, vbCritical
Else
MsgBox “リソースプールの再接続に成功しました!”, vbInformation
End If
‘ 忘れずにアラートを戻すこと!ここがエンジニアの矜持です
Application.DisplayAlerts = True
On Error GoTo 0
End Sub
—
実戦で役立つ!コードの設計思想とポイント
1. `Application.DisplayAlerts = False` の重み
初心者が最も陥りやすい罠がこれです。Projectは、何か問題があるたびにユーザーに判断を仰ぐ「親切設計」になっています。しかし、自動化においてその親切は「業務の停止」を意味します。「まずは黙らせる、最後に元に戻す」。このサンドイッチ構造を徹底してください。
2. `ResourceSharing` メソッドの魔法
このメソッドを知っているだけで、Project VBAレベルは中級の入り口に立てます。引数にリソースプールのパスを渡すことで、Projectは「あ、これを使えばいいんだな」と再認識します。
3. エラーハンドリングの流儀
`On Error Resume Next` を使うのは「逃げ」ではありません。外部ファイルという「コントロールできない要素」を扱う場合、エラーが発生するのは前提条件です。エラーが起きた後に `If Err.Number <> 0` で判定する。この姿勢こそが、堅牢なシステムを作るための第一歩です。
—
最後に:ここをクリアすれば、あなたはもう脱初心者です
いかがでしたか?「ファイルを開く」という単純な操作一つとっても、バックグラウンドではこれほど多くのハンドリングが行われています。
ここをクリアしたあなたは、もう「マクロの記録」に頼るだけの存在ではありません。「プロジェクトの状態をプログラムで完全に掌握する」という、アーキテクトの視点を持てています。
次にこのコードを改良するなら、ファイルパスをハードコーディングするのではなく、`FileDialog` オブジェクトを使ってユーザーに選ばせる実装に挑戦してみてください。
困ったことがあれば、またいつでも聞きに来てください。あなたの自動化の旅を、全力で応援しています。
