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

スポンサーリンク

Project VBAの「画面更新」を掌握せよ:実行時間を劇的に短縮する最適化の鉄則

MS ProjectのVBAを扱う際、あなたは「処理の重さ」に絶望したことはないか?
数千行のタスクを一括更新しようとして、画面が激しく点滅し、砂時計アイコンを眺めながら数分間待たされる——。これは単なるPCの性能不足ではない。「エンジニアとしての設計思想の欠如」が生んだ悲劇だ。

Project VBAにおいて、`Application.ScreenUpdating`を制する者は、パフォーマンスを制する。今回は、現場で「動く」レベルではなく、「爆速かつ堅牢」に動作するプロダクションコードの書き方を伝授する。

1. なぜ「画面更新」がボトルネックになるのか

MS ProjectのUIは、タスクやリソースの変更があるたびに、ガントチャートの描画、依存関係の再計算、クリティカルパスの再評価を即座に実行しようとする。

マクロで100個のタスクの「開始日」を変更する際、何も対策を講じなければ、Projectは100回分の再描画と再計算を裏で行う。これが重くないはずがない。我々がやるべきことは、「すべての変更が完了するまで、Projectに余計な仕事をさせない(黙らせる)」ことだ。

2. 堅牢な実装:`PerformanceController` パターン

単に `ScreenUpdating = False` を書くだけでは不十分だ。もし実行中にエラーが発生したらどうなるか? 画面更新がオフのままフリーズし、ユーザーは二度と画面を見ることができない。

現場のプロとして、「例外発生時でも必ず画面更新を復帰させる」設計が必須である。

爆速化を実現するプロダクションコード例

‘ — プロダクションレベルの最適化テンプレート —
Sub OptimizeTaskUpdating()
‘ 1. 現在の状態を退避
Dim oldScreenUpdating As Boolean
oldScreenUpdating = Application.ScreenUpdating

‘ 2. パフォーマンス最適化の開始
Application.ScreenUpdating = False

‘ エラーハンドリングの導入(必須)
On Error GoTo ErrorHandler

‘ — ここに大量処理を記述 —
Dim t As Task
For Each t In ActiveProject.Tasks
If Not t Is Nothing Then
t.Text1 = “Updated by Pro Engineer”
End If
Next t
‘ —————————-

Cleanup:
‘ 3. 状態の復帰(いかなる場合も必ず実行する)
Application.ScreenUpdating = oldScreenUpdating
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume Cleanup
End Sub

3. 計算モードの制御:さらなる高みへ

大規模なプロジェクトファイルでは、`ScreenUpdating` だけでは足りない場合がある。依存関係(リンク)が複雑な場合、タスク値を書き換えるたびに「再計算」が走り、ここが処理の足を引っ張る。

残念ながらMS Projectのオブジェクトモデルには、Excelの `Application.Calculation` のような単一のスイッチは存在しない。しかし、以下のテクニックで負荷を抑制できる。

  • CalculationModeの考慮: 必要であれば `Application.Calculation = pjManual` を一時的に設定し、最後に `CalculateAll` を呼ぶアプローチが有効だ。
  • 不要なビューの切り替え: 処理中は、計算負荷の低い「タスクシート」ビューに切り替えておくことも、隠れた高速化の極意である。

4. データベース連携時の落とし穴

外部DB(SQL ServerやSharePoint等)からデータを読み込み、Projectに書き込む際、「1レコードごとに保存(Save)」を繰り返すのは愚の骨頂だ。

1. メモリ上でProjectのオブジェクトを操作する。
2. 更新が終わるまで画面と計算をロックする。
3. 最後に一度だけ保存処理を呼ぶ。

この「トランザクション的な思考」が、あなたのツールを「数分かかるツール」から「一瞬で終わるツール」へと変貌させる。

リーダーからの提言:コードは「資産」であれ

「動けばいい」というコードは、数ヶ月後の自分への負債だ。
今回の `PerformanceController` パターンは、単なる高速化テクニックではない。エラー時にもシステムを正常な状態に復帰させるという「保守性」への敬意である。

君たちが開発するそのツールが、現場の担当者の時間をどれだけ奪い、あるいはどれだけ救うか。すべては、この数行の制御コードに懸かっている。

さあ、コードを書き換えろ。そして、Projectの真の性能を解き放つんだ。

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