Project VBAの深淵:Resourceオブジェクトを「支配」する一括登録アーキテクチャ
多くのエンジニアがMicrosoft Project(以下MSP)のVBAを「単なる自動記録の延長」と誤解している。しかし、Projectのオブジェクトモデルは、Excelのそれとは根本的に異なる。「Resource」を単なる行データとして扱うか、動的なメモリ上の実体として扱うか。この境界線にこそ、真の自動化エンジニアと、場当たり的なスクリプトキディの差が明確に現れる。
本稿では、Excelの名簿からProjectのResourceオブジェクトを生成し、コスト管理までを完結させる堅牢なアーキテクチャの構築手法を伝授する。
—
1. オブジェクトライフサイクルの制約を理解せよ
MSPのVBAにおける最大の罠は、`Application.Resources` コレクションの挙動にある。大量のリソースを一括登録する際、不適切なループ処理はメモリリークを招き、最悪の場合、Project自体を不安定な状態に追い込む。
極限の知見:COMオブジェクトの明示的解放
VBAはガベージコレクションを搭載しているが、Projectのような重厚なCOMコンポーネントを相手にする場合、`Set obj = Nothing` を怠れば、バックグラウンドでCOMプロセスがゾンビのように残り続ける。
‘ リソース登録のコアロジック
Sub BatchRegisterResources(wsData As Worksheet)
Dim projApp As Object ‘ MSProject.Application
Dim resColl As Object
Dim res As Object
Dim i As Long
‘ 接続確立の定石:CreateObjectではなくGetObjectでのアタッチを推奨
Set projApp = GetObject(, “MSProject.Application”)
Set resColl = projApp.ActiveProject.Resources
On Error GoTo Cleanup
For i = 2 To wsData.Cells(wsData.Rows.Count, 1).End(-4162).Row ‘ xlUp
‘ リソースの動的生成
Set res = resColl.Add(wsData.Cells(i, 1).Value) ‘ Name
‘ 属性の最適化(オブジェクトアクセスの最小化)
With res
.StandardRate = wsData.Cells(i, 2).Value
.Calendar = “標準” ‘ 稼働カレンダーの適用
.Type = 1 ‘ 1:Work, 0:Material
End With
‘ メモリ解放:ループ内での明示的な参照破棄
Set res = Nothing
Next i
Cleanup:
Set resColl = Nothing
Set projApp = Nothing
End Sub
—
2. Windows APIによるパフォーマンスの極致
数千名規模のリソース管理を行う場合、`DoEvents` を挟みながらの処理は非効率極まりない。ここで必要になるのが、Windows APIを利用したプロセス制御だ。
特に、Projectの再描画(`ScreenUpdating`の概念がExcelと異なる)を制御し、計算処理を一時的に停止させることで、登録速度を劇的に向上させる。
‘ 計算処理を一時停止させるAPIの活用例
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Sub OptimizedRegistration(targetProj As Object)
‘ 計算モードをマニュアル化して負荷を軽減
targetProj.Calculation = 0 ‘ pjManual
‘ 一括登録処理を実行
‘ …
‘ 処理後に計算を再開
targetProj.Calculation = 1 ‘ pjAutomatic
End Sub
—
3. レガシー環境における保守性の担保
「動けばいい」というコードは、半年後の自分を殺す毒となる。特にProjectのResourceは、一度登録されるとGUIDやユニークIDで紐づけられるため、再実行時の「二重登録」をいかに防ぐかがシステムの信頼性を左右する。
シニアエンジニアが守るべき設計原則
1. 冪等性(Idempotency)の確保: 実行前に`Resources(Name)`が存在するか確認し、存在する場合は更新(Update)、不在なら新規作成(Add)を行うロジックを強制する。
2. ログ出力の徹底: どのリソースが登録に失敗したか、どのレートが不正か。標準出力ではなく、必ずテキストファイルへの監査ログを残す。
3. カレンダー同期: リソースの登録と同時に、組織の休日マスタを反映させる。`Calendar` プロパティの汚染はコスト計算の致命的な誤差を生む。
—
結びに:伝説のアーキテクトからの助言
Project VBAを操ることは、単なる業務効率化ではない。それは「プロジェクトの時間とコスト」という、企業の心臓部をコードで制御することに他ならない。
メモリを解放し、計算負荷を制御し、エラーの芽を事前に摘む。この「泥臭い配慮」の積み重ねが、何年経っても壊れない安定した自動化システムを作り上げる。
次にあなたがリソースを登録する時、その背後に潜むCOMオブジェクトの吐息を感じてほしい。それが、プロフェッショナルへの第一歩だ。
