【入門編】【上級者向け】プロジェクトファイルの自動圧縮とアーカイブ保存の自動化 – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録から一歩抜け出して、「現場で即戦力となる自動化システム」を作りたいあなたへ。

今回は、MS Projectの運用において誰もが直面する「プロジェクトファイル肥大化問題」をスマートに解決する、ちょっと高度で最高にクールな技術をお伝えします。

テーマは「プロジェクトファイルの自動圧縮とアーカイブ保存の自動化」です。

「保存が終わったら、自動でZIPに固めて指定のアーカイブフォルダへ飛ばす」
これをVBAとWindows標準の機能(Shellオブジェクト)を組み合わせて完全自動化します。

ここをクリアすれば、あなたも立派なVBAエンジニアの仲間入りです。一緒に本質を学んでいきましょう!

なぜ「自動圧縮とアーカイブ保存」が必要なのか?

MS Projectの`.mpp`ファイルは、タスクやリソース、コストデータを詰め込んでいるため、長期間運用しているとファイルサイズが膨れ上がりがちです。

ストレージを圧迫するだけでなく、過去のバックアップファイルが散らかることで「どれが最新だっけ?」というヒューマンエラーの原因にもなります。

これを手動でやろうとすると:
1. ファイル名を今日の日付に変えて保存
2. エクスプローラーを開いてZIPに圧縮
3. アーカイブフォルダへドラッグ&ドロップ

……面倒ですよね?エンジニアなら、こんな作業は1秒で終わらせたいところです。VBAにすべてお任せしましょう!

全体像の把握:どうやって動くのか?

今回のプログラムの流れはシンプルです。

1. 現在開いているプロジェクトを上書き保存(または別名保存)する。
2. 保存したファイルの「フルパス」と「ファイル名」を取得する。
3. WindowsのShellオブジェクトの力を使って、裏側でこっそりZIPファイルに圧縮する。
4. 圧縮されたZIPファイルを、整理用のアーカイブフォルダへ移動させる。

ここで重要なポイントは、「VBA単体にはZIP圧縮機能がない」ということです。そのため、Windows標準機能である`Shell.Application`をVBAから呼び出して、OSに圧縮仕事を肩代わりさせます。ここが今回のアーキテクチャのキモです。

実装コード:そのまま使えるプロ仕様のVBA

以下のコードを、MS ProjectのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。

Sub AutoArchiveProject()
Dim projPath As String
Dim projName As String
Dim archiveDir As String
Dim dateStr As String
Dim zipPath As String
Dim sourceFile As String

‘ 1. エラーハンドリングの準備
On Error GoTo ErrorHandler

‘ 2. 現在のプロジェクトが保存されているかチェック
If ActiveProject.FullName = “” Then
MsgBox “このプロジェクトはまだ一度も保存されていません。先に手動で保存してください。”, vbExclamation, “保存エラー”
Exit Sub
End If

‘ 3. 現在のプロジェクトを上書き保存
ActiveProject.FileSave

‘ 4. パスとファイル名の取得
sourceFile = ActiveProject.FullName

‘ フォルダパスとファイル名を分解する準備
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

Dim folderPath As String
folderPath = fso.GetParentFolderName(sourceFile)
projName = fso.GetBaseName(sourceFile)

‘ 5. アーカイブ保存先フォルダの指定(今回は同じ階層に “Archive” フォルダを作る例)
archiveDir = folderPath & “\Archive”
If Not fso.FolderExists(archiveDir) Then
fso.CreateFolder (archiveDir)
End If

‘ 6. タイムスタンプ付きのZIPファイル名を生成(例: ProjectA_20231025.zip)
dateStr = Format(Now, “YYYYMMDD_HHNNSS”)
zipPath = archiveDir & “\” & projName & “_” & dateStr & “.zip”

‘ ZIPファイルの初期化(空のZIPヘッダーを作るおまじない)
CreateEmptyZip zipPath

