【上級者への入り口】GitコミットハッシュをProject VBAに刻み込め:CI/CD的なファイル管理術
こんにちは。現場の最前線でVBAと向き合い続けるエンジニアです。
皆さんは、Microsoft Project(以下MSP)のファイルをGitで管理する際、こんなジレンマに陥ったことはありませんか?
「ファイルを開いたけれど、これってどの時点のコードなんだっけ?」
「手動でバージョンを振っているけど、Gitのコミットハッシュとズレていて信頼できない…」
バイナリファイルであるMSPファイルは、Gitで中身の差分を見るのが非常に困難です。しかし、「Project VBAのカスタムプロパティ」にGitのコミットIDを自動的に刻み込むことができれば、ファイルを開いた瞬間にそのプロジェクトの「出自」が明確になります。
今回は、VBAをただの自動化ツールから「プロジェクトの管理インフラ」へと昇華させるための、極限のテクニックを伝授します。
—
なぜ「カスタムプロパティ」なのか?
MSPには、ファイル単位でメタデータを保持できる「カスタムプロパティ」という領域があります。ここを「Gitの足跡」として使うことで、以下のメリットが生まれます。
1. 整合性の担保: ファイルを開くだけで、現在のソースコード(Gitリポジトリ)の状態を即座に確認できる。
2. トレーサビリティ: 誰が、いつ、どのコミット状態のファイルを作成したかの一意な証跡が残る。
3. 自動化のフック: ファイルを開くたびに検証ロジックを走らせ、最新版でない場合に警告を出すような「守りの仕組み」が作れる。
—
実装の全体像:どうやって実現するか?
仕組みはシンプルです。
1. Gitのフック(`post-checkout`や`post-merge`)でコミットハッシュを取得。
2. VBA側で `ActiveProject.CustomDocumentProperties` を叩き、その値を書き込む。
ここでは、「ファイル保存時に、その時点のGitコミットハッシュを自動で埋め込む」ためのVBAコードを紹介します。
—
プロジェクトに埋め込む魔法のコード
以下のコードを、MSPの `ThisProject` モジュールに配置してください。
‘ プロジェクト保存時に自動実行されるイベントハンドラ
Private Sub Project_BeforeSave(ByVal pj As Project, ByVal SaveAsUi As Boolean, Cancel As Boolean)
On Error Resume Next
‘ 現在のGitコミットハッシュを取得(外部コマンドを利用)
Dim commitHash As String
commitHash = GetGitCommitHash()
‘ カスタムプロパティに値をセット(存在しない場合は新規作成)
Dim propName As String
propName = “GitCommitHash”
‘ プロパティへの書き込み
pj.CustomDocumentProperties(propName).Value = commitHash
‘ プロパティが未定義だった場合の例外処理
If Err.Number <> 0 Then
pj.CustomDocumentProperties.Add Name:=propName, _
LinkToContent:=False, Type:=msoPropertyTypeString, Value:=commitHash
End If
Debug.Print “Git Commit Hash を更新しました: ” & commitHash
End Sub
‘ Gitのコミットハッシュを取得する関数
Private Function GetGitCommitHash() As String
Dim shell As Object
Dim exec As Object
Set shell = CreateObject(“WScript.Shell”)
‘ Gitコマンドを実行し、結果を取得(git rev-parse HEAD)
‘ ※MSPファイルがGitリポジトリの配下にあることが前提
Set exec = shell.Exec(“git rev-parse –short HEAD”)
GetGitCommitHash = Trim(exec.StdOut.ReadAll)
Set exec = Nothing
Set shell = Nothing
End Function
—
現場で陥りやすい「罠」と対策
このコードを実装する際、初学者が躓きやすいポイントが2つあります。
1. 「Gitリポジトリ外」で実行した場合のエラー
Git管理下にないファイルでこのコードを動かすと、`git` コマンドがエラーを返します。
- 対策: `GetGitCommitHash` 内で `Err.Number` をチェックし、Gitコマンドが失敗した場合は “Not-in-Git” といった文字列を返すように堅牢化しましょう。
2. イベントプロシージャの無効化
VBAのイベントは、ユーザーがセキュリティ設定でマクロを無効にしていると動きません。
- 対策: 「このファイルはGit管理下にあるため、マクロの有効化が必須である」という運用ルールをチーム内で徹底してください。
—
次のステップ:君がエンジニアとして成長するために
ここをクリアしたあなたは、もう「マクロの記録」を卒業したエンジニアの入り口に立っています。
次の挑戦として、以下のような拡張を考えてみてください。
- バリデーション: ファイルを開いた時 (`Project_Open`) に、現在のローカルのGitコミットハッシュと比較し、一致しなければ警告を出す「強制同期チェック」。
- ログ出力: 保存のたびに、どのユーザーがどのブランチで作業したかをテキストファイルに追記する監査ログ機能。
VBAは古臭いと言われることもありますが、使い方次第で、このように高度なワークフローを支える強力なインフラになります。
「ファイルとコードは運命共同体である」――この意識を持って開発に取り組めば、あなたのプロジェクト管理は一段上のレベルに達するはずです。
もし分からないことがあれば、いつでも聞いてください。応援していますよ!
