【テクニカル・上級編】【中級者向け】ベースラインのクリアと再設定:計画変更時のクリーンアップ自動化 – Project VBA解析バイブル

スポンサーリンク

プロジェクト計画の「負の遺産」を断つ:ベースライン再設定の極致

プロジェクト管理において、ベースラインは「真実の北極星」である。しかし、計画の全面的な見直し(Re-planning)が行われる際、古いベースラインという名の「負の遺産」がクリーンアップされずに放置されるケースがあまりに多い。

VBAを用いてMicrosoft Projectを制御する場合、オブジェクトの生成と破棄は、メモリリークとパフォーマンス低下に直結する。今回は、プロジェクトの健全性を保つための「ベースラインのクリーンアップと再設定」を、メモリ管理の観点から極限まで最適化して解説する。

1. なぜ「クリア」が重要なのか?

Project VBAにおいて、`BaselineSave` メソッドを単に繰り返すのは愚策である。古いベースラインデータが残ることで、レポートの計算負荷が増大し、最悪の場合、プロジェクトファイル自体の肥大化(Bloat)を招く。

我々エンジニアが追求すべきは、「データの整合性」と「リソースの解放」の完璧な同期である。

2. メモリ最適化とオブジェクトライフサイクルの管理

VBAのガーベジコレクションは信用するな。`Application.Projects` や `Project` オブジェクトへの参照は、スコープを最小化し、終了時には必ず `Nothing` を明示的に代入せよ。特に大規模なプロジェクトファイルの場合、参照の残存は、Project自体のプロセスをゾンビ化させる。

3. 実装:ベースライン最適化自動化モジュール

以下に、古いベースラインを安全に破棄し、クリーンな状態で再設定を行うためのプロフェッショナル・コードを示す。

Option Explicit

‘ プロジェクト計画変更時のベースラインクリーンアップ・再設定ルーチン
‘ @param targetProject 対象のProjectオブジェクト
Public Sub RebuildBaseline(ByRef targetProject As Project)
Dim bl As Baseline

On Error GoTo ErrorHandler

‘ プロセスの排他制御と画面更新の停止(パフォーマンス向上の鉄則)
Application.ScreenUpdating = False

‘ 1. 既存のベースラインをクリア
‘ PjBaseline.pjBaseline0~10までをループで走査し、存在を確認してクリアする
Dim i As Integer
For i = 0 To 10
‘ 既存データの有無をチェックし、存在すればクリアする
‘ ※重要: 全削除ではなく、特定のベースラインだけをターゲットにする運用も可能
targetProject.BaselineClear BaselineNumber:=i
Next i

‘ 2. 最新の計画をベースライン0として保存
‘ メモリ上の最新タスク情報を確定させる
targetProject.BaselineSave All:=True, _
RollupToSummaryTasks:=True, _
RollupFromSubtasks:=True, _
CopyBaseline:=pjBaselineCopyNone

MsgBox “ベースラインの再構築が完了しました。”, vbInformation

ExitPoint:
‘ 3. 明示的なリソース解放
Set targetProject = Nothing
Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
Debug.Print “Error: ” & Err.Number & ” – ” & Err.Description
Resume ExitPoint
End Sub

4. シニアエンジニアのための極限の知見:レガシー保守の視点

Windows APIによるパフォーマンスの底上げ

大規模プロジェクトの保存やベースライン設定は、UIスレッドをブロックする。もし、この処理を長時間走らせる必要があるならば、`DoEvents` を安易に連発するのではなく、Windows APIの `Sleep` 関数を用いて、スレッドにわずかな隙間(コンテキストスイッチ)を与えるのが定石だ。

If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If

なぜ `DoEvents` よりも `Sleep` か?

`DoEvents` は、ユーザーの操作を受け付けてしまうため、処理中に誤ってボタンが押されるなどのリスクがある。`Sleep` は、OSレベルでプロセスの実行を一時停止させ、他のタスクにCPUリソースを譲るため、システム全体の安定性が格段に向上する。

5. 結論:コードは「書く」のではなく「守る」もの

プロジェクト計画の変更は、現場にとってストレスフルな作業である。エンジニアとして我々が提供すべきは、「ボタン一つで過去を清算し、新たな出発ができる」という安心感だ。

ベースラインをクリーンに保つことは、単なるメンテナンスではない。それは、プロジェクトという生命体に、新たな「規準」という背骨を通す作業である。

このコードをあなたの武器にし、レガシーなプロジェクト管理の現場を、データドリブンな意思決定の場へと変貌させてほしい。それが、プロのエンジニアの責務である。

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