【入門編】【上級者向け】大規模プロジェクトの高速保存:不要なビューやキャッシュを最適化する – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。

Microsoft Project(以下、MS Project)を使って大規模なプロジェクトを管理していると、「ファイルの保存に時間がかかる」「ファイルサイズがいつの間にか数十MBに膨れ上がって、開くだけで一苦労する」といった問題に直面したことはありませんか?

実は、MS Projectのファイル(`.mpp`)の内部では、タスクやリソースのデータだけでなく、過去に表示した「ビュー」のレイアウト情報、表示用キャッシュ、一時的な計算結果などが複雑に絡み合って蓄積されています。これらが「ファイルのメタボ化(肥大化)」を引き起こし、保存処理を著しく遅くしている主犯なのです。

「マクロの記録」から一歩踏み出し、VBAの力でこのブラックボックスを最適化してみませんか?
一見すると難しそうなテーマですが、本質を理解すればとてもシンプルです。この記事を読み終える頃には、大規模プロジェクトを劇的に軽量化・高速保存するプロのテクニックが身についているはずです。

「ここをクリアすれば、Project VBAの基本はバッチリですよ」と胸を張って言えるよう、優しく丁寧に解説していきますね。

1. なぜProjectファイルは「重く」なるのか?

まずは、原因をシンプルに整理しましょう。
MS Projectがファイルを保存するとき、単に「タスクのリスト」を保存しているわけではありません。以下のような「目に見えないデータ」も一緒に抱え込んで保存しています。

【一般的な.mppファイルの中身】
┌────────────────────────────────────────┐
│ 1. タスク・リソースの実データ(軽い) │
├────────────────────────────────────────┤
│ 2. 自動計算の履歴・キャッシュ(重い) │
├────────────────────────────────────────┤
│ 3. 一時的に作成したカスタムビュー │
│ および、画面ごとの描画キャッシュ │ <--- ココが不要に肥大化する! └────────────────────────────────────────┘ 特に、以下のような操作を繰り返すとファイルがどんどん重くなります。

  • 一時的なフィルタやグループ化を適用したビューを、そのまま保存する。
  • 自動計算(再計算)が何度も走り、不要な計算キャッシュが蓄積される。
  • 画面の描画(スクリーン更新)を有効にしたまま大量のデータを処理・保存する。

これらをVBAで「保存の直前」にクレンジング(お掃除)してあげるだけで、ファイルサイズは劇的に縮小し、保存速度は驚くほど高速になります。

2. 高速保存を実現する3つのアプローチ

今回の最適化マクロで実践するアプローチは、以下の3つです。

1. 「一時的なカスタムビュー」を削除し、標準の「ガントチャート」ビューに戻す

  • 開いている画面(ビュー)が多いと、それぞれの描画キャッシュが保存されてしまいます。保存時は一番シンプルなビューに固定します。

2. 一時的に「自動計算」を止め、最後に一括して再計算する

  • 保存時に何度も無駄な計算が走るのを防ぎます。

3. 描画(スクリーン更新)をオフにする

  • VBA処理中の画面のチラつきを抑え、処理速度を限界まで高めます。

3. 【実践コード】極限まで無駄を削ぎ落とす「高速クリーン保存マクロ」

それでは、実際のVBAコードを見てみましょう。
初心者の方でも安心してコピペして使えるよう、エラー処理や詳細なコメントを完備しています。モジュールに貼り付けて実行してみてください。

Option Explicit

”’

”’ プロジェクトファイルを最適化し、高速にクリーン保存するメインルーチン
”’

Public Sub OptimizeAndSaveProject()
Dim targetProject As Project
Set targetProject = ActiveProject

‘ 1. 安全対策:プロジェクトが開かれていない場合は処理を抜ける
If targetProject Is Nothing Then
MsgBox “アクティブなプロジェクトが見つかりません。”, vbExclamation, “実行エラー”
Exit Sub
End If

‘ パフォーマンス向上のための準備(画面更新の停止など)
On Error GoTo ErrorHandler
Call SpeedUpProject(True)

‘ 2. ビューのクレンジング(標準ビューへの切り替えと、不要な一時ビューの削除)
Dim originalViewName As String
originalViewName = targetProject.CurrentView

‘ 保存用の軽量な標準ビュー「ガント チャート」に一時的に切り替える
‘ (これにより、複雑なビューの描画キャッシュが保存されるのを防ぎます)
On Error Resume Next
ViewApplyEx Name:=”ガント チャート”
On Error GoTo ErrorHandler

‘ 3. 不要なカスタムビューのクレンジング
‘ ※Global.mpt(共通テンプレート)に影響を与えないよう、
‘ このプロジェクトファイル固有の一時的なビューを削除します。
Call CleanUpTemporaryViews(targetProject)

‘ 4. 計算エンジンの最適化
‘ 保存直前に一度だけ明示的に再計算(リカルク)を実行し、計算整合性を整える
CalculateAll

‘ 5. クリーンセーブ(保存実行)
‘ FileSaveメソッドを呼び出し、ストレージへの物理書き込みをトリガーします
Dim success As Boolean
success = Application.FileSave

‘ 6. 元のビューに復帰させる(ユーザーの作業性を損なわないための優しさ)
On Error Resume Next
If originalViewName <> “” Then
ViewApplyEx Name:=originalViewName
End If
On Error GoTo ErrorHandler

‘ パフォーマンス設定を元に戻す
Call SpeedUpProject(False)

‘ 完了メッセージ
If success Then
MsgBox “プロジェクトの最適化と保存が完了しました!” & vbCrLf & _
“不要なビューキャッシュが削除され、ファイルが軽量化されました。”, _
vbInformation, “最適化完了”
End If

Exit Sub

ErrorHandler:
‘ 万が一エラーが発生した場合も、必ず画面更新の設定などは元に戻す(重要!)
Call SpeedUpProject(False)
MsgBox “エラーが発生しました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
End Sub

”’

”’ 画面描画や自動計算を制御し、VBAの処理速度を極限まで高めるサブシステム
”’

Private Sub SpeedUpProject(ByVal enableSpeedUp As Boolean)
If enableSpeedUp Then
‘ 画面更新を停止して描画負荷をゼロにする
Application.ScreenUpdating = False
‘ 自動計算を一時的に「手動」に切り替える
Application.Calculation = pjManual
Else
‘ 処理が終わったら画面更新を再開する
Application.ScreenUpdating = True
‘ 自動計算を「自動」に戻す
Application.Calculation = pjAutomatic
End If
End Sub

”’

”’ プロジェクト内に溜まった「一時的なカスタムビュー」を安全に削除する
”’

Private Sub CleanUpTemporaryViews(ByRef proj As Project)
Dim v As View
Dim i As Long

‘ ビューのコレクションを後ろからループして、不要なカスタムビューを削除します
‘ (前から消すとインデックスがずれてエラーになるため、後ろからループするのがプロの鉄則です)
For i = proj.Views.Count To 1 Step -1
Set v = proj.Views.Item(i)

‘ 【重要】標準ビュー(ガントチャートやリソースシート等)は絶対に消さないよう保護します
‘ ここでは「一時的(Temporary)」という名前がついたビューや、
‘ 特定の条件に合致するカスタムビューを安全に削除対象とします。
If InStr(1, v.Name, “一時”) > 0 Or InStr(1, v.Name, “Temp”) > 0 Then
‘ 現在アクティブなビューは削除できないため、安全を確認して削除
If proj.CurrentView <> v.Name Then
proj.Views.Item(i).Delete
End If
End If
Next i
End Sub

4. コードのポイントと「プロの知恵」

このコードには、単純な「マクロの記録」では絶対に生成されない、プロの開発者が実践している設計思想が詰め込まれています。重要なポイントを3つに絞って解説しますね。

① ループ処理は「後ろから(Step -1)」回す

ビューやタスクなど、何かを「削除」するループ処理を行うときは、必ず `For i = Count To 1 Step -1` のように逆順で処理します。
前から(1から順に)消してしまうと、1つ消した瞬間に全体の数が減り、インデックス(番号)がずれて「インデックスが範囲外です」というエラーが発生してしまうからです。

② 保存する時のビューは「ガント チャート」にする

複雑なフィルターやグループ化が適用された独自のビューを表示したまま保存すると、MS Projectはその「複雑な表示状態(キャッシュ)」も一緒に保存しようとするため、ファイルサイズが大きくなります。
保存する直前に、最もシンプルで標準的な「ガント チャート」に切り替えることで、余計な描画キャッシュの保存を防ぐことができます。もちろん、保存が終わったらマクロが自動で元のビューに戻してくれるので、ユーザーの手間は一切ありません。

③ `Global.mpt`(グローバルテンプレート)への影響を防ぐ

MS Projectには、すべてのファイルで共有される共通設定ファイル(`Global.mpt`)が存在します。
マクロでむやみにビューを削除すると、この共通テンプレート側のビューまで消してしまう危険性があります。上記のコードでは、`targetProject.Views`(そのファイル固有のビューコレクション)に対してのみ操作を行うため、安全性が極めて高い設計になっています。

5. 初心者が陥りがちな罠と回避策

Project VBAを扱う上で、誰もが一度は引っかかる罠があります。事前に知っておけば、トラブルをスマートに回避できますよ。

罠:画面更新(`ScreenUpdating`)を止めたままエラーで終了してしまう

速度向上のために `Application.ScreenUpdating = False` を実行したあと、コードの途中でエラーが発生して強制終了すると、「MS Projectの画面が一切動かなくなった(固まった)」ように見えてしまいます。

  • 回避策: コード内に `On Error GoTo ErrorHandler` を記述し、万が一エラーが起きても、必ず `ErrorHandler:` の中で `Application.ScreenUpdating = True` を実行して画面更新を復旧させる仕組み(セーフティネット)を組み込んでおきましょう。上記のサンプルコードではこの対策がバッチリ施されています。

まとめ:Project VBAを掌握したあなたへ

お疲れ様でした!
一見難しそうな「大規模プロジェクトの高速保存と最適化」も、紐解いてみれば「不要なキャッシュを削り、一時的に処理を効率化し、安全に保存する」というシンプルなステップの積み重ねであることがお分かりいただけたかと思います。

この記事で紹介したテクニックは、実務の現場で以下のような劇的な効果をもたらします。

  • ファイルサイズが半分以下に削減される。
  • ネットワーク共有フォルダ上での保存・同期スピードが劇的に向上する。
  • ファイルを開く際の「クラッシュ(異常終了)」のリスクが減る。

ここをクリアできれば、Project VBAの基本、そして実務に即した応用力はバッチリです!
ぜひ、あなたの職場の重たいプロジェクトファイルにこの魔法をかけて、快適な業務自動化ライフを手に入れてくださいね。

また次のステップでお会いしましょう。応援しています!

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