【入門編】【中級者向け】保存処理をフックして、未完了タスクがある場合に警告を出すカスタム保存ボタンの作成 – Project VBA解析バイブル

スポンサーリンク

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ユーザー」ではありません。プロジェクトの品質を担保する「自動化エンジニア」の仲間入りです。ぜひ、ご自身のプロジェクトで試してみてください!

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