【入門編】【中級者向け】プロジェクトファイル内のリソース割り当て状況を保存前にチェックするバリデーションツール – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進み、自分の手でプロジェクトの「守護神」となるような自動化ツールを作りたいと思ったことはありませんか?

今回は、中級者へのステップアップとして、「プロジェクトファイルを保存する直前に、リソースの過負荷や未割り当てタスクを自動でチェックし、問題があれば保存をブロック(または警告)するバリデーションツール」の作り方を解説します。

「ここをクリアすれば、Project VBAのイベント処理とオブジェクト構造の基本はバッチリですよ!」
さあ、現場で即戦力となる知見を一緒に身につけていきましょう。

なぜ「保存前のバリデーション」が必要なのか?

MS Projectを使い慣れていないメンバーがプロジェクトを更新すると、よくこんな事故が起きます。

  • 誰かに仕事が集中しすぎて、リソースが「オーバーアロケーション(過負荷)」になっている。
  • スケジュールを組んだものの、担当者が決まっていない「幽霊タスク(リソース未割り当て)」が放置されている。

この状態のままファイルが上書き保存されてしまうと、後からリカバリーするのが大変ですよね。
そこで、「人間がうっかりミスをするなら、VBAに監視させよう」という発想です。MS Projectには、ファイル保存やオープンなどのアクションに連動して動く「イベントプロシージャ」という強力な仕組みが備わっています。これを利用します。

実装の全体像:使うべきイベントとオブジェクト

Project VBAで保存をフックするには、`ThisProject` モジュールに用意されている `ProjectBeforeSave` イベントを使用します。

ここで重要なのは、「イベントのキャンセル方法」です。
保存処理を中断させたい場合、イベントの引数にある `Cancel` 変数に `True` を代入します。これだけで、不正な状態のままファイルが保存されるのを防ぐことができます。

チェックする2つの条件

1. リソースの過負荷(Overallocated)チェック

  • プロジェクト内のリソース配分を確認し、許容量を超えているリソースがないか走査します。

2. 未割り当てタスク(Resource Namesが空)チェック

  • サマリータスク(大項目)やマイルストーンを除き、通常のタスクにリソースがアサインされているかを確認します。

【実践】バリデーションツールのコード実装

それでは、実際のコードを見ていきましょう。
以下のコードは、MS ProjectのVBAエディタ(Alt + F11)を開き、左側のプロジェクトエクスプローラーにある `ThisProject` をダブルクリックして貼り付けます。

‘ ==============================================================================
‘ チーフアーキテクト直伝:保存前バリデーションツール
‘ 設置場所: ThisProject モジュール
‘ ==============================================================================

Private Sub ProjectBeforeSave(ByVal AS_Project As Project, ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim t As Task
Dim r As Resource
otaskCount As Long
Dim overAllocCount As Long
Dim msg As String

‘ 初期化
UnassignedCount = 0
OverAllocCount = 0

‘ ————————————————————————–
‘ 1. 未割り当てタスクのチェック
‘ ————————————————————————–
For Each t In AS_Project.Tasks
‘ タスクが存在し、かつ有効な場合(外字や空行、サマリータスクを除外)
If Not t Is Nothing Then
If t.Summary = False And t.Milestone = False And t.Active = True Then
‘ リソース名が空、または「担当者なし」の状態を検出
If Trim(t.ResourceNames) = “” Then
UnassignedCount = UnassignedCount + 1
End If
End If
End If
Next t

‘ ————————————————————————–
‘ 2. リソース過負荷(オーバーアロケーション)のチェック
‘ ————————————————————————–
For Each r In AS_Project.Resources
If Not r Is Nothing Then
‘ Overallocated プロパティが True のリソースをカウント
If r.Overallocated = True Then
OverAllocCount = OverAllocCount + 1
End If
End If
Next r

‘ ————————————————————————–
‘ 3. 判定と保存のブロック処理
‘ ————————————————————————–
If UnassignedCount > 0 Or OverAllocCount > 0 Then
msg = “【保存エラー】プロジェクトの状態に問題があります。保存を中止しました。” & vbCrLf & vbCrLf & _
“・未割り当ての通常タスク: ” & UnassignedCount & ” 件” & vbCrLf & _
“・過負荷(オーバーアロケーション)のリソース: ” & OverAllocCount & ” 件” & vbCrLf & vbCrLf & _
“タスクの割り当てとリソース配分を確認・調整してください。”

‘ ユーザーに警告を表示
MsgBox msg, vbCritical + vbOKOnly, “Project 整合性バリデーション”

‘ ★ここで保存をキャンセルする(最重要)
Cancel = True
Else
‘ 問題なければログ出力(イミディエイトウィンドウ)
Debug.Print “バリデーションOK: 正常に保存処理を継続します。”
End If

End Sub

コードの深掘り解説:ここがエンジニアの急所

初心者が陥りがちな罠と、それを回避するための知見をいくつか共有しておきます。

1. なぜ `Standard` モジュールではなく `ThisProject` に書くのか?

イベント(`ProjectBeforeSave` など)は、プロジェクトファイル自体のライフサイクルに紐づくものです。そのため、通常の標準モジュール(Module1など)に書いてもイベントは絶対に発火しません。必ず `ThisProject` モジュールに記述してください。

2. ゴミタスクやサマリータスクの罠

プロジェクトファイルには、ユーザーが見ていない「空白の行」や、集計用の「サマリータスク」が存在します。これらはリソースが割り当てられていなくても正常なケースがほとんどです。
今回のコードでは、以下の条件式でノイズを華麗にスルーしています。

If t.Summary = False And t.Milestone = False And t.Active = True Then

  • `Summary = False`: 親階層の集計行ではないこと
  • `Milestone = False`: 成果物ポイントを示すマイルストーンではないこと
  • `Active = True`: 無効化(非アクティブ)されたタスクではないこと

このフィルタリングを入れることで、実務で使える精度の高いチェックが可能になります。

3. `Cancel = True` の魔力

`Cancel` 引数に `True` を代入すると、MS Projectの保存処理そのものが強制中断されます。ユーザーが「上書き保存」ボタンを連打しようとも、不正なデータがサーバーやローカルに書き込まれるのを鉄壁の守りで防ぎます。

現場でありがちなエラーと対処法

  • Q: コードを書いたのに保存しても何も起きない!
  • A: マクロが無効化されている可能性があります。[ファイル] > [オプション] > [トラストセンター] から、マクロの設定を「すべてのマクロを有効にする」または「通知してすべてのマクロを有効にする」に変更し、ファイルを一度開き直してください。
  • Q: 処理が重すぎて保存が遅くなった
  • A: タスクやリソースが数千件規模の巨大プロジェクトの場合、`For Each` ループが若干のタイムラグを生むことがあります。実運用では、ループの前に `Application.ScreenUpdating = False` を挟むなどしてパフォーマンスへの配慮を行うと、さらにプロフェッショナルなコードになります。

まとめ

今回は、プロジェクトの品質を守る「保存前バリデーションツール」の仕組みを解説しました。

  • イベントプロシージャ(`ProjectBeforeSave`)を使いこなす
  • `Cancel = True` で不正な保存をシャットアウトする
  • サマリータスクやマイルストーンを適切に除外して、精度の高い判定を行う

このテクニックをマスターすれば、単なる「VBAが書ける人」から、組織のプロジェクト管理の質を底上げする「頼れるアーキテクト」へ一歩近づくことができます。

ぜひご自身の環境で試して、日々の業務をスマートに自動化してみてくださいね!

タイトルとURLをコピーしました