【Project VBA】保存時に「作成者」「会社名」を強制統制する!社内規定準拠の自動化プロパティ制御
開発現場において、プロジェクトファイルのメタデータ管理は「見えないコスト」の温床だ。
複数メンバーでプロジェクト計画(mpp)を共有・更新していく中で、「作成者」欄が個人のPCアカウント名のまま放置されたり、「会社名」の表記ゆれが発生したりするトラブルは後を絶たない。
提出前やサーバー保存時に、これを手動で修正させるのはエンジニアの仕事ではない。仕組みで解決するべきだ。
今回は、Project VBAのライフサイクルイベントを掌握し、ファイル保存時に「作成者」と「会社名」を社内規定のフォーマットへ強制的に上書き・統制する堅牢なプロダクションコードを授与する。
—
1. なぜ「手動運用」は破綻するのか?
多くの現場では、以下のような運用手順が敷かれている。
> 「ファイルを保存する前に、ファイルタブのプロパティから作成者を確認・変更してください」
断言しよう。この運用は100%失敗する。
人間の記憶や注意力に依存した業務プロセスは、プロジェクトが炎上した瞬間から真っ先に崩壊する。結果として、クライアントや監査部門へ提出するファイルに不適切なメタデータが残り、組織としてのガバナンス低下を招く。
我々VBAエンジニアが目指すべきは、「ユーザーが意識することなく、保存(Save)の瞬間にシステムが自動で綺麗に整形する」という不可避の自動化だ。
—
2. 実装アプローチ:イベントプロシージャの罠と正解
Project VBAにおける自動保存処理では、`FileSave` や `FileSaveAs` といったイベントハンドラを利用する。
しかし、ここで初心者エンジニアが陥りがちな罠がある。それは「どのイベントトリガーをフックすべきか」の選定ミスだ。
誤った設計:各保存系イベントの個別実装
`FileSave` だけにコードを書いても、ユーザーが「名前を付けて保存(FileSaveAs)」を実行した際にプロパティが書き換わらないという致命的な抜け穴が生じる。
正解の設計:`ProjectBeforeSave` イベントの活用
Microsoft Projectのアプリケーションレベルのイベントである `ProjectBeforeSave` を捕捉するのが最も堅牢である。このイベントは、通常の保存であれ、名前を付けて保存であれ、すべての保存プロセスの直前に必ず発火する。
—
3. プロダクションコード:コピペで動く堅牢な実装
以下のコードを、プロジェクトテンプレート(Global.mpp)または対象プロジェクトファイルの `ThisProject` モジュールに実装してほしい。
実装手順
1. Projectを開き、`[Alt] + [F11]` でVBE(Visual Basic Editor)を起動。
2. 左側のプロジェクトエクスプローラから、対象ファイルの `ThisProject` をダブルクリック。
3. 以下のコードを貼り付ける。
‘ ==============================================================================
‘ モジュール名: ThisProject
‘ 概要: ファイル保存時に社内規定のプロパティ(作成者・会社名)を自動設定する
‘ アーキテクチャ観点: アプリケーションイベントを捕捉し、メタデータの揺れを完全排除
‘ ==============================================================================
Option Explicit
Private Sub Project_BeforeSave(ByVal pj As Project)
On Error GoTo ErrorHandler
‘ ————————————————————————–
‘ 定数定義(社内規定に合わせて書き換えてください)
‘ ————————————————————————–
Const COMPANY_NAME As String = “株式会社テクノロジー・ソリューションズ”
Const AUTHOR_NAME As String = “PMO統括部 / 自動生成プロパティ”
‘ ————————————————————————–
‘ プロパティの強制書き換え処理
‘ ————————————————————————–
‘ ProjectオブジェクトのBuiltinDocumentPropertiesコレクションを操作
With pj
‘ 会社名の統制
.BuiltinDocumentProperties(“Company”) = COMPANY_NAME
‘ 作成者の統制
.BuiltinDocumentProperties(“Author”) = AUTHOR_NAME
‘ ついでに管理者(Manager)やカテゴリ(Category)も統制する場合はここに追記可能
‘ .BuiltinDocumentProperties(“Manager”) = “PM部 統括責任者”
End With
Exit Sub
ErrorHandler:
‘ 予期せぬエラーで保存自体が阻害されないよう、エラーログを出力し処理を継続させる
MsgBox “ファイルプロパティの自動更新中にエラーが発生しました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “メタデータ統制マクロ”
‘ 必要に応じてエラーを上位に伝播させないための処理
Resume Next
End Sub
—
4. コードの深掘りとアーキテクチャの解説
このコードが「プロダクション品質」である所以を解説する。
① `BuiltinDocumentProperties` の確実な参照
ExcelやWordのVBAと同様に、MS Projectも内部ドキュメントプロパティをコレクションとして保持している。`”Company”` や `”Author”` というキーを指定することで、OSのログインユーザー名やOfficeの初期設定に依存せず、強制的に指定の文字列をねじ込むことができる。
② エラーハンドリングの要塞化(`On Error GoTo`)
自動化スクリプトにおいて最悪のシナリオは、「マクロのバグが原因でファイルの保存そのものができなくなること」だ。
上記のコードでは、万が一プロパティの書き換えに失敗した場合でも、`MsgBox` で警告を発しつつ、`Resume Next` によって本来の「ファイルの保存処理」を阻害しない設計にしている。業務継続性を最優先に考えたディフェンシブな実装だ。
—
5. 現場でありがちなトラブルシューティング
- Q: マクロが実行されません
- A: セキュリティセンターのマクロ設定で「すべてのマクロを有効にする(推奨されません、は適宜組織のポリシーに合わせてください)」または「デジタル署名されたマクロのみ有効」等を確認してください。また、拡張子が `.mpp` ではなく `.mpt` やマクロ無効形式 (`.mpx` 等)になっていないかも確認が必要です。
- Q: 保存するたびに実行されるのでパフォーマンスが心配です
- A: 文字列代入処理はミリ秒単位で完了するため、プロジェクトの保存速度に体感できるほどの遅延は一切発生しません。安心して導入してください。
—
総括
たったこれだけのコード記述で、組織内のすべてのプロジェクトファイルにおける「メタデータの品質」が担保される。
属人性を排除し、インフラレベルで品質を統制することこそが、我々エンジニアが目指すべき真の業務自動化の姿である。
今すぐこのコードをあなたの環境にデプロイし、無駄な手動チェック作業をこの手で根絶してほしい。
