プロジェクト管理の「ブラックボックス」を解き放て:Project VBAによる統計情報の自動ロギング実装術
多くのPMが陥る罠がある。それは「プロジェクトの進捗報告のために、プロジェクトファイルを開き、数値を読み取り、Excelに転記する」という、あまりに低付加価値な事務作業だ。
プロジェクトの規模が大きくなればなるほど、この作業はボトルネックとなり、ヒューマンエラーの温床となる。我々のようなアーキテクトが目指すべきは、「プロジェクトの保存」というトリガーを起点に、統計情報を強制的にデータ蓄積させる仕組みだ。
今回は、Project VBAのイベント駆動型設計を用いた、堅牢かつ保守性の高いロギングワークフローを伝授する。
—
1. なぜ「BeforeSave」イベントで設計すべきか
多くの初級者がやりがちなのが、標準モジュールに「集計用マクロ」を書き、手動で実行させる手法だ。これは論外である。なぜなら、人間は忘れる生き物だからだ。
我々は `Project_BeforeSave` イベントを利用する。プロジェクトファイルを保存しようとした瞬間、強制的に統計情報を抽出してExcelへ追記する。これにより、「保存=最新の状態がログとして残る」という、再現性の高いデータセットが自動構築される。
設計上の鉄則
- 非同期的な疎結合: Project側のコードにExcel側の詳細なロジックを書き込まない。
- 排他制御の考慮: 複数人が同時にアクセスする可能性があるExcelファイルの場合、書き込み時の競合を避けるエラーハンドリングが必須だ。
—
2. 実装コード:堅牢なロガーを作成する
プロジェクトファイルの `ThisProject` オブジェクトモジュールに以下のコードを配置する。
‘ プロジェクトの保存直前にトリガーされるイベント
Private Sub Project_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)
On Error GoTo ErrHandler
‘ 統計情報を収集し、Excelへ書き出すプロシージャを呼び出す
Call ExportProjectStatsToExcel
Exit Sub
ErrHandler:
‘ ログ出力でプロジェクト自体の保存を止めてはならない
Debug.Print “統計情報の出力に失敗しました: ” & Err.Description
End Sub
Private Sub ExportProjectStatsToExcel()
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Dim targetPath As String
‘ 集計用Excelファイルのパス(環境に合わせて変更)
targetPath = “C:\Reports\ProjectLog.xlsx”
‘ Excelインスタンスの確保(既に開いていれば取得、なければ生成)
Set xlApp = GetObject(, “Excel.Application”)
If xlApp Is Nothing Then Set xlApp = CreateObject(“Excel.Application”)
‘ ファイルを開く
Set xlWb = xlApp.Workbooks.Open(targetPath)
Set xlWs = xlWb.Sheets(“LogSheet”)
‘ データの追記(最終行の次の行を特定)
Dim nextRow As Long
nextRow = xlWs.Cells(xlWs.Rows.Count, 1).End(-4162).Row + 1 ‘ -4162 は xlUp
‘ 統計データの書き込み
With xlWs
.Cells(nextRow, 1).Value = Now ‘ タイムスタンプ
.Cells(nextRow, 2).Value = ActiveProject.Name
.Cells(nextRow, 3).Value = ActiveProject.PercentComplete ‘ 進捗率
.Cells(nextRow, 4).Value = ActiveProject.Cost ‘ 総コスト
.Cells(nextRow, 5).Value = ActiveProject.Work ‘ 総工数
End With
‘ 保存して閉じる
xlWb.Close SaveChanges:=True
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
End Sub
—
3. 現場で生き残るための「運用の注意点」
A. データベース連携の最適解
上記の例はシンプルにExcelへ追記しているが、対象プロジェクトが100を超え、履歴を長期保管するならExcelは限界を迎える。その場合は、「Excelはフロントエンド(閲覧用)」とし、バックエンドにはSQLiteやSQL Serverを置くべきだ。VBAからADODB経由でSQLを投げる設計に変更すれば、パフォーマンスは劇的に向上する。
B. エラー処理の哲学
`Project_BeforeSave` 内で致命的なエラーが発生し、プログラムが停止すると、プロジェクト自体の保存ができなくなるリスクがある。そのため、上記のコード例のように `On Error GoTo` を駆使し、「ロギングの失敗はプロジェクト保存を阻害しない」というフォールトトレラントな設計を徹底すること。
C. パフォーマンスへの影響
プロジェクトのタスク数が数万件を超える場合、保存のたびに統計情報を計算するのはコストがかかる。その場合は、`ActiveProject.ProjectSummaryTask` のプロパティのみを参照するように制限し、計算負荷を最小限に抑えるのが賢明だ。
—
結論:自動化は「思想」である
ツールを作ることは手段に過ぎない。真の目的は、「手作業を排除し、データに基づく意思決定を組織に根付かせること」にある。
このスクリプトを導入した瞬間から、あなたのプロジェクト管理は「感覚」から「計測可能」なものへと進化する。次にあなたがやるべきことは、蓄積されたExcelデータをPower BIに繋ぎ、全プロジェクトの進捗をダッシュボード化することだ。
エンジニアリングとは、常にその一歩先を見据えて設計するものだ。健闘を祈る。
