こんにちは!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が書ける人」から、組織のプロジェクト管理の質を底上げする「頼れるアーキテクト」へ一歩近づくことができます。
ぜひご自身の環境で試して、日々の業務をスマートに自動化してみてくださいね!
