プロジェクトの「今」を掴め。Project VBAで実現する、自動ログ収集の極意
こんにちは。Project VBAの世界へようこそ。
日々、MS Projectでスケジュールと格闘している皆さん。プロジェクトの進捗を報告するために、わざわざ手作業でExcelに数値を転記していませんか?
「先週の進捗率は何%だったっけ?」「コストの推移をグラフにしたいけど、データが蓄積されていない…」
そんな悩みを持つあなたへ。今日は、プロジェクトを保存するたびに、重要な統計情報を自動でExcelへ追記するという、現場で最も重宝されるワークフローを伝授します。
これは単なる自動化ではありません。あなたのプロジェクトの「履歴(ヒストリー)」を刻む、最も効率的な一歩です。
—
なぜ「マクロの記録」ではダメなのか?
まず、耳の痛い話から始めましょう。
ExcelのVBAには「マクロの記録」ボタンがありますが、Projectにはそれがありません。
Project VBAは、オブジェクトの階層構造を理解し、メモリ上で何が起きているかをイメージできる者だけが操れる「職人の道具」です。まずは、今回の主役となるオブジェクトを把握しましょう。
- `ActiveProject`: 今開いているプロジェクトそのもの。
- `Project.ProjectSummaryTask`: プロジェクト全体の進捗率やコスト情報が詰まった、いわばプロジェクトの「要約ノード」。
ここを触れるようになれば、あなたはもう初心者ではありません。
—
現場で使える!自動転記コードの全貌
以下のコードを、Projectの `ThisProject` モジュール(または標準モジュール)に配置してください。
‘ プロジェクト保存時に実行されるイベントプロシージャ
Private Sub Project_BeforeSave(ByVal pj As Project, ByVal SaveAsUi As Boolean, Cancel As Boolean)
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Dim filePath As String
‘ 集計用Excelファイルのパス(適宜変更してください)
filePath = “C:\Reports\ProjectLog.xlsx”
‘ Excelを制御するためのオブジェクトを生成
Set xlApp = CreateObject(“Excel.Application”)
Set xlWb = xlApp.Workbooks.Open(filePath)
Set xlWs = xlWb.Sheets(1)
‘ 次の書き込み行を探す(A列の最終行の次)
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 = pj.Name ‘ プロジェクト名
.Cells(nextRow, 3).Value = pj.ProjectSummaryTask.PercentComplete ‘ 進捗率
.Cells(nextRow, 4).Value = pj.ProjectSummaryTask.Cost ‘ コスト
End With
‘ 保存して閉じる
xlWb.Close SaveChanges:=True
xlApp.Quit
‘ メモリ解放(プロの作法)
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
MsgBox “統計情報をログに保存しました。”
End Sub
コードのここがポイント!
1. `Project_BeforeSave` イベント:
保存ボタンを押した「その瞬間」にコードが走ります。ユーザーが意識せずともデータが溜まる仕組みです。
2. `CreateObject`:
あえてExcelを「参照設定」せず、Late Binding(後方バインディング)で作成しました。これにより、Excelのバージョン違いによるエラーを回避し、配布時のトラブルを最小限に抑えられます。
3. オブジェクトの解放:
`Set … = Nothing` を忘れないこと。これを怠ると、裏でExcelがゾンビのように残り続け、メモリを圧迫します。職人たるもの、後始末まで完璧に。
—
陥りやすい罠と解決策
初学者が必ず突き当たる壁が2つあります。
1. 「プロジェクトが開けません」エラー
Excelファイルが既に開かれている場合、コードは失敗します。
- 解決策: 運用時は「ログ用のExcelは常に閉じておく」か、コード内で `If` 文を使い、既に開いているExcelがあればそれを掴むような処理に拡張しましょう。
2. 進捗率が「0%」になる
プロジェクトの「プロジェクトサマリータスク」が正しく設定されていない場合、値が取れないことがあります。
- 確認法: プロジェクトのオプションで「プロジェクトサマリータスクを表示」にチェックが入っているか確認してください。ここが全てのデータの起点となります。
—
次のステップ:君だけの自動化へ
このコードを実装できたなら、次は以下のような拡張に挑戦してみてください。
- ベースラインとの乖離: `pj.ProjectSummaryTask.BaselineCost` と比較して、予算オーバーしていないか判定する。
- メール通知: 予算超過時に、自動でPMにアラートメールを飛ばす。
Project VBAを操れるようになると、あなたはただの「進捗入力係」から「プロジェクトの状況を可視化するアーキテクト」へと進化します。
「面倒な作業はすべて機械に任せ、人間は意思決定に集中する」。これが、エンジニアとしての理想の姿です。
ここをクリアしたあなたなら、もう大丈夫。自信を持って、次の自動化へ踏み出してください!
何か詰まったら、いつでも戻ってきてくださいね。応援しています。
