プロジェクト管理の「負債」を消し去る。Project VBAによるリソース一括クリーンアップ術
こんにちは。現場で泥臭く、かつスマートにプロジェクトを回し続けているエンジニアの皆さん。
プロジェクトの計画変更、よくありますよね。当初の予定が崩れ、タスク構成が変わり、気づけば「不要なリソースの割り当て」がゴミのように散らばり、スケジュール表がカオスになっている……。そんな経験はありませんか?
手作業で一つずつ「割り当て(Assignment)」を削除するのは時間の無駄ですし、何よりヒューマンエラーの温床です。今日は、Project VBAを使って、条件に合致するリソース割り当てを一括で、かつ安全に抹消する「クリーンアップツール」の極意を伝授します。
—
1. なぜ「手作業」ではなく「コード」なのか?
Microsoft Projectの内部構造において、「タスク」「リソース」「割り当て(Assignment)」は複雑なネットワークで繋がっています。
- タスク(Task): 「何をするか」
- リソース(Resource): 「誰がやるか」
- 割り当て(Assignment): 「タスクとリソースを結ぶ線」
手作業での削除は、特に「特定のリソースだけを外したい」といった場合に、クリックミスで別の割り当てを消してしまったり、進捗を狂わせたりするリスクがあります。コードによる制御は、「条件」を厳密に定義し、瞬時に処理を完了させるための唯一の解なのです。
—
2. 実装の核心:クリーンアップ・スクリプト
それでは、実際に現場で使えるコードを見ていきましょう。今回は「特定の名前を持つリソースの割り当てを、現在のプロジェクトから全て削除する」というツールを作成します。
Sub CleanupResourceAssignments()
‘ — プロジェクトのオブジェクトを定義 —
Dim tsk As Task
Dim asgn As Assignment
Dim targetResourceName As String
‘ 削除対象のリソース名を指定
targetResourceName = “田中 太郎”
‘ プロジェクト内の全てのタスクをループ処理
For Each tsk In ActiveProject.Tasks
‘ タスクが空行(見出し等)でないことを確認
If Not tsk Is Nothing Then
‘ そのタスクに紐づく全ての割り当てをチェック
For Each asgn In tsk.Assignments
‘ 割り当てられたリソース名が対象と一致するか確認
If asgn.ResourceName = targetResourceName Then
‘ エラーハンドリング:安全に削除を実行
On Error Resume Next
asgn.Delete
‘ エラーが発生していないかチェック
If Err.Number <> 0 Then
Debug.Print “削除失敗: ” & tsk.Name & ” – ” & Err.Description
Err.Clear
Else
Debug.Print “成功: ” & tsk.Name & ” から ” & targetResourceName & ” を削除”
End If
On Error GoTo 0
End If
Next asgn
End If
Next tsk
MsgBox “クリーンアップが完了しました。”
End Sub
コードのここがポイント!
- `For Each` の二重ループ: タスクを回し、その中の割り当てを回す。この構造を理解すれば、Project VBAの8割は掌握したも同然です。
- `On Error Resume Next`: 非常に強力ですが、諸刃の剣です。今回は「万が一削除できない割り当てがあっても、ループを止めずに進む」という実用性を優先するために使用しました。
- `Debug.Print`: イミディエイトウィンドウ(Ctrl+G)に結果を出力します。画面を汚さず、処理内容を記録するエンジニアの嗜みです。
—
3. 陥りやすい「罠」と解決策
初学者がProject VBAで必ずつまづくポイントがいくつかあります。
その①:削除によるループの崩壊
「ループ中に要素を削除すると、インデックスがずれてバグる」という鉄則が、Project VBAの `Assignments` コレクションでも発生することがあります。今回のコードでは `For Each` を使っているため比較的安全ですが、複雑な条件分岐を加える際は、「削除対象を一旦配列に溜めてから、最後に一括削除する」というアプローチを取ると、さらに堅牢になります。
その②:リソースがタスクに割り当てられていない時のエラー
`tsk.Assignments` にアクセスする際、タスクが空(Nothing)だと即座にエラーになります。`If Not tsk Is Nothing Then` というチェックは、VBAにおける「お守り」のようなものです。これを入れるだけで、コードの安定性が劇的に変わります。
—
4. さあ、次のステップへ
Project VBAは、単なる事務作業の自動化ツールではありません。プロジェクトという「生き物」の状態を、数値と論理でコントロールするための魔法の杖です。
今回紹介したコードは、あくまで基本の形。ここから、
- 「コストが0円のリソースだけを消す」
- 「特定の日付以降の割り当てだけを消す」
といった条件を追加していけば、あなたのプロジェクト管理は飛躍的に効率化されます。
まずはこのコードをコピーして、テスト用のプロジェクトファイルで動かしてみてください。「動いた!」という感動が、あなたのエンジニアとしての武器になります。
もし分からないことがあれば、またいつでも聞きに来てくださいね。あなたの挑戦を、心から応援しています。
