Project VBAの「門番」を作る:未完了タスクを見逃さない自動チェックの極意
こんにちは。現場で泥臭く、かつエレガントな自動化を追求しているアーキテクトです。
MS Projectを使っていると、誰しも一度は「未完了のまま保存してしまい、進捗管理が崩壊した」という苦い経験があるはずです。標準の「保存」ボタンは、中身がどうあれ問答無用でファイルを上書きしますよね。
今回は、VBAを使って「保存の瞬間に介入し、未完了タスクがあれば警告を出して保存を阻止する」という、いわば「プロジェクトの門番」を作る方法を伝授します。マクロの記録から一歩踏み出し、Projectのライフサイクルを制御する中級者へのステップアップです。
—
1. なぜ「保存処理をフックする」必要があるのか
Project VBAには、ユーザーの操作(保存、印刷、終了など)を検知して特定のコードを実行する「イベント」という仕組みがあります。
通常、保存ボタンを押すとそのままファイルが保存されますが、イベントを使えば「保存される直前」に私たちのコードを割り込ませることができます。これを「フック」と呼びます。
2. 「門番」の実装手順
プロジェクトの保存を制御するには、`ThisProject` オブジェクトに記述する `Project_BeforeSave` イベントを利用します。
手順:
1. Projectを開き、`Alt + F11` でVBE(Visual Basic Editor)を開く。
2. 左側のプロジェクトエクスプローラーで `ThisProject` をダブルクリック。
3. コードウィンドウの左上のドロップダウンで「Project」、右側で「BeforeSave」を選択。
以下のコードをコピーして貼り付けてください。
‘ プロジェクトが保存される直前に実行されるイベント
Private Sub Project_BeforeSave(ByVal pj As Project, ByVal SaveAsUi As Boolean, Cancel As Boolean)
Dim t As Task
Dim unfinishedCount As Integer
unfinishedCount = 0
‘ すべてのタスクをループして、未完了かつ期限を過ぎているものをチェック
For Each t In pj.Tasks
‘ サマリータスク(見出し)を除外して判定
If Not t Is Nothing Then
If Not t.Summary Then
‘ 完了率が100%未満、かつ終了予定日が今日より前なら未完了とみなす
If t.PercentComplete < 100 And t.Finish < Date Then
unfinishedCount = unfinishedCount + 1
End If
End If
End If
Next t
' 未完了タスクが存在する場合の処理
If unfinishedCount > 0 Then
Dim msg As String
msg = “警告:期限を過ぎた未完了タスクが ” & unfinishedCount & ” 件あります。” & vbCrLf & _
“本当に保存しますか?”
‘ ユーザーに確認し、NOなら保存をキャンセルする
If MsgBox(msg, vbExclamation + vbYesNo, “保存ガード”) = vbNo Then
Cancel = True ‘ これが魔法のコード。Trueにすると保存が中止される
MsgBox “保存をキャンセルしました。タスクを確認してください。”, vbInformation
End If
End If
End Sub
—
3. コードのポイントと「陥りやすい罠」
このコードの心臓部は `Cancel = True` です。この引数をTrueにすることで、Projectは「あ、保存しなくていいんだな」と判断し、処理を中断します。
初学者がハマりやすいポイント:
- サマリータスクの判定: `If Not t.Summary` を忘れると、親タスクの完了率も判定対象になり、意図しない警告が出ます。必ず「末端の作業」だけを対象にする癖をつけましょう。
- `Nothing` のチェック: Projectのタスクリストには、削除されたタスクの残骸(Nothing)が含まれることがあります。`If Not t Is Nothing Then` を入れないと、予期せぬエラーでマクロが停止します。
- 保存のループ: `BeforeSave` の中で `FileSave` を呼ぶと、無限ループに陥りProjectがクラッシュします。保存の「直前」に介入するだけで、自分から保存を再実行しないのが鉄則です。
—
4. さらに上を目指すために
この「門番」は、単なる警告だけでなく、以下のように拡張できます。
- カスタムボタンの配置: リボンメニューに「チェック付き保存」ボタンを作り、そのボタンからのみ保存を許可する(標準保存ボタンは封印する)運用。
- ログ出力: 誰が、いつ、どのタスクを未完了のまま保存しようとしたか、外部テキストファイルに記録する。
プロジェクト管理において、ツールは「使い手」を導く存在であるべきです。今回紹介した「保存ガード」は、チームメンバーのミスを未然に防ぐ、非常に強力な武器になります。
ここをクリアすれば、あなたはもうただの「VBAユーザー」ではありません。プロジェクトの品質を担保する「自動化エンジニア」の仲間入りです。ぜひ、ご自身のプロジェクトで試してみてください!
