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の真の性能を解き放つんだ。