‘ 7. Shellオブジェクトを使ってファイルをZIPに圧縮コピー
Dim sa As Object
Set sa = CreateObject(“Shell.Application”)

‘ 圧縮処理(OSのバックグラウンド処理が終わるまで少し待たせる)
sa.Namespace(zipPath).CopyHere sourceFile

‘ OSのコピー処理が完了するのを安全に待つループ(約2秒〜最大10秒)
Dim startTime As Single
startTime = Timer
Do Until sa.Namespace(zipPath).Items.Count > 0
DoEvents
If Timer – startTime > 10 Then Exit Do
Loop

MsgBox “プロジェクトの保存とアーカイブ化が完了しました!” & vbCrLf & _
“保存先: ” & zipPath, vbInformation, “処理成功”

Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub

‘ 【ヘルパー関数】空のZIPファイルを作成するプロシージャ
Private Sub CreateEmptyZip(ByVal zipFilePath As String)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 22バイトのZIP空ファイルヘッダーを書く
Dim ts As Object
Set ts = fso.CreateTextFile(zipFilePath, True)
ts.Write “PK” & Chr(5) & Chr(6) & String(18, vbNullChar)
ts.Close
End Sub

コードの深掘り解説:ここがエンジニアの腕の見せ所

1. `CreateObject(“Scripting.FileSystemObject”)` の活用

VBAの標準関数でもファイル操作はできますが、`FileSystemObject (FSO)`を使うと、パスの結合やフォルダの有無チェック、ファイル名の抽出が圧倒的にスマートに記述できます。現場では必須のテクニックです。

2. 空のZIPファイルを作る「魔法のおまじない」

`CreateEmptyZip`というプロシージャがありますよね。
実は、WindowsのShellオブジェクトに「ここにファイルを圧縮してくれ」と指示を出すには、あらかじめ中身が空の(正しいヘッダーを持った)ZIPファイルがディスク上に存在している必要があります。
バイナリデータ(`PK` とその後のヌル文字)を書き込んで強制的に空のZIPを作るこのテクニックは、Windows自動化の現場で代々受け継がれてきた知恵です。

3. 非同期処理への対策(`DoEvents` と `Timer`)

OSのシェルを使ったコピー(`CopyHere`)は、非同期(裏でこっそり実行)で行われます。
そのため、VBAが猛スピードで次の行に進んでしまうと、「ZIPファイルができる前にVBAが終了してしまい、中身が空っぽになる」という現象が起きがちです。
これを防ぐために、`Do Until` ループと `DoEvents` を組み合わせて、ファイルが確実にZIP内に格納されるまで優しく待たせています。この配慮がエンジニアとしての実力の見せ所です。

陥りやすいエラーと対策

1. 「ファイルが見つからない」エラーが出る

  • 原因: プロジェクトを一度も名前をつけて保存していない状態で実行すると、`ActiveProject.FullName` が空になりエラーになります。
  • 対策: コード内のステップ2でチェックを入れているため弾かれますが、必ず一度手動保存してから実行してください。

2. ZIPの中にファイルが入っていない(容量が22バイトのまま)

  • 原因: 前述の「OSの処理待ち時間」が足りていない場合に発生します。
  • 対策: ネットワークドライブなど、保存先が重いサーバー上の場合は、待機時間を少し長めに調整してください。

まとめ

今回は、Project VBAとWindows Shellを組み合わせた、ストレージ効率を最大化する自動アーカイブ手法を解説しました。

一見難しそうに見える処理も、オブジェクトのライフサイクルとWindowsの仕組みを理解すれば、たったこれだけのコードで堅牢な自動化システムに仕上がります。

ここをクリアできたあなたなら、もうマクロの記録器にしがみつく必要はありません。ぜひ明日の実務に取り入れて、周りをあっと言わせるような自動化を達成してくださいね!それでは、次のステージでお会いしましょう。

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