こんにちは!プロジェクト管理と自動化の限界を突破する「Project VBA」の世界へようこそ。
現場で長く使われているMicrosoft Project(Mpp)ファイルって、なぜかんだんファイルサイズが膨れ上がっていませんか? 「別に進捗しか入力していないのに、なぜか動作が重い…」「保存するたびにストレージを圧迫する…」そんな悩みを抱えたことはありませんか?
その原因の多くは、ユーザーが勝手に作成したり、外部ファイルからコピー&ペーストを繰り返すうちに溜まった「ゴミ(不要なカスタムビュー、テーブル、フィルタ、グループ)」の残留です。
今回は、Project VBAのオブジェクトモデルの深部を突くアプローチで、「プロジェクト保存時に、不要なカスタムビューやフィルタを一括削除してファイルを極限まで軽量化するメンテナンススクリプト」を一緒に作っていきましょう。
ここをクリアすれば、Project VBAの基本と「オブジェクトの寿命・管理」の本質がバッチリ見えてきますよ。優しく、そして深く解説していきますね!
—
なぜProjectファイルは「ゴミ」で肥大化するのか?
Excelなら不要なシートを消せば軽くなりますが、MS Projectの裏側には、タスクやリソースだけでなく、「視るための設定(ビュー)」「絞り込むための設定(フィルタ)」「並び替えるための設定(グループ)」がプロジェクトファイル内部のデータベースにこびり付くように保存されています。
特に厄介なのが、他人が作ったテンプレートや、他のプロジェクトからタスクをインポートしたときに「勝手についてくる」無数のカスタムオブジェクトです。これらは手動で1つずつ削除しようとすると、気が遠くなるようなクリック作業が必要です。
だからこそ、VBAで一網打尽に自動化するのです。
—
押さえておきたいProject VBAの基本構造
まずは、今回操作する「ビュー」や「フィルタ」がProjectのどこにいるのか、地図を見ておきましょう。
Excel VBAでいう `Worksheets` や `Range` のように、Project VBAにも根幹となるコレクションが存在します。
- `ActiveProject.Views` : プロジェクト内に存在するすべてのビュー(ガントチャート、タスク配分表など)のコレクション
- `ActiveProject.Filters` : タスクやリソースを絞り込むフィルタのコレクション
ここで一つ、上級者への第一歩となる極めて重要な注意点があります。
それは、「Microsoft Projectが標準で持っているビルトイン(最初から入っている)のビューやフィルタまで消してはいけない」ということです。ガントチャートや標準フィルタまで消してしまったら、ファイルが使い物にならなくなってしまいますよね。
したがって、削除してよいのは「ユーザーが独自に作成したカスタムビューやフィルタ(`Index` や `BuiltIn` プロパティで判定)」だけになります。
—
軽量化を実現する!実践VBAコード
それでは、実際にプロジェクトファイルを軽量化・最適化するための実用マクロのコードを公開します。
開発タブの「Visual Basic」を開き、標準モジュールにペーストしてそのまま使える実践的なコードです。
Sub OptimizeAndPurgeProject()
‘ =====================================================================
‘ テーマ: 不要なカスタムビュー・フィルタの一括削除によるプロジェクト軽量化
‘ 開発者ノート: ビルトイン(標準)オブジェクトを誤って削除しない安全設計
‘ =====================================================================
Dim vw As View
Dim flt As Filter
Dim deletedViewsCount As Long
Dim deletedFiltersCount As Long
‘ 処理件数のカウンター初期化
deletedViewsCount = 0
deletedFiltersCount = 0
‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お作法)
App.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ —————————————————————–
‘ 1. 不要なカスタムビューの削除
‘ —————————————————————–
‘ カウントダウンループ(コレクションの削除は後ろから回すのがVBAの鉄則!)
Dim i As Long
For i = ActiveProject.Views.Count To 1 Step -1
Set vw = ActiveProject.Views(i)
‘ 判定条件: 標準(ビルトイン)ではなく、かつ、現在適用されていないもの
If vw.BuiltIn = False Then
‘ 安全のため、現在画面に表示されているビューの削除を避ける
On Error Resume Next
vw.Delete
If Err.Number = 0 Then
deletedViewsCount = deletedViewsCount + 1
End If
On Error GoTo ErrorHandler
End If
Next i
‘ —————————————————————–
‘ 2. 不要なカスタムフィルタの削除(タスクフィルタを対象)
‘ —————————————————————–
For i = ActiveProject.Filters.Count To 1 Step -1
Set flt = ActiveProject.Filters(i)
‘ タスク用フィルタ(False)かつ、ビルトインではないものをターゲットに
‘ ※リソースフィルタも含めたい場合はロジックを拡張してください
If flt.Name <> “” And flt.BuiltIn = False Then
On Error Resume Next
flt.Delete
If Err.Number = 0 Then
deletedFiltersCount = deletedFiltersCount + 1
End If
On Error GoTo ErrorHandler
End If
Next i
‘ 画面描画を復元
App.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “プロジェクトの最適化が完了しました!” & vbCrLf & _
“・削除されたカスタムビュー数: ” & deletedViewsCount & vbCrLf & _
“・削除されたカスタムフィルタ数: ” & deletedFiltersCount & vbCrLf & _
“ファイルサイズを確認して保存してください。”, vbInformation, “最適化完了”
Exit Sub
ErrorHandler:
App.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
コードの深掘り解説:なぜこの書き方なのか?
ここからは、一歩進んだプログラミングの「急所」を解説します。なぜこのコードが堅牢で安全なのか、その理由を3つに分けてお伝えします。
1. コレクションの削除は「後ろから(逆順ループ)」行う
コードの中で `For i = ActiveProject.Views.Count To 1 Step -1` と、わざわざ後ろから数えてループを回しています。
もし前から順番(1, 2, 3…)に削除していくと、1番目を消した瞬間に元の2番目が1番目に繰り上がり、インデックス番号がズレてループがバグる(またはエラーで止まる)というVBAの有名な罠を踏みます。
コレクションから要素を消すときは「逆順ループ」がエンジニアの常識です。
2. `BuiltIn = False` でシステムを保護する
前述の通り、Microsoftが用意したデフォルトの機能(ガントチャートなど)は `BuiltIn = True` を持っています。
`If vw.BuiltIn = False` という条件でフィルターをかけることにより、「ユーザーが後から追加したゴミだけ」を正確にスナイプするように作られています。
3. `App.ScreenUpdating = False` によるパフォーマンス最適化
Projectは、ビューやフィルタが1つ消えるたびに画面やメモリの再描画を行おうとします。これが何十個もあると処理が猛烈に重くなります。
最初に描画を止め、最後に一気に復元させることで、一瞬で処理を終わらせるプロのテクニックを組み込んでいます。
—
陥りやすいエラーと対策
- エラー:「このビューは現在使用されているため削除できません」
- 原因: 今まさに自分が画面で開いているビューを消そうとした場合に発生します。
- 対策: スクリプトを実行する前に、必ず「標準ガントチャート」など、絶対に消されない安全なビューに切り替えてからマクロを実行するように運用ルールを決めましょう。
—
まとめ
今回は、Projectファイルの肥大化を防ぎ、動作を軽快にするためのカスタムビュー・フィルタの一括削除マクロを解説しました。
ここをクリアすれば、単なる「マクロの記録を貼り付ける人」から、プロジェクトのパフォーマンスをデザインできる「業務自動化エンジニア」への大きなステップアップになります。
現場のプロジェクトファイルをスリムに保ち、快適なスケジュール管理を実現してくださいね。それでは、次回の極限の知見でお会いしましょう!
