【入門編】【上級者向け】大規模プロジェクトにおける「画面更新停止」と「計算モード制御」によるVBA高速化の極意 – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進み、「自分の手でプロジェクトの時間を支配したい」そう思われたなら、あなたはもう立派なエンジニアの卵です。

今回は、数万件に及ぶ巨大なWBS(ワークブレイクダウンストラクチャー)を扱う現場で必ず直面する、「パフォーマンスの壁」を鮮やかに突破する極意をお伝えします。

ここをクリアすれば、Project VBAの基本はバッチリですよ。さあ、一緒にプロの扉を開きましょう!

—

なぜ、大規模なWBSの操作は「遅い」のか?

数万行のタスクを持つプロジェクトファイルで、VBAを使って次々とタスクを追加したり、前提条件(リンク)を設定したりしたとき、こんなイライラを経験したことはありませんか?

> 「あれ…? 1行追加するごとに画面がチラチラして、砂時計がクルクル回って、終わるまでコーヒーが何杯も飲めるぞ……?」

この現象の元凶は、MS Projectの「おせっかいな優しさ」にあります。

Projectは、私たちがVBAで1つのタスクを追加したり変更したりするたびに、裏側で以下のような大仕事をその都度こなしています。

1. 画面の再描画(UIの更新): ディスプレイに最新の状態を表示し直す
2. スケジューリング計算(計算エンジン): カレンダー、リソース、依存関係(先行・後続)を再計算し、全体のスケジュールを弾き直す

1タスクあたり数ミリ秒だとしても、それが1万タスクあれば…? そう、何十分もの無駄な時間が生まれます。プロの現場では、この「毎回の自動計算と画面更新」を一時的にシャットアウトし、裏側で一気に処理を完結させます。これが今回マスターする「実行環境の制御」です。

—

瞬速の魔法:使うべき2つのプロパティ

MS ProjectのVBAには、この重たい処理をコントロールするための強力なスイッチが用意されています。

1. `Application.ScreenUpdating` (画面更新の制御)

  • `False` にすると、画面の描画がピタッと止まります。人間には見えませんが、裏側では高速に処理が進みます。

2. `Project.Calculation` (計算モードの制御)

  • これを「手動(Manual)」に切り替えると、タスクを追加してもスケジュールが勝手に再計算されなくなります。

この2つを組み合わせることで、数万タスクの構築であっても、まるで瞬きするようなスピードで完了させることができるのです。

—

【実践】画面更新停止&計算モード制御のテンプレートコード

それでは、実際の現場でそのまま使える、安全で堅牢なプロシージャ(コード)を見ていきましょう。

ここで重要なのは、「エラーが発生しても、必ず元の設定(画面を表示する・自動計算に戻す)に復旧させること」です。これを怠ると、Projectがフリーズしたような状態になり、ユーザーがパニックを起こします。`On Error GoTo` を使った後始末の作法(例外処理)は、プロの必須マナーです。

Sub HighSpeedTaskBuilder()
Dim prj As Project
Set prj = ActiveProject

‘ — 【1. 現在の状態を退避 & 高速化モードに移行】 —
‘ 画面の描画を停止し、パフォーマンスを最大化します
Dim orgScreenUpdating As Boolean
orgScreenUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False

‘ 計算モードを「手動(Manual)」に変更します
Dim orgCalculation As PjCalculation
orgCalculation = prj.Calculation
prj.Calculation = pjCalculationManual

‘ 万が一のエラー時に設定が戻らなくなるのを防ぐトラップを設定
On Error GoTo ErrorHandler

Dim startTime As Double
startTime = Timer ‘ 処理時間計測用

‘ — 【2. 重たい大量処理のシミュレーション】 —
Dim i As Long
Dim t As Task

Debug.Print “— 大量タスクの作成を開始します —”

‘ 例として1000件のタスクを一気に作成(※実際の現場では数万件を想定)
For i = 1 to 1000
Set t = prj.Tasks.Add(“タスク ” & i)
t.Duration = “8h” ‘ 所要時間を8時間に設定

‘ 最初のタスク以外は、一つ前のタスクに先行リンクを貼る
If i > 1 Then
t.TaskDependencies.Add From:=prj.Tasks(i – 1), Type:=pjLinkFinishToStart
End If
Next i

‘ — 【3. 処理の完了と明示的な再計算】 —
‘ 計算モードを手動にしていたため、最後に一度だけ全体を再計算させます
prj.Calculate

‘ 正常終了のメッセージ
MsgBox “処理が完了しました! 実行時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation

ErrorHandler:
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If

‘ — 【4. 実行環境の確実に復旧(クリーンアップ)】 —
‘ ここが極めて重要!エラーが起きようとも、必ず元の設定に戻します
Application.ScreenUpdating = orgScreenUpdating
prj.Calculation = orgCalculation

Debug.Print “— 環境を正常に復旧しました —”
End Sub

—

コードの解説:ここがエンジニアのこだわりポイント!

初心者の方からよくある質問が、「なぜわざわざ元の設定を変数(`orgScreenUpdating` など)に覚えておくの?」という点です。

  • 環境を汚さない(State Restoration)

マクロを動かす前のユーザーのPC環境を、マクロ終了時に1ミリたりとも狂わせずに元通りにする。これがプロのコードです。「マクロを実行したら、なぜかProjectの画面が真っ白のままになった」「自動計算しなくなった」なんてトラブルを絶対に起こさないための優しさでもあります。

  • 最後の `prj.Calculate` の意味

計算モードを `pjCalculationManual` にしている間は、タスク間の依存関係(先行・後続)による日付の押し出し計算が行われません。そのため、すべてのタスクとリンクを構築し終えた最後に、一度だけ `prj.Calculate` を叩いて、プロジェクト全体を正しいスケジュールに整合させています。これによって計算コストを「1回」に抑え込んでいるのです。

—

陥りやすい罠とエラー回避のコツ

1. 「あれ、タスクを追加したのに日付が変わらない!?」

  • 原因: 計算モードを `pjCalculationManual` にしたまま `prj.Calculate` を書き忘れている、あるいはコードの途中でエラー終了して手動モードが固定されてしまっています。
  • 対策: 万が一フリーズや強制終了した場合は、一度VBE(VBAエディタ)のイミディエイトウインド゙や別のプロシージャで `ActiveProject.Calculation = pjCalculationAutomatic` と手動で実行して元に戻してください。

2. 画面が更新されないままコードが止まる

  • 原因: エラーハンドラー(`ErrorHandler:`)を通らずにコードが途中で抜けた場合、`ScreenUpdating = False` が維持されてしまいます。
  • 対策: デバッグ中は `Application.ScreenUpdating = True` をイミディエイトウインドウから実行して画面を復旧させましょう。

—

おわりに

いかがでしたでしょうか?
「画面更新停止」と「計算モード制御」は、数千・数万行の巨大なWBSを扱うプロジェクトマネジメントの世界において、知っているかいないかで生産性が100倍変わる「知る人ぞ知る極意」です。

このテクニックを手に入れたあなたなら、もう重たいプロジェクトファイルに怯える必要はありません。ぜひ、実際の業務データやテスト環境でその圧倒的なスピードを体感してみてください。

あなたのVBAライフが、よりエレガントで快適なものになりますように。それではまた、次のステージでお会いしましょう!

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