【入門編】【パフォーマンス向上】画面更新を停止してマクロを高速化する:ScreenUpdatingとCalculationの制御 – Project VBA解析バイブル

スポンサーリンク

Project VBAの「重さ」を解き放て:ScreenUpdatingとCalculationで爆速化を実現する

こんにちは。現場で泥臭く、かつスマートに自動化を追求しているエンジニアです。

皆さんが書いたProject VBAのコード、実行すると画面がパタパタと小刻みに震え、処理が終わるまでコーヒーを淹れて戻ってきてもまだ動いている……なんてことはありませんか?

ProjectはExcelと異なり、タスクやリソースの依存関係を常に計算し直すという「重厚なエンジン」を積んでいます。「1行更新するたびに画面を描画し、依存関係を再計算する」というデフォルトの挙動は、数千件のタスクを扱う現場では致命的なボトルネックになります。

今日は、その「ブレーキ」を意図的に外すことで、処理速度を劇的に向上させる極意を伝授します。

なぜマクロは「遅い」のか?

Projectの裏側では、常に以下のコストが発生しています。

1. GUI更新(ScreenUpdating): 画面上でタスクのバーが動くたびに、OSが描画処理を走らせる。
2. 再計算(Calculation): 1つのタスクの日付が変わると、リンクされた後続タスク全てのスケジュールを再計算する。

この2つを「手動」に切り替えるだけで、処理速度は体感で数倍から数十倍に跳ね上がります。

爆速化の鉄板パターン:コードの書き方

まずは、この「おまじない」を覚えてください。マクロの冒頭と終了時に必ず配置する定型句です。

Sub OptimizedTaskUpdate()
‘ — 1. 処理開始:負荷の大きい設定をオフにする —
‘ 画面描画を停止
Application.ScreenUpdating = False
‘ 自動再計算を一時停止(手動モードへ)
Application.Calculation = pjManual

On Error GoTo ErrorHandler ‘ エラー発生時に設定を戻すための保険

‘ — ここに本番の処理を記述 —
Dim t As Task
For Each t In ActiveProject.Tasks
If Not t Is Nothing Then
t.Text1 = “Updated” ‘ 大量更新のシミュレーション
End If
Next t

‘ — 2. 処理終了:設定を元に戻す —
Application.ScreenUpdating = True
Application.Calculation = pjAutomatic
MsgBox “処理が完了しました。”
Exit Sub

ErrorHandler:
‘ 万が一エラーが起きても設定を戻さないとProjectが操作不能になるため必須
Application.ScreenUpdating = True
Application.Calculation = pjAutomatic
MsgBox “エラーが発生しました: ” & Err.Description
End Sub

このコードの「魂」:エラーハンドリングの重要性

初学者が最も陥りやすい罠が、「途中でエラーが起きた際に、設定を戻し忘れること」です。これをやると、Projectの画面が一切更新されなくなり、再起動するまで「死んだ状態」になります。

必ず `On Error GoTo` を使い、どんな状況でも設定をクリーンアップするようにしてください。これができるだけで、周りからの信頼度が格段に上がります。

陥りやすい「罠」と解決策

罠1:Calculationの罠

ExcelのVBAと異なり、Projectの `Calculation` プロパティは非常に強力です。これを `pjManual` にすると、リンク関係が一時的に無視されます。
もし、処理の途中で「タスクの日付を計算した結果を使いたい」というロジックがある場合は、 `Application.CalculateAll` を明示的に呼び出す必要があります。

罠2:Taskオブジェクトの走査

`For Each t In ActiveProject.Tasks` は便利ですが、大規模なプロジェクトでは非常に時間がかかります。もし特定の条件だけで良いのであれば、`Filter` を適用してから回すなど、「対象を絞り込んでからループする」のがプロの流儀です。

まとめ:ここをクリアすれば「脱・初心者」

今回学んだテクニックは以下の3点です。

  • ScreenUpdating = False: 画面の描き込みを止め、メモリへの書き込みに専念させる。
  • Calculation = pjManual: 複雑な依存関係の再計算をラスト1回に集約する。
  • エラーハンドリングの徹底: 処理失敗時にプロジェクトの状態を放置しない。

これらを意識するだけで、あなたの書くマクロは「ただ動くコード」から「現場を救うエンジニアの道具」へと進化します。

Project VBAは、その巨大なデータ構造ゆえに繊細な扱いが求められます。しかし、今回のような基礎的な「ブレーキの制御」をマスターすれば、もう怖いものはありません。ぜひ次のプロジェクトで試してみてください。

あなたの開発現場が、より軽快で快適なものになることを願っています。応援していますよ!

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