【入門編】【上級者向け】プロジェクトのオープン・保存イベントを監視するクラスモジュールの設計 – Project VBA解析バイブル

スポンサーリンク

伝説の門を叩く君へ:Project VBAで「システムの神の目」を手に入れる方法

こんにちは。Project VBAの世界へようこそ。
「マクロの記録」という安全な岸辺を離れ、コードの荒波に漕ぎ出そうとしている君を心から歓迎するよ。

今日扱うのは、VBAの真髄である「イベント駆動型プログラミング」だ。単にボタンを押してマクロを走らせるのではない。Projectが「いつ、何をされたか」を、背後から静かに、かつ確実に監視する。そんな「常駐監視システム」の設計図を授けよう。

なぜ「イベント監視」が必要なのか?

大規模なプロジェクト管理において、最も恐ろしいのは「いつの間にかファイルが上書きされていた」「誰がベースラインを勝手に引いたんだ?」という情報のブラックボックス化だ。

Project VBAの `Application` オブジェクトには、プロジェクトの操作を検知する「耳」がついている。これを利用すれば、すべての変更をログとして記録し、プロジェクトの「足跡」を完全に掌握できるんだ。

1. 設計の要:クラスモジュールという「箱」

通常の標準モジュール(Module1など)にコードを書くだけでは、Applicationのイベントを拾うことはできない。「イベントを待ち構える専用の箱」であるクラスモジュールが必要になる。

手順:

1. VBE(Visual Basic Editor)を開く。
2. 「挿入」→「クラスモジュール」を選択。
3. プロパティウィンドウで名前を `clsProjectMonitor` に変更する。

ここに、以下の魔法のコードを書き込んでほしい。

‘ クラスモジュール: clsProjectMonitor
‘ Applicationイベントを監視するための本体

Public WithEvents App As MSProject.Application

‘ プロジェクトが保存された瞬間に発動
Private Sub App_ProjectBeforeSave(ByVal pj As Project, ByVal SaveAs As Boolean, Cancel As Boolean)
Dim logMsg As String
logMsg = “【保存検知】プロジェクト名: ” & pj.Name & ” が保存されました。”
Debug.Print logMsg
‘ ここにテキストファイルへの書き出し処理などを実装可能
End Sub

‘ プロジェクトがオープンされた瞬間に発動
Private Sub App_ProjectOpen(ByVal pj As Project)
MsgBox “プロジェクト「” & pj.Name & “」が開かれました。監視を開始します。”
End Sub

2. 監視のスイッチを入れる:インスタンスの生成

クラスモジュールは「設計図」に過ぎない。これをメモリ上に実体化(インスタンス化)して、「監視状態」にする必要がある。

標準モジュール(Module1など)に以下のコードを書こう。

‘ 標準モジュール
Dim Monitor As clsProjectMonitor ‘ グローバル変数として監視用変数を定義

Public Sub StartMonitoring()
‘ 監視クラスをインスタンス化
Set Monitor = New clsProjectMonitor
‘ Applicationオブジェクトを紐付ける
Set Monitor.App = Application

MsgBox “監視システムが起動しました。”
End Sub

3. 初学者が陥りやすい「罠」

ここで多くの初心者が挫折するポイントがある。「なぜかイベントが反応しなくなった」という現象だ。

  • なぜ起きるか: 変数 `Monitor` がメモリから解放(終了)されると、監視の「耳」も消えてしまうからだ。
  • 解決策: `Monitor` 変数は必ず「プロジェクト全体で生き続けるスコープ(Public変数など)」に置くこと。`Sub` の中で `Dim` すると、`Sub` が終わった瞬間に監視が停止する。これぞ、VBAの「オブジェクトのライフサイクル」の洗礼だ。

4. 次のステップ:ログ記録の実装へ

さて、ここまでで君は「プロジェクトの操作を検知する」という神の視点を手に入れた。次は、これをただの `Debug.Print` で終わらせず、CSVファイルやデータベースに書き出す処理を繋いでみてほしい。

  • ヒント: `Open “C:\Logs\ProjectLog.csv” For Append As #1` を使えば、時系列で操作ログを蓄積できる。

先輩からのメッセージ

コードを書くことは、単なる作業じゃない。プロジェクトという生き物に「自律的なルール」を与えることなんだ。

最初はエラーが出るかもしれない。でも、そのエラーこそが君を一流のエンジニアに育てる糧だ。ここをクリアすれば、君はもう単なる「VBAを使える人」ではない。「プロジェクトの運命をコントロールするアーキテクト」だ。

さあ、エディタに向かえ。君の書いたコードが、プロジェクトの歴史を記録する最初の一行になるはずだ。

また困ったことがあればいつでも聞きに来てくれ。君の挑戦を応援しているよ。

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