【入門編】【プロ向け】計算エンジンの挙動を制御する隠し設定(Options)のVBA操作 – Project VBA解析バイブル

スポンサーリンク
スポンサーリンク

マクロ記録の先へ。MS Projectの「心臓部」を制御する計算エンジンの最適化術

「マクロの記録ボタンを押して、設定を変えて、コードを書き写す。…でも、なぜか動作が重いし、意図しないタイミングでスケジュールが動いてしまう」

もしあなたがそう感じているなら、おめでとうございます。あなたは今、「ただの操作の自動化」から「エンジンの制御」という、プロフェッショナルへの入り口に立っています。

MS Projectは単なる表計算ソフトではありません。背後では「制約条件(Constraints)」と「依存関係(Dependencies)」を解き明かす、極めて高度な計算エンジン(Scheduling Engine)が常にフル回転しています。

今日は、マクロ記録では決して教えてくれない、`Application.Options` オブジェクトを介した「計算エンジンの挙動制御」について、その本質を紐解いていきましょう。ここをマスターすれば、あなたの書くコードは劇的に速く、そして予測可能になります。

1. なぜ「マクロの記録」だけでは足りないのか?

マクロの記録機能は、あなたがマウスでクリックした結果を忠実に記録します。しかし、記録されたコードには「なぜその設定が必要なのか」という文脈(Context)が欠落しています。

例えば、スケジュールの計算モードを切り替えるコードを記録したとしましょう。

' マクロ記録で生成される典型的なコード
Application.Options.ScheduleFromStart = True

これだけでは不十分です。なぜなら、MS Projectは「プロパティが一つ変わるたびに、プロジェクト全体の再計算を試みる」という性質を持っているからです。

タスクが数千行ある巨大なプロジェクトで、ループ処理の中で一つずつ設定を変えていくと、その度にエンジンが「あ、設定が変わった!全タスクを計算し直さなきゃ!」と暴走し、処理が数十分停止することすらあります。これが、初心者が陥る「重いマクロ」の正体です。

2. 計算エンジンの「制御レバー」:Optionsオブジェクト

MS Projectの挙動を支配する重要なプロパティが `Application.Options` に集約されています。プロが注目すべきは、特に以下の「計算の方向性」に関わる設定です。

ASAP(できるだけ早く)と ALAP(できるだけ遅く)の制御

プロジェクトの設計思想によって、タスクを「開始日基準」で動かすか、「終了日基準」で動かすかは変わります。

  • `ScheduleFromStart`: `True` なら ASAP(開始日を基準に後ろへ広がる)、`False` なら ALAP(終了日を基準に前へ広がる)的な挙動の基礎となります。

これらをVBAから操作することで、大量のタスクに対して「一括でスケジュールの方向性を書き換える」といった高度な一括処理が可能になります。

3. 【実践】プロの設計パターン:計算の「封印」と「解放」

ここからが本番です。プロのエンジニアは、設定を変更する前に「エンジンの計算を一時停止」させます。これを「計算モードの制御」と呼びます。

以下のコードは、大規模プロジェクトでも高速かつ安全にオプションを変更するための、黄金のテンプレートです。

Sub OptimizeScheduleEngine()
    ' 変数の宣言
    Dim originalCalculation As Long
    
    ' 1. 現在の計算モードを退避(後で元に戻すため)
    ' これをしないと、処理が終わった後にユーザーの環境が変わってしまうため
    originalCalculation = Application.Calculation
    
    On Error GoTo ErrorHandler ' エラー発生時に設定を元に戻すためのトラップ
    
    ' 2. 【重要】計算エンジンを「手動モード」に切り替える
    ' これにより、プロパティ変更のたびに発生する「再計算の嵐」を封じ込めます
    Application.Calculation = pjManual
    
    Debug.Print "計算エンジンを停止しました。設定変更を開始します..."

    ' ---------------------------------------------------------
    ' 3. オプションの設定(ここでエンジンの挙動を制御)
    ' ---------------------------------------------------------
    With Application.Options
        ' スケジュール計算の基準を「開始日」に設定(ASAP的な動きを強化)
        .ScheduleFromStart = True
        
        ' 自動スケジュールの設定(例:タスクの自動スケジュールを強制)
        ' ※プロジェクト全体のポリシーをコードで定義する
        ' .AutoSchedule = True 
        
        ' その他の隠れた設定もここで一括制御可能
        ' 例: 日付の表示形式や、計算の詳細設定など
    End With
    
    Debug.Print "オプション設定が完了しました。"

    ' ---------------------------------------------------------
    ' 4. 最後に一度だけ、エンジンをフル回転させる
    ' ---------------------------------------------------------
    ' 全ての設定が終わった後に、一気に計算を実行します
    Application.Calculate
    Debug.Print "全タスクの再計算が完了しました。"

CleanUp:
    ' 5. 計算モードを元の状態に戻す(ユーザーへの配慮)
    Application.Calculation = originalCalculation
    MsgBox "処理が正常に完了しました。", vbInformation
    Exit Sub

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

このコードの「プロの知見」解説

# ① `Application.Calculation = pjManual` の魔力

これが最も重要です。`pjManual`(手動計算)に設定することで、MS Projectに対して「私が『計算しろ』と言うまで、勝手に計算するな」という命令を下しています。これにより、ループ処理中のパフォーマンスが数百倍変わることも珍しくありません。

# ② `On Error GoTo ErrorHandler` によるライフサイクル管理

エンジンの設定(特に計算モード)を変更した際、もし途中でエラーが起きてプログラムが止まってしまうと、ユーザーのProjectは「手動計算モード」のままになり、「日付を変えてもスケジュールが動かない!」というパニックを引き起こします。
プロは、エラーが起きても必ず「元の状態に戻す(CleanUp)」プロセスを組み込みます。

# ③ `Application.Calculate` による一括処理

バラバラに計算させるのではなく、最後に「ドカン」と一回だけ計算させる。これが、オブジェクトのライフサイクルを理解した者の戦い方です。

4. まとめ:エンジニアとしての視点

Project VBAを扱う上で、覚えておいてほしいことは一つです。

「プロパティ(設定)を変えることは、エンジンの状態(State)を変えることである」

単に値を書き換えるだけの作業は、マクロの記録で十分です。しかし、その変更がプロジェクト全体にどのような「波紋(Ripple Effect)」を及ぼすかを予測し、計算エンジンの負荷をコントロールすること。それこそが、設計者(アーキテクト)としての仕事です。

今回紹介した「停止 → 設定 → 一括計算 → 復元」というパターンを、ぜひあなたのライブラリに加えてください。これだけで、あなたの作るツールは、現場のプロが信頼する「本物の道具」へと進化します。

ここをクリアすれば、Project VBAの基本はバッチリですよ。さあ、次のステップへ進みましょう!

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