【入門編】【中級者向け】プロジェクトの保存時にPDFレポートを自動生成し、指定フォルダへ格納するワークフロー – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で「毎週末の進捗報告用に、ガントチャートを綺麗にPDF化して、日付ごとのフォルダに整理して……」なんていう手作業に、密かに疲弊していませんか?

マクロの記録から一歩抜け出し、「そろそろVBAで業務を自動化したい」と願うあなたへ。今回は、プロジェクトの保存(FileSaveイベント)のタイミングをフックして、自動的にガントチャートをPDF化し、指定した日付フォルダへ格納するワークフローを構築します。

ここをクリアすれば、Project VBAのオブジェクトモデルのクセや、実務で使えるイベント処理の基本がバッチリ見えてきますよ。さあ、ワンランク上の自動化の世界へ一緒に踏み出しましょう!

1. 現場でありがちな課題と、今回のアーキテクチャ

MS Projectは、ExcelのVBAとは少し空気感が違います。オブジェクトの寿命や、イベント(いつ処理を実行するか)の捉え方に独特のルールがあるためです。

手作業でやると…
1. 「名前を付けて保存」を開く
2. 今日の日付のフォルダがなければ作る
3. 印刷プレビューやPDF出力ダイアログを操作して保存する
……という一連のルーティン。これをVBAの「プロジェクト保存時イベント(FileSave / FileSaveAs)」にフックさせ、完全に裏側で自動化してしまいましょう。

全体像のワークフロー

1. ユーザーがプロジェクトを保存しようとする。
2. Project VBAがそれを検知し、イベントプロシージャが発火。
3. 本日の日付(例: `20231025`)の専用フォルダがなければ自動作成。
4. ガントチャートビューをアクティブにし、指定パスへPDFとして出力。
5. 保存処理がスムーズに完了!

2. 開発の準備:イベントプロシージャの心構え

MS Projectで「何か動作した時にマクロを走らせる」には、通常の標準モジュールではなく、`ThisProject`モジュールを使用します。これが最初のつまずきポイントになりやすいので注意してください。

  • 標準モジュール (`Module1` など): ボタンをクリックして手動で動かすコード置き場。
  • `ThisProject` モジュール: プロジェクト自体のライフサイクル(開く、閉じる、保存するなど)を監視する特殊な場所。

3. 実装コード:コピペで動く実用スクリプト

それでは、実際のコードを公開します。
`ThisProject` モジュールに以下のコードをそのまま貼り付けてください。実務でそのまま耐えうるよう、エラーハンドリングとフォルダ自動生成ロジックを組み込んでいます。

‘ ==============================================================================
‘ モジュール名: ThisProject
‘ 概要: プロジェクト保存時に自動で日付フォルダを作成し、ガントチャートをPDF出力する
‘ ==============================================================================

Private Sub Project_BeforeSave(ByVal ASAsNewName As Boolean)
On Error GoTo ErrorHandler

Dim targetDir As String
Dim fso As Object
Dim pdfPath As String
Dim todayStr As String

‘ 1. 保存先ルートディレクトリの指定(環境に合わせて書き換えてください)
targetDir = “C:\ProjectReports\”

‘ 2. 日付文字列の生成 (例: 2023年10月25日なら “20231025”)
todayStr = Format(Date, “YYYYMMDD”)

‘ 3. 日付別サブフォルダのパスを決定
targetDir = targetDir & todayStr & “\”

‘ 4. FileSystemObjectを使ってフォルダの存在確認・自動作成
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(targetDir) Then
fso.CreateFolder targetDir
MsgBox “本日のレポート用フォルダを自動作成しました:” & vbCrLf & targetDir, vbInformation, “自動化システム”
End If

‘ 5. PDFのファイル名を動的生成(プロジェクト名 + 日付.pdf)
‘ ※未保存の新規プロジェクトの場合は「Untitled」を回避
Dim projName As String
If ActiveProject.Name <> “” Then
‘ 拡張子(.mpp)を除いたファイル名を取得
projName = Left(ActiveProject.Name, InStrRev(ActiveProject.Name, “.”) – 1)
Else
projName = “ProgressReport”
End If

