Project VBAの深淵:オーバーアロケーションを撃墜する「動的優先度平準化」アルゴリズム
VBAを単なる「マクロ」と呼ぶのは、もはや時代遅れだ。Project VBAを扱っている諸君なら既に理解しているはずだが、この環境はメモリ管理の甘さとオブジェクトのライフサイクルを制御できない者が迷い込む迷宮だ。
今回は、プロジェクトマネジメントにおいて最も忌むべき「オーバーアロケーション」を、VBAの限界を押し広げて自動解決する手法を伝授する。
1. なぜProjectの「標準平準化」では足りないのか
Project標準の平準化機能は、いわば「思考停止の自動化」だ。我々が求めるのは、カスタムフィールドに刻まれた「真のビジネス優先度」に基づき、リソースの血流を最適化するシミュレーターである。
ここで重要なのは、「いつ、どのタイミングでメモリを解放するか」だ。数千行のタスクを回す際、Projectオブジェクトを安易に保持し続けるのは自殺行為に近い。
2. 実装の核心:優先度駆動型タスク・リシャッフル
このアルゴリズムの肝は、タスクを優先度順にソートし、リソースのキャパシティ(単位:時間)をスタックとして監視することにある。
以下のコードは、リソースの負荷を閾値以下に抑えるために、優先度の低いタスクを後ろ倒しする「動的シミュレーター」の核となるモジュールだ。
‘ プロジェクトの安定性を担保するためのメモリ管理型平準化エンジン
Public Sub ResolveOverAllocation()
Dim proj As Project
Set proj = ActiveProject
‘ プロセス監視用:Windows APIによる実行時間計測(必要に応じて)
‘ QueryPerformanceCounter を使用してボトルネックを可視化せよ
Dim tsk As Task
Dim res As Resource
Dim loadMap As Object
Set loadMap = CreateObject(“Scripting.Dictionary”)
‘ 1. タスクの優先度と負荷をマッピング(メモリ最適化のためにIDのみを保持)
‘ コレクションの多用はヒープを食いつぶす。最小限の構造体に留めること。
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
If tsk.Overallocated Then
‘ 優先度をキーにソート処理を分岐
‘ 実際にはここでカスタムフィールド(Number1等)を参照
End If
End If
Next tsk
‘ 2. 平準化処理:優先度に基づいて開始日をシフト
ApplyShiftingLogic proj, loadMap
‘ 3. オブジェクトの明示的解放:VBAのガベージコレクションを信用するな
Set loadMap = Nothing
Set proj = Nothing
End Sub
Private Sub ApplyShiftingLogic(ByRef p As Project, ByRef map As Object)
‘ ここに時系列データを走査するロジックを記述
‘ 1日単位の稼働率(Resource.Work)を合算し、閾値を超えたら
‘ 次の利用可能なスロットへタスクを押し出す
Dim tsk As Task
For Each tsk In p.Tasks
‘ 優先度による決定論的なスケジュール変更
‘ tsk.Start = tsk.Start + 1
DoEvents ‘ 巨大なプロジェクトではGUIのフリーズを防ぐ
Next tsk
End Sub
3. シニアエンジニアが守るべき3つの鉄則
① オブジェクトの「連鎖」を断ち切れ
`ActiveProject.Tasks(i).Assignments(j).Resource.Name` のようなネストした参照は、背後で多大な一時オブジェクトを生成し、VBAのメモリ管理を破綻させる。必要なプロパティは一度の走査で変数にキャッシュせよ。
② DoEventsの戦略的配置
Projectの計算エンジンは強力だが、VBAから大量の更新を投げると競合が発生する。`Application.ScreenUpdating = False` で描画を止め、更新の切れ目に `DoEvents` を挟む。これでWindowsメッセージキューの溢れを防ぐ。
③ レガシー環境でのAPI活用
もし、Projectの標準機能で計算が追いつかない場合、`kernel32.dll` を呼び出して `GetTickCount` で処理時間を計測し、一定時間ごとに「強制的なメモリ解放待ち」を作る必要がある。VBAは「いつメモリが解放されるか」が非決定論的である以上、時間的な遊び(バッファ)を持たせるのが伝説のアーキテクトの矜持だ。
最後に:ツールに支配されるな
このコードは、あくまで「リソースの最適化」という地図を描くための道具に過ぎない。プロジェクトの真の平準化とは、数値上の調整ではなく、チームのボトルネックを物理的に取り除くことにある。
VBAでシステムを構築する諸君。コードの美しさは、無駄なオブジェクトを生成しない「潔さ」に宿る。このシミュレーターが、諸君のプロジェクトを平穏へと導くことを願う。
―― さあ、コードを叩け。プロジェクトの混沌を、論理で秩序へと変えるのだ。
