【Project VBA】マスタープロジェクト自動生成術:堅牢な自動化がプロジェクトマネジメントを救う
諸君、プロジェクト管理の現場で「複数のサブプロジェクトを一つずつ手作業でマスターに挿入している」という不毛な光景をまだ繰り返しているのか?
プロジェクトマネージャー(PM)が貴重な時間をファイル操作に費やすなど、言語道断だ。「複数のプロジェクトファイルを統合し、マスタープロジェクトを自動生成する」。これは単なる自動化ではない。組織の可視性を高め、属人化を排除するアーキテクチャへの第一歩だ。
今日は、Project VBAの深淵に触れ、現場で「絶対に壊れない」堅牢な結合ロジックを伝授する。
—
1. なぜ「手作業」や「適当なループ」が崩壊を招くのか
多くのエンジニアが陥る罠は、`SubProjects.Add` メソッドを思考停止でループさせることだ。
Project VBAには特有の「ライフサイクル」がある。特にマスタープロジェクトへのリンク貼り付けは、ファイルパスの整合性や、既に開いているプロジェクトとの競合、そしてメモリ管理において繊細な挙動を示す。
堅牢な設計の鉄則
- フルパスの厳格な管理: 相対パスは禁忌だ。全てフルパスで取り回せ。
- サイレント・エラーの排除: `On Error Resume Next` を乱用するな。エラーが発生した際、どのファイルで躓いたのかをログに吐き出させる仕組みが保守性を決める。
- Project Objectの解放: プロジェクトを閉じる際、`Set objProj = Nothing` を怠るな。メモリリークは長大なプロジェクトファイルほど致命的なパフォーマンス低下を招く。
—
2. プロダクションコード:自動マスタープロジェクト生成
以下のコードは、指定フォルダ内の全ての `.mpp` ファイルを拾い上げ、一つのマスターファイルにリンクする実戦仕様だ。
Option Explicit
‘ プロジェクトファイルを統合するマスター生成エンジン
Sub GenerateMasterProject()
Dim strFolderPath As String
Dim strFileName As String
Dim objMasterProj As Project
Dim objSubProj As Subproject
‘ 1. 設定:対象フォルダを厳格に指定
strFolderPath = “C:\Projects\SubProjects\”
‘ 新規プロジェクト作成(不可視で作成し、処理後に表示する手法も推奨される)
Set objMasterProj = Application.Projects.Add
‘ 2. ファイルシステムオブジェクトで高速に抽出
strFileName = Dir(strFolderPath & “.mpp”)
On Error GoTo ErrorHandler
Do While strFileName <> “”
‘ 自分自身は読み込まない
If strFileName <> ThisProject.Name Then
‘ 3. サブプロジェクトとしてリンク(重要:リンク設定をTrueにする)
Set objSubProj = objMasterProj.Subprojects.Add(Name:=strFolderPath & strFileName, _
Link:=True)
Debug.Print “統合完了: ” & strFileName
End If
strFileName = Dir()
Loop
MsgBox “マスタープロジェクトの生成が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub
—
3. 実務で「詰まない」ためのアーキテクチャ上の注意点
データベース連携の罠
もしプロジェクトをProject ServerやPWA(Project Web App)環境で運用している場合、このコードは通用しない。サーバー環境では `Projects.Add` ではなく、`Application.WebOpenProject` を用いる必要がある。オンプレミスのファイルベースで開発する際も、「誰かが編集中ではないか」という排他制御(Read-Onlyでのオープン)を検討しておくべきだ。
パフォーマンスの最適化
サブプロジェクトが増えると、マスターを開くたびに全ファイルを読み込みに行き、Projectが重くなる。これを防ぐには、マスター作成後に「プロジェクトのプロパティ」から 「リンクしたプロジェクトを常に更新する」設定を制御する VBAコードを追記するのが定石だ。
保守性を高める工夫
- 構成ファイルの分離: フォルダパスをコードに直書きするな。隠しシートや設定用INIファイルに退避させよ。
- ログの保存: `Debug.Print` だけでは不十分だ。エラー発生時に「どのファイルが原因で統合に失敗したか」をテキストファイルに書き出すロジックを組み込むのが、真のプロフェッショナルだ。
—
最後に:自動化は「標準化」の副産物である
私が現場で伝えているのは、「コードを書け」ということではない。「業務のプロセスをコードに落とし込めるほど論理的に整理せよ」ということだ。
プロジェクト結合を自動化すれば、PMは「データの整合性」に集中できるようになる。それこそが、VBAによる業務効率化の真のROI(投資対効果)である。
このコードをベースに、君たちの現場の要件に合わせて磨き上げてくれ。何か不明点があれば、またいつでも聞かせてほしい。技術の力で、現場の無駄を根絶しよう。
