プロジェクト管理の「地雷」を回避せよ:VBAでリソース割り当てを安全に削除する極意
こんにちは。プロジェクトの現場で日々VBAと格闘している皆さん、お疲れ様です。
マクロの記録で操作を自動化することから一歩進み、プログラムの裏側にある「オブジェクトのライフサイクル」を意識し始めた時、皆さんは必ず一度、ある壁にぶつかります。それは、「実績(Actuals)が入力済みのタスクから、リソースを削除する際の整合性問題」です。
「リソースを外すだけなのに、なぜか全体の工数が狂う」「エラーでVBAが止まる」。これらは、Projectのデータモデルが持つ「歴史的整合性」を無視した時に起こる、いわば現場の地雷です。今日は、この地雷を華麗に回避し、安全にリソースを削除するためのプロフェッショナルな作法を伝授します。
—
1. なぜ「削除」でエラーが起きるのか?
Project VBAにおいて、`Assignment`(割り当て)オブジェクトは単なるリンクではありません。そこには、そのリソースが「いつ」「どれだけの工数」を費やしたかという実績値が紐付いています。
安易に `Assignment.Delete` を実行すると、Projectは「今までそのリソースが積んできた実績の行き場」を失い、計算の整合性を保てずエラーを吐くか、あるいは予期せぬ数値の再配分(バックグラウンドでの自動調整)を引き起こします。
これを防ぐための鉄則は、「実績をクリアしてから削除する」という一連のトランザクションを確実に踏むことです。
—
2. 安全な削除のための「3つのステップ」
コードを書く前に、以下の手順を脳内に刻んでください。
1. 判定: その割り当てに実績工数(`ActualWork`)が存在するかを確認。
2. 初期化: 実績がある場合、その値をゼロにリセットする。
3. 解放: その後、初めて `Delete` メソッドを呼び出す。
実装コード例:安全なリソース削除プロシージャ
以下は、選択中のタスクから指定リソースを安全に取り除くための実用コードです。
Sub SafeRemoveResource(targetTask As Task, resourceName As String)
Dim asn As Assignment
‘ タスク内の全割り当てをループして対象を探す
For Each asn In targetTask.Assignments
If asn.ResourceName = resourceName Then
‘ 【重要】実績工数が存在するか確認
If asn.ActualWork > 0 Then
‘ 実績を一度クリアする(これにより計算の矛盾を防ぐ)
asn.ActualWork = 0
Debug.Print “実績をクリアしました: ” & asn.ResourceName
End If
‘ 実績ゼロを確認してから安全に削除
asn.Delete
Debug.Print “リソースを削除しました: ” & resourceName
Exit Sub ‘ 削除完了後はループを抜ける
End If
Next asn
MsgBox “指定されたリソースは見つかりませんでした。”, vbExclamation
End Sub
—
3. このコードが「プロ仕様」である理由
なぜ単に `.Delete` してはいけないのか。それは、Projectのエンジンが「過去の実績と現在の計画のギャップ」をリアルタイムで再計算し続ける性質を持っているからです。
- `ActualWork = 0` の意義:
これは単なる代入ではありません。Projectに対して「このタスクにおけるこのリソースの存在価値(実績)をゼロにする」という合図を送っています。これを怠ると、Projectは「割り当てが消えたのに実績工数だけ残っている」という不正な状態を検知し、別のリソースに工数を押し付けたり、タスク全体の進捗率を破壊したりします。
- エラーハンドリングの視点:
実際の業務では、`asn.ActualWork` 以外にも `ActualCost` なども考慮すべき場合があります。もし「実績がある場合は削除させない(承認フローを通す)」という要件があれば、上記の `If` 文の中で `MsgBox` を出し、`Exit Sub` で終了させるだけで、現場のルールを強制することも可能です。
—
4. 最後に:マクロの記録から脱却した皆さんへ
皆さんが今書いているその数行のコードは、単に作業を楽にするだけのものではありません。「プロジェクトデータの正確性」を守るための門番です。
Project VBAを扱う際は、「自分が操作しているのは画面上のセルではなく、複雑に絡み合ったリレーショナルデータベースである」という意識を持ってください。今回紹介した「実績のクリア」は、その第一歩です。
ここをマスターすれば、皆さんの自動化ツールは「動けばいいもの」から「信頼できる業務システム」へと進化します。また分からないことがあれば、いつでも聞きに来てくださいね。次回のステップも楽しみにしていますよ!
