【入門編】計算エンジンの挙動を制御する隠し設定:VBAで操作可能なProjectオプション群 – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押してコードを眺めてみたものの、「なんだか難しそう…」「思った通りに動いてくれない…」と、途方に暮れていませんか?

大丈夫です。その壁は、誰もが最初に通る道ですよ。
今回は、Project VBAの真骨頂とも言える「計算エンジンの裏側を支配する隠し設定(`Application.Options`系プロパティ)」について、優しく、そして深く解説していきます。

ここをクリアすれば、ただの「作業自動化」から脱却し、「プロジェクトのスケジュールエンジンを意のままに操るエンジニア」へとステップアップできますよ。それでは、一緒に紐解いていきましょう!

—

1. なぜ「計算エンジンの制御」が必要なのか?

Excel VBAと違い、MS Projectには「スケジュール計算エンジン」という強力な頭脳が常に裏で動いています。
「タスクAの期限が変わったから、後続のタスクBを後ろ倒ししよう」「リソースが超過しているから自動で平準化しよう」といった計算を、Projectは勝手に行っているのです。

しかし、この「お節介とも言える自動計算」が、VBAで大量のタスクを一括処理する際には最大のボトルネック(重荷)になります。

  • タスクを1つ追加するたびに全体が再計算され、処理がカメのように遅くなる。
  • 意図しないタイミングで制約条件(ASAP / ALAPなど)が上書きされてしまう。

これを防ぎ、爆速かつ正確にプログラムを走らせるために使うのが、今回紹介する `Application.Options` プロパティ群です。

—

2. Project VBAの基本:オブジェクトの階層構造を知ろう

まずは基本のおさらいです。Project VBAの構造は、ロシアの民芸品「マトリョーシカ」によく似ています。

[Application (アプリ全体)]
└── [ActiveProject (今開いているプロジェクト)]
└── [Tasks (タスクの集合体)]
└── [Task (個別のタスク)]

今回操作する `Application.Options` は、一番外側の `Application`(Microsoft Projectそのもの) にぶら下がっている設定ルームのようなものです。ここで変更した設定は、そのアプリ全体、あるいは開いているプロジェクトの挙動にダイレクトに影響を与えます。

—

3. 実践!計算エンジンを制御する魔法のコード

それでは、現場で即戦力となる実用コードを見てみましょう。
以下のコードは、「大量のタスクを追加・変更する前に自動計算をストップし、処理が終わったら一気に再計算させる」という、実務で必須のテクニックです。

Sub OptimizeScheduleEngine()
‘ —————————————————————–
‘ 目的: 計算エンジンを一時停止し、VBAの処理速度を劇的に向上させる
‘ —————————————————————–

Dim targetProj As Project
Set targetProj = ActiveProject

On Error GoTo ErrorHandler

‘ 1. 【最重要】バックグラウンドの自動再計算をオフにする
‘ これにより、タスク追加ごとの無駄な再計算を防ぎます
Application.Calculation = pjCalcManual

‘ 2. 新規タスクのデフォルト制約を「できる限り早く (ASAP)」に固定する
‘ (プロジェクト設定に依存せず、意図した挙動を担保するため)
targetProj.DefaultTaskType = pjTaskTypeFixedUnits ‘ 固定単位型

‘ — ここから裏で高速なタスク操作を行う想定のコード —
Dim t As Task
Set t = targetProj.Tasks.Add(Name:=”基盤構築フェーズ”)
t.Duration = “5d”

Dim t2 As Task
Set t2 = targetProj.Tasks.Add(Name:=”詳細設計”)
t2.Duration = “3d”
t2.Predecessors = “1” ‘ 1番のタスクの後に繋げる
‘ ————————————————–

‘ 3. すべての処理が終わったら、手動で一括計算を実行する
targetProj.Calculate

‘ 4. 計算モードを元(自動)に戻す
Application.Calculation = pjCalcAutomatic

MsgBox “スケジュール計算が正常に完了しました!”, vbInformation
Exit Sub

ErrorHandler:
‘ エラー時も計算モードがオフのままにならないよう必ず復旧させる
Application.Calculation = pjCalcAutomatic
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical

End Sub

コードのここがポイント!

  • `Application.Calculation = pjCalcManual`:

これが今回のキモです。Excelでいう「計算方法の設定を手動にする」と同じ効果があり、Projectの重いエンジンを一時停止させます。

  • エラーハンドリング(`On Error GoTo`):

計算を止めたままマクロが途中でエラー落ちすると、Projectが不安定になります。必ず「最後には自動計算に戻す」という安全装置(フック)をセットにして書きましょう。

—

4. 初学者が陥りやすい罠とエラー対策

罠その1:「あれ?タスクを追加したのにスケジュールが更新されないぞ?」

`pjCalcManual` に設定している間は、コード内でタスクを追加してもガントチャート上の日付やリンクが即座には更新されません。
対策: コードの最後(または再計算させたいタイミング)で必ず `targetProj.Calculate` を明示的に呼び出してください。これにより、エンジンが一気に正しいスケジュールを弾き出します。

罠その2:「プロジェクトを開くたびに設定が変わってしまう」

`Application.Options` や `Application.Calculation` の設定は、VBAを実行したときのPC環境やProjectの初期状態に引きずられることがあります。
対策: マクロの冒頭で必要な環境変数(設定値)を明示的にコードから上書きする癖をつけましょう。「動く環境をコード側が作る」のがプロのエンジニアの作法です。

—

おわりに:ここをクリアすれば、もう怖くない!

お疲れ様でした!
今回は `Application.Options` や計算エンジンの制御という、少し踏み込んだ「裏側の仕組み」について解説しました。

最初は難しく感じたかもしれませんが、「裏方のエンジンを止めて、一気に処理して、最後に一発で計算させる」という流れさえ掴んでしまえば、どんなに巨大なWBS(数千行あるプロジェクトファイル)を扱う場合でも、ストレスフリーでサクサク動くマクロが書けるようになります。

ここをクリアできれば、あなたのProject VBAのスキルはもう「初学者」の域を超えています。自信を持って、次の自動化チャレンジへ進んでくださいね!それでは、また次の現場でお会いしましょう。

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