プロジェクトの「最後の砦」を築く:BeforeSaveイベントでデータ整合性を強制するVBA極意
こんにちは。現場で泥臭く、かつエレガントな自動化を追い求めているエンジニアです。
Project VBAを触り始めると、「マクロの記録」がないことに愕然とし、途方に暮れる時期がありますよね。でも、安心してください。Projectのオブジェクトモデルを理解すれば、Excel VBAよりも遥かに厳格で、組織の資産を守るための「守護神」のようなコードが書けるようになります。
今回は、プロジェクトを保存する瞬間、「入力漏れや不整合があれば保存を阻止する」という、実務で最も求められる防御的プログラミングの極意を伝授します。
—
1. なぜ「BeforeSave」イベントなのか?
一般的な自動化は「ボタンを押して実行」ですが、これだと人間は必ずミスをします。保存ボタンを押したその瞬間に介入する`Project_BeforeSave`イベントは、「人間がファイルを閉じる(=データを固定する)直前の検問所」です。
ここでチェックを走らせれば、不完全なデータがサーバーにアップロードされる悲劇を未然に防ぐことができます。
—
2. 実装の舞台:ThisProjectモジュール
VBAエディタ(Alt + F11)を開いてください。左側のツリーにある「ProjectGlobal」ではなく、「ThisProject」というオブジェクトをダブルクリックします。ここが、プロジェクト全体のライフサイクルを司る聖域です。
以下のコードをコピーして貼り付けてみてください。
‘ プロジェクト保存イベントのハンドラ
Private Sub Project_BeforeSave(ByVal pj As Project, ByVal SaveAsUi As Boolean, Cancel As Boolean)
Dim tsk As Task
Dim isErrorFound As Boolean
‘ チェックフラグをリセット
isErrorFound = False
‘ 全タスクをループして整合性チェック
For Each tsk In pj.Tasks
‘ 完了していないのに実績工数が0、かつ開始日が空などの異常を検知
‘ ※ここでは「名前が空のタスク」をチェックする例とします
If Not tsk Is Nothing Then
If tsk.Name = “” Then
MsgBox “警告:タスク名が未入力の行があります(ID: ” & tsk.ID & “)”, vbCritical
isErrorFound = True
Exit For ‘ 一つ見つかれば十分なので抜ける
End If
End If
Next tsk
‘ エラーがあれば保存をキャンセルする
If isErrorFound Then
Cancel = True ‘ このフラグをTrueにすることで保存処理が中断される
MsgBox “データ整合性エラーのため、保存を中断しました。”, vbExclamation
End If
End Sub
—
3. コードの読み解き:ここがエンジニアの分かれ道
このコードがなぜ重要なのか、3つのポイントに絞って解説します。
- `Cancel As Boolean` の魔力
この引数は、イベント特有の「ゲートキーパー」です。`Cancel = True` と代入するだけで、Projectの保存処理そのものを強制停止させます。これこそが、VBAによるデータガバナンスの根幹です。
- `For Each tsk In pj.Tasks`
Projectのタスクはコレクション(集合体)です。`For Each`は、「タスクという箱の中に何が入っているか」を順番に覗きに行く、最も効率的で安全な巡回方法です。
- `If Not tsk Is Nothing`
初心者がやりがちなミスは、空の行(削除された行など)にアクセスしてエラーを吐くこと。Project VBAでは、常に「対象は存在するか?」を確認する習慣が、安定した動作の秘訣です。
—
4. 陥りやすい罠と解決策
「保存できない!」とパニックにならないために
もしテストコードでバグを作り込んでしまい、保存ができなくなったらどうしますか?安心してください。
- 解決策: VBAエディタでこのコードをコメントアウトするか、一度VBAを無効にしてファイルを開き直せば、イベントは実行されません。開発中は「強制中断する仕組み」と「開発モード」を切り替えられるようにしておくと、プロの仕事になります。
パフォーマンスへの配慮
タスクが数千行ある場合、保存のたびに全スキャンをかけると一瞬の「カクつき」を感じるかもしれません。その場合は、`tsk.Modified`(変更されたタスクかどうか)というプロパティを活用して、変更された箇所だけをチェックするように条件を絞り込むのが、一段上のアーキテクトの作法です。
—
最後に:ここをクリアすれば、あなたはもう脱・初心者
今回紹介した「イベント駆動型のチェック」を習得すれば、あなたの作るプロジェクトファイルは「勝手にデータが綺麗になっていく」自律的なシステムに進化します。
「手作業で直させる」のではなく、「システム側で止める」。この考え方が、あなたのエンジニアとしての信頼を大きく高めるはずです。
次は、これを応用して「指定したリソースがアサインされていないタスクを抽出する」といった、より高度なロジックに挑戦してみましょう。Project VBAの世界へようこそ。あなたの自動化ライフが、より快適なものになることを応援しています!
