【テクニカル・上級編】ExcelリストからProjectリソースを一括登録するVBAツールの作成 – Project VBA解析バイブル

スポンサーリンク

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オブジェクトの吐息を感じてほしい。それが、プロフェッショナルへの第一歩だ。

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