プロジェクトの「穴」を塞げ:保存イベントでデータ品質を極限まで高める技術
こんにちは。プロジェクト管理の現場で「なぜか進捗がズレている」「タスクの漏れが後から発覚する」といった事態に頭を抱えたことはありませんか?
MS Projectで最も恐ろしいのは、「不完全なデータが正規ルートで保存されてしまうこと」です。マクロの記録を卒業した皆さんが次に目指すべきは、ツールをただ動かすことではなく、ツールを「正しく使わせるためのガードレール」を作ること。
今回は、Project VBAの隠し玉である`Project_BeforeSave`イベントを使い、「未完了タスクがある状態で保存を試みると警告を発し、保存を阻止する」という、堅牢なデータ保護機構の実装術を伝授します。
—
なぜ「BeforeSave」なのか?
VBAには、ユーザーがボタンを押す前から裏で動く「イベントプロシージャ」という仕組みがあります。その中でも `BeforeSave` は、まさに門番です。
- 何ができる?: 保存ボタンが押された瞬間、ファイルがディスクに書き込まれる直前に介入できます。
- なぜ重要?: 「人間はミスをする」という前提に立ち、システム側でそれを防ぐ。これこそが、プロの自動化エンジニアの思考です。
—
実装コード:保存の門番を配置する
このコードは、`ThisProject`(プロジェクトファイル内の特別なモジュール)に記述する必要があります。
‘ プロジェクトの保存直前に発生するイベント
Private Sub Project_BeforeSave(ByVal pj As Project)
Dim t As Task
Dim incompleteCount As Long
‘ 1. カウンターを初期化
incompleteCount = 0
‘ 2. 全タスクをループして確認
‘ ※サマリータスクを除外したい場合は、t.Summary を条件に追加してください
For Each t In pj.Tasks
‘ 完了率が100%未満、かつ非サマリータスクを抽出
If Not t Is Nothing Then
If t.PercentComplete < 100 And t.Summary = False Then
incompleteCount = incompleteCount + 1
End If
End If
Next t
' 3. 未完了タスクが1つでもあれば保存をキャンセル
If incompleteCount > 0 Then
MsgBox “【警告】未完了タスクが ” & incompleteCount & ” 件あります。” & vbCrLf & _
“全てのタスクを完了させるか、進捗を正しく入力してください。”, _
vbCritical, “保存の中断”
‘ ここが極意:CancelをTrueにすることで、保存処理そのものを強制終了させる
pj.SaveAs2_Cancel = True
End If
End Sub
—
コードの重要ポイント解説
1. `Project_BeforeSave` の引数 `pj`:
現在操作中のプロジェクトオブジェクトそのものです。これを使うことで、どのプロジェクトに対しても柔軟にアクセスできます。
2. `pj.SaveAs2_Cancel = True`:
これがこのスクリプトの心臓部です。このプロパティを立てるだけで、MS Projectは「保存処理をキャンセルせよ」という命令として受け取ります。
3. `t Is Nothing` のチェック:
初心者がやりがちなミスが、削除されたタスク行へのアクセスです。VBAでは`Nothing`(空)のオブジェクトに触れると即座にエラーで落ちます。このチェックを入れるだけでコードの堅牢性が段違いになります。
—
現場で陥りやすい罠と対策
- 「マクロが動かない!」:
イベントプロシージャは、標準モジュールではなく `ThisProject` モジュールに記述しないと反応しません。ここが最大のつまずきポイントです。
- 「保存できなくて困る」:
本当に緊急の修正がある場合、このコードが邪魔になるかもしれません。その場合は、`If MsgBox(“強制保存しますか?”, vbYesNo) = vbYes Then Exit Sub` のような「管理者用回避ルート」をコードに忍ばせておくのも、現場の知恵です。
—
次のステップ:君が手に入れるべき視点
この「ガードレール」を一つ実装するだけで、あなたの管理するプロジェクトのデータ品質は劇的に向上します。
次は、「特定の項目(開始日やリソース)が空白だったら保存させない」といった、より厳しいチェックに挑戦してみてください。それができれば、あなたはもうマクロの記録を叩いているだけのユーザーではありません。プロジェクトの構造を支配するアーキテクトへの第一歩を踏み出したと言えるでしょう。
「ここをクリアすれば、Project VBAの基本はバッチリ」です。まずはこのコードをコピーして、手元のプロジェクトで動かしてみてください。何か疑問があれば、いつでも聞いてくださいね。応援しています!
