プロジェクトを破壊しないために。Project VBA「リソース割り当て解除」の極意
こんにちは。現場の最前線でコードと格闘し、数多のプロジェクトの混乱を収束させてきたエンジニアです。
皆さんが今取り組んでいる「Project VBA(MS ProjectのVBA操作)」は、非常に強力な武器です。しかし、強力すぎるがゆえに、安易な操作はプロジェクトデータの整合性を一瞬で破壊します。
特に、「タスクからリソースを外す」という操作。一見簡単そうに見えますが、ここには落とし穴が沢山あります。「実績工数が入っているのに外そうとしてエラー」「依存関係で計算が狂う」……そんな経験はありませんか?
今日は、マクロの記録から脱却し、堅牢なプロジェクト管理を実現するための「安全なリソース割り当て解除」の作法を伝授します。
—
1. なぜ「割り当て解除」でエラーが出るのか?
リソースを外すとき、MS Projectの内部では複雑な計算が走ります。
- 実績(Actual Work)の壁: すでに作業実績が入力されているタスクからリソースを削除しようとすると、Projectは「実績があるのに担当がいないのは矛盾している」と判断してエラーを投げます。
- 依存関係の連鎖: リソースを外したことで工数がゼロになり、そのタスクの終了日がズレる。結果として後続タスクの開始日が……というドミノ倒しが起こります。
これを防ぐには、「削除する前に、条件をクリアする」というエンジニアリングの基本を守る必要があります。
—
2. 堅牢な割り当て解除の設計図
「削除する」前に、以下のチェックリストをコードに組み込みます。
1. 実績があるか? → ある場合は「残存作業時間をゼロ」にしてから削除する。
2. 割り当ては存在するか? → 存在しないリソースを削除しようとすると即座にエラーになるため、事前に確認する。
3. 計算モードは安全か? → 自動計算による予期せぬ日付変更を防ぐ。
実践:安全にリソースを削除するVBAコード
以下のコードは、指定したタスクから特定のリソースを、整合性を保ったまま削除するためのテンプレートです。
Sub SafeRemoveResource(targetTask As Task, resourceName As String)
Dim asgn As Assignment
Dim found As Boolean
‘ 1. タスクに該当リソースが割り当てられているか確認
found = False
For Each asgn In targetTask.Assignments
If asgn.ResourceName = resourceName Then
found = True
Exit For
End If
Next asgn
If Not found Then
Debug.Print “リソース「” & resourceName & “」は見つかりませんでした。”
Exit Sub
End If
‘ 2. エラーハンドリングを有効化(万が一の保護)
On Error GoTo ErrorHandler
‘ 3. 実績がある場合に備え、残存作業時間をゼロにして整合性を取る
‘ ※これをしないと、実績があるタスクからリソースを外す際にエラーになることが多い
If asgn.ActualWork > 0 Then
asgn.RemainingWork = 0
End If
‘ 4. 割り当てを削除
asgn.Delete
Debug.Print “リソース「” & resourceName & “」を正常に削除しました。”
Exit Sub
ErrorHandler:
MsgBox “削除中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. コードのポイント:ここが「プロの設計」
① `On Error GoTo` で守りを固める
VBAにおいて、エラーが発生した瞬間にプログラムが停止するのは最悪のケースです。`ErrorHandler`へ飛ばすことで、エラー内容を握りつぶさずにログとして残し、後で原因究明できるようにしています。
② `asgn.RemainingWork = 0` の重要性
これが今回の核心です。実績工数が存在するタスクからリソースを強制的に外そうとすると、MS Projectは「実績はあるのに、そのリソースの作業分はどうなるんだ?」と混乱します。先に「残りの作業はもうない(RemainingWork = 0)」と宣言することで、論理的な矛盾を解消してから削除を実行します。
—
4. ステップアップ:さらに高みを目指すあなたへ
このコードが書けるようになれば、あなたはもう「マクロを動かす人」から「システムを設計する人」へ進化しました。
次のステップとして、以下を検討してみてください。
- 計算の抑止: `Application.Calculation = pjManual` を冒頭に入れ、全処理が終わった後に自動計算させることで、パフォーマンスが劇的に向上します。
- ログ出力: どのタスクから誰が外されたのか、イミディエイトウィンドウだけでなくテキストファイル等に履歴を残す仕組みを作ると、大規模プロジェクトでの信頼性が飛躍的に高まります。
—
最後に:自動化は「責任」を伴う
Project VBAは非常に強力ですが、「機械的にデータを動かせる」ということは「機械的にデータを壊せる」ということでもあります。
「なぜこの処理が必要なのか?」を考えながらコードを書く癖をつけてください。その視点を持つことが、世界最高峰のエンジニアへの第一歩です。
何か分からないことや、もっと深掘りしたいことがあれば、いつでも聞いてくださいね。皆さんのプロジェクトが、よりスマートに管理されることを心から応援しています!