pdfPath = targetDir & projName & “_” & todayStr & “.pdf”

‘ 6. ガントチャートビューに切り替えてからPDF出力
‘ (※Projectは現在アクティブなビューを印刷・出力する仕様のため)
ViewApply Name:=”ガント チャート”

‘ 7. PDF出力実行 (MS Project標準のレポート/印刷機能を利用)
‘ ※環境やバージョンによってメソッドが異なる場合があります
DocExport pdfPath

‘ 後片付け
Set fso = Nothing
Exit Sub

ErrorHandler:
‘ 予期せぬエラーで保存自体が阻害されないためのセーフティネット
MsgBox “PDF自動出力の過程でエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “自動化エラー”
Set fso = Nothing
End Sub

4. コードの深掘り解説:ここがエンジニアのこだわりポイント

初心者のうちは「動けばいいや」となりがちですが、実務で使うプログラミングには「頑健性(エラーへの強さ)」が求められます。上記のコードの重要ポイントを紐解きます。

① `ThisProject` のイベントを使う意味

Excel VBAの `Workbook_BeforeSave` と同様に、ユーザーが「保存」ボタンを押した瞬間(あるいは `Ctrl + S` を押した瞬間)に、コードが裏側で走ります。「保存し忘れてPDFがない!」というヒューマンエラーを根絶するためのアーキテクチャです。

② FileSystemObject (FSO) による安全なフォルダ生成

`MkDir` 命令を使うこともできますが、すでにフォルダが存在する場合にエラー(エラー75: パス名が無効です)が発生してしまいます。
`Scripting.FileSystemObject` の `FolderExists` でチェックし、なければ `CreateFolder` で作るというフローにすることで、何度保存ボタンを押しても絶対にクラッシュしない堅牢なコードに仕上がっています。

③ なぜ出力前に `ViewApply Name:=”ガント チャート”` を挟むのか?

ここがMS Project特有の罠です。Projectの印刷・エクスポート系メソッドは、「ユーザーが今画面で見ているアクティブなビュー」を忠実に出力するという特性を持っています。
もしユーザーが「リソース配分ビュー」や「タスクシート」を開いたまま保存したら、PDFにはガントチャートではなく見づらい表が出力されてしまいます。そのため、コード側で強制的に「ガント チャート」ビューに切り替えてからエクスポートさせるのが、プロの技なのです。

5. 陥りやすいエラーとトラブルシューティング

実際に導入する際につまずきやすいポイントを先回りして解説します。

  • Q. 保存時に「コンパイルエラー: メンバーが見つかりません」と言われる。
  • A. MS Projectのバージョン(2016, 2019, 2021, Microsoft 365など)やエディションによって、PDF出力やエクスポート関連の内部コマンド(`DocExport` など)の挙動が異なる場合があります。もしお使いの環境で `DocExport` がうまく機能しない場合は、一度「マクロの記録」を起動しながら手動でPDF保存操作を行い、生成されたコード(`FilePrint` や `ReportAcrobat` など)をここに差し替えてみてください。
  • Q. フォルダのパスエラーが出る。
  • A. コード内の `targetDir = “C:\ProjectReports\”` の部分は、ご自身のPCや共有サーバーのパスに変更してください。また、末尾の `\`(バックスラッシュ)を忘れるとパスが結合したときに `C:\ProjectReports20231025\` のようになってしまうので注意が必要です。

まとめ:自動化の第一歩を踏み出したあなたへ

今回は、プロジェクトの保存と連動してPDFレポートを自動生成・整理するワークフローを構築しました。

「保存するだけで、勝手に綺麗なガントチャートが日付ごとに整理されていく」

たったこれだけの自動化ですが、毎週末のルーチンワークにかかっていた精神的・時間的コストは確実にゼロになります。プログラミングの本質は、私たち人間を「退屈な作業」から解放し、クリエイティブな思考に集中させることにあります。

ぜひ今回のコードをあなたの開発環境に組み込んで、快適なプロジェクト管理ライフを手に入れてくださいね。それでは、次回の極限知見でお会いしましょう!

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