こんにちは!プロジェクトマネジメントの現場で、スケジュールやリソースの管理に日々奮闘お疲れ様です。MS ProjectのVBAと聞くと、「難しそう」「マクロの記録もうまく動かないし……」と及び腰になってしまう方も多いのではないでしょうか。
でも、安心してください。ここをクリアすれば、Project VBAの基本はバッチリですよ!
今回は、ワンランク上のエンジニアを目指すあなたへ向けて、「MS Project × Gitによる構成管理の自動化」という、実務で最高にクールで役立つテクニックを伝授します。
「えっ、プロジェクトファイル(.mpp)のバージョン管理って、バイナリだから差分が見えなくて困るよね?」
そんなあなたの悩みを一発で解決する、「保存時に自動でXMLエクスポートし、さらにGitで自動コミットまで完結させる魔法のVBAコード」の世界へご案内します。
—
なぜ、MS ProjectとGitを連携させる必要があるのか?
私たちが普段扱う`.mpp`ファイルは、内部構造がブラックボックス化されたバイナリファイルです。そのため、Gitでそのまま管理しようとしても、誰が・いつ・どこを変更したのか(差分)が全く見えません。これでは「いつの間にかクリティカルパスが狂っていた!」という時に原因追跡が不可能になります。
そこで登場するのが 「XML形式への変換」 です。
MS Projectは、ファイル形式として`.xml`を指定して保存すると、プロジェクトの全構造(タスク、リソース、カレンダー、コスト)を人間(とGit)が読めるテキスト形式で出力してくれます。
これを応用し、「VBAでファイルを保存するタイミングをフックして、自動でXMLを吐き出し、裏でGitコマンドを叩いて自動コミットする」という仕組みを作ります。
—
全体像:自動化の仕組み
1. ユーザーが通常通りプロジェクトを保存する(またはVBAから保存を実行する)。
2. Project VBAのイベントプロシージャが保存アクションを検知する。
3. 現在のプロジェクトを特定のパスにXML形式でエクスポートする。
4. Windowsのシェル(WScript.Shell)経由でGitコマンド(`add` と `commit`)を実行する。
この一連の流れを、たった一つのモジュールで実現します。
—
実装ステップ①:クラスモジュールで「保存」をフックする
MS Projectで「いつ保存されたか」を検知するには、アプリケーションレベルのイベントを捉える必要があります。通常の標準モジュールではなく、クラスモジュールを使います。ここが今回の最大の肝です!
1. クラスモジュールを作成する
VBAエディタ(Alt + F11)を開き、`[挿入]` > `[クラス モジュール]` を選択します。
プロパティウィンドウで、このモジュールの名前を `CAppEvents` に変更してください。
2. クラスモジュールのコードを記述する
以下のコードをそのまま貼り付けます。
‘ =================================================================
‘ クラス名: CAppEvents
‘ 概要: MS Projectのアプリケーションイベントをキャッチするクラス
‘ =================================================================
‘ WithEventsキーワードを使い、Projectのアプリケーションイベントを有効化します
Public WithEvents App As MSProject.Application
‘ 【重要】プロジェクト保存直前に発火するイベント
Private Sub App_ProjectBeforeSave(ByVal pj As Project, ByRef Cancel As Boolean)
On Error GoTo ErrorHandler
Dim xmlPath As String
Dim repoPath As String
Dim commitMsg As String
Dim shellObj As Object
Dim cmd As String
‘ 1. XMLの出力先パスを設定(プロジェクトファイルと同じフォルダ、またはGitリポジトリ内)
‘ ※ここでは例として、C:\Projects\MyProject\ フォルダを想定しています
repoPath = “C:\Projects\MyProject\”
xmlPath = repoPath & “schedule_data.xml”
‘ 2. XML形式でプロジェクトをエクスポート
‘ FileFormat:=pjXML を指定することで、テキスト化されたプロジェクト構造を出力できます
pj.SaveAs FileName:=xmlPath, FileFormat:=pjXML
‘ 3. Gitコマンドの構築
‘ 変更されたXMLファイルをステージングし、自動コミットメッセージを生成します
commitMsg = “Auto-commit: ” & pj.Name & ” (” & Format(Now, “yyyy-mm-dd hh:nn:ss”) & “)”
‘ コマンドプロンプトで実行する一連のGitコマンド(作業ディレクトリの移動 & add & commit)
cmd = “cmd.exe /c cd /d ” & repoPath & ” && git add schedule_data.xml && git commit -m “”” & commitMsg & “”””
‘ 4. WScript.Shellを使ってバックグラウンドでGitコマンドを実行
Set shellObj = CreateObject(“WScript.Shell”)
‘ 第2引数の「0」はウィンドウを非表示(バックグラウンド実行)にする設定です
shellObj.Run cmd, 0, True
Exit Sub
ErrorHandler:
MsgBox “Git連携マクロでエラーが発生しました: ” & Err.Description, vbCritical, “構成管理エラー”
‘ 必要に応じて Save をキャンセルする場合は Cancel = True を設定します
End Sub
—
実装ステップ②:イベントを常時監視するトリガーを用意する
クラスを作っただけでは、まだProjectはイベントを監視してくれません。標準モジュールを追加して、Project起動時にこのクラスを有効化する「お膳立て」をします。
1. 標準モジュールを作成する
`[挿入]` > `[標準モジュール]` を選択し、名前を `mAutoExec` とします。
2. 標準モジュールのコードを記述する
‘ =================================================================
‘ 標準モジュール: mAutoExec
‘ 概要: アプリケーション起動時にイベント監視クラスをインスタンス化する
‘ =================================================================
Dim GlobalEvents As New CAppEvents
‘ MS Project起動時に自動実行される特別なプロシージャ
Private Sub Auto_Open()
‘ アプリケーションオブジェクトを紐付けることで、監視をスタートします
Set GlobalEvents.App = GetObject(, “MSProject.Application”)
MsgBox “プロジェクトのGit自動構成管理システムが有効になりました。”, vbInformation, “システム起動”
End Sub
※手動でテストしたい場合は、`Auto_Open` プロシージャのなかにカーソルを置いてF5キー(実行)を押せば、その場でイベント監視が有効になります。
—
初学者がハマりやすい「3大トラップ」と対策
ここまで読んで、「なんだ簡単じゃないか!」と思ったあなた。素晴らしい着眼点ですが、現場でこれを動かすときにはいくつか超えるべき壁があります。先輩からのアドバイスとして頭に入れておいてください。
1. パスのスペース問題(空白文字の罠)
Windowsのフォルダパスやファイル名にスペース(例: `C:\My Project\`)が含まれていると、バッチコマンドや `WScript.Shell` は途中でパスが切れたと勘違いしてエラーを起こします。
- 対策: パスを変数で扱う際は、ダブルクォーテーション(`”`)でしっかりと囲む癖をつけましょう。(上記のコードではコミットメッセージやパスの結合部分で工夫しています)
2. Gitの初期設定(認証とリポジトリ)が済んでいない
VBAから突然 `git commit` を叩いても、PC側でGitのユーザー名・メールアドレスが設定されていなかったり、リモートリポジトリへの認証(SSHキーやCredential Managerなど)が通っていないと、コマンドはサイレントに失敗します。
- 対策: 必ず事前に、対象フォルダ上で手動で一度 `git add` と `git commit` が正常に完了することを確認しておいてください。
3. 無限ループや保存のブロック
保存イベント(`ProjectBeforeSave`)の中で、さらにファイルを保存するような処理(`pj.Save`など)を書いてしまうと、「保存しようとする ➔ イベント発火 ➔ また保存する ➔ イベント発火……」という終わりのない無限地獄(スタックオーバーフロー)に陥ります。
- 対策: 今回のコードのように、保存そのものはユーザーの操作に任せ、ファイル出力を別名(`SaveAs`)のXMLとして逃がすことで、この罠をスマートに回避しています。
—
さあ、現場で試してみよう!
これで、あなたのMS Projectは単なるスケジュール表ではなく、「変更履歴が完全に追跡できる堅牢なエンジニアリングツール」へと生まれ変わりました。
プロジェクトファイルを保存するたびに、裏側でシュッとXMLが吐き出され、Gitの履歴に積み上がっていく……。そのロマンあふれる挙動をぜひご自身の環境で確かめてみてください。
Project VBAの可能性は、工夫次第で無限大です。「面倒な手作業はすべてコードに語らせる」。このマインドセットがあれば、あなたの業務自動化スキルは間違いなくプロフェッショナル領域に到達します。
それでは、次回の高度なVBA解説でお会いしましょう。ハッピー・コーディング!
