【実務・中級編】【中級者向け】プロジェクトの保存時に「プロジェクト統計情報」をExcelへ自動転記するワークフロー – Project VBA解析バイブル

スポンサーリンク

プロジェクト管理の「ブラックボックス」を解き放て: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に繋ぎ、全プロジェクトの進捗をダッシュボード化することだ。

エンジニアリングとは、常にその一歩先を見据えて設計するものだ。健闘を祈る。

タイトルとURLをコピーしました