こんにちは!プロジェクト管理の現場で、日々奮闘されていることと思います。
「複数のプロジェクトで同じリソース(人や機材)を使っているのに、それぞれのファイルでバラバラに管理していて、負荷の調整が追いつかない……」
そんな悩みを抱えたことはありませんか?
MS Projectには、複数のプロジェクトでリソース情報を一元管理するための「リソースプール」という強力な仕組みがあります。今回は、このリソースプールとのリンク・更新・切断を、VBAを使ってスマートに自動化・効率化する方法を解説します。
ここをクリアすれば、Project VBAの基本とリソース管理の本質はバッチリですよ!一緒にマスターしていきましょう。
—
1. なぜ「リソースプール」をVBAで管理するのか?
大規模なプロジェクトや複数案件を並行して進める際、すべてのプロジェクトファイル(サブプロジェクト)に同じリソースを登録するのは、メンテナンスの悪夢です。Aさんの休暇や単価変更があった場合、すべてのファイルを修正しなければなりません。
これを解決するのが「共有リソースプール」です。
- リソースプールファイル:人やコストの情報だけを持つ親ファイル。
- 共有ファイル(サブプロジェクト):スケジュールだけを持ち、リソースはプールを参照する子ファイル。
これを手動で設定しようとすると、ファイルを開いて、リンク先を指定して……と手順が多く、ミスも起きやすくなります。VBAを使えば、この一連の動きを「一瞬で・確実に」行うことができます。
—
2. Project VBAの基本と「ファイルを開く」際の注意点
まず前提として、Project VBAではExcelのように「バックグラウンドでこっそりファイルを開いて処理する」ということが少し特殊です。他のプロジェクトファイルを参照・操作するには、`FileOpenEx`メソッドなどを使って明示的にアプリケーション上に読み込む必要があります。
また、リソースプールを扱う際は、「誰が親で、誰が子か」の主従関係を意識することが極めて重要です。
—
3. 実践!リソースプールのリンク・更新・切断コード
それでは、現場でそのまま使える実用的なVBAコードをご紹介します。
今回は、アクティブになっているサブプロジェクトに対し、指定したリソースプールファイルを安全にリンクさせるプロシージャです。
サンプルコード:リソースプールの自動リンク
Sub ConnectToResourcePool()
‘ =====================================================================
‘ テーマ:アクティブなプロジェクトにリソースプールを安全にリンクする
‘ 解説者:あなたの専属チーフアーキテクト
‘ =====================================================================
Dim poolPath As String
Dim currentActiveName As String
‘ 1. リソースプールのファイルパスを指定(環境に合わせて書き換えてください)
poolPath = “C:\ProjectData\ResourcePool.mpp”
‘ 現在作業中のプロジェクト名を取得(確認用)
currentActiveName = ActiveProject.Name
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ 2. プールファイルがすでに開いているか確認し、なければ読み取り専用で開く
‘ ※リソースプールは複数から参照されるため「読み取り専用(ReadOnly:=True)」が鉄則です
Dim isPoolOpen As Boolean
isPoolOpen = False
Dim p As Project
For Each p In Application.Projects
If p.FullName = poolPath Then
isPoolOpen = True
Exit For
End If
Next p
If Not isPoolOpen Then
‘ ファイルを開く(バックグラウンド=ReadOnlyで安全に)
FileOpenEx Name:=poolPath, ReadOnly:=True
End If
‘ 3. アクティブなプロジェクトに対してリソースプールを割り当てる
‘ pjPoolReadOnly: プール側を勝手に書き換えないための安全策
ResourcePool:=pjPoolReadOnly, _
PoolName:=poolPath
‘ 4. 変更を保存して完了
MsgBox “プロジェクト「” & currentActiveName & “」をリソースプールに正常にリンクしました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
‘ 万が一エラーが起きた場合の優しいたましー(ケア)
MsgBox “エラーが発生しました。パスが正しいか確認してください。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
コードのここがポイント!
1. `ReadOnly:=True` の徹底
リソースプールは複数のプロジェクトの命綱です。子ファイル側からプールを誤って上書き保存してしまう事故を防ぐため、VBAから開く際も必ず読み取り専用を指定するのがプロの作法です。
2. `ResourcePool` メソッドの引数
Projectオブジェクトが持つこのメソッドにより、瞬時に「このファイルはあのプールを見るんだよ」と紐付けることができます。
—
4. 現場で陥りやすい「罠」とエラー対策
初心者の頃、私もここでよくつまずきました。皆さんが同じ罠にハマらないよう、事前に共有しておきますね。
罠1:「ファイルが見つからない」エラー(実行時エラー 1100)
- 原因:`poolPath` に指定したパスのスペルミス、またはネットワークドライブの接続切れ。
- 対策:コードを実行する前に、`Dir(poolPath) = “”` を使ってファイルが本当に存在するかチェックするロジックを挟むと、ロボットのように頑健なマクロになります。
罠2:すでにリンクされているのに再度リンクしようとした
- 原因:二重にリンク情報を書き込もうとしてProjectが混乱します。
- 対策:リンク処理を行う前に、現在のプロジェクトがすでにプールを使用していないか確認するか、一度「切断(アンリンク)」処理を挟むアプローチが有効です。
—
5. 発展:リソースプールの「切断」と更新
もしプロジェクトが完了し、リソースプールとの関係を解消したい(独立させたい)場合は、以下のようにシンプルなコードで切断できます。
Sub DisconnectFromResourcePool()
‘ アクティブプロジェクトのリソースプールリンクを解除する
On Error GoTo ErrorHandler
‘ プールを使用しない設定にする
ResourcePool:=pjDoNotShareResources
MsgBox “リソースプールとのリンクを安全に切断しました。”, vbInformation, “切断完了”
Exit Sub
ErrorHandler:
MsgBox “切断処理に失敗しました: ” & Err.Description, vbCritical
End Sub
—
おわりに
今回は、Project VBAを用いた「リソースプール」の効率的な管理手法について解説しました。
リソースプールとVBAを組み合わせることで、手作業によるヒューマンエラーを根絶し、組織全体の稼働率調整を劇的にスピーディーに行うことができるようになります。
「コードが少し難しそう…」と感じた方も、まずはコピペしてパスをご自身の環境に変えるところから試してみてください。
ここをクリアできれば、あなたのProject VBAスキルは確実に次のステージへと進んでいますよ。応援しています!
