【入門編】Projectの保存時に自動実行する:BeforeSaveイベントを活用したデータ整合性チェック – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「最後の砦」を築く: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の世界へようこそ。あなたの自動化ライフが、より快適なものになることを応援しています!

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