伝説の門を叩く君へ: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を使える人」ではない。「プロジェクトの運命をコントロールするアーキテクト」だ。
さあ、エディタに向かえ。君の書いたコードが、プロジェクトの歴史を記録する最初の一行になるはずだ。
また困ったことがあればいつでも聞きに来てくれ。君の挑戦を応援しているよ。
