Project VBAの深淵:リソース一括登録を「破壊的」に自動化する設計思想
多くのエンジニアがProject VBAの「リソース登録」で躓くのは、Projectのオブジェクトモデルを単なるデータ構造として捉えているからだ。
いいか、心せよ。`Project.Resources`は単なるコレクションではない。それはProjectのスケジュールエンジン、コスト計算、そしてカレンダーという「時間軸の制約」と密接に結びついた、非常にデリケートな生き物だ。
今日は、Excelからリソースを流し込む際、多くの素人が陥る「後から修正が効かないスパゲッティコード」を脱却し、エンタープライズレベルの堅牢性を備えた一括登録ツールを設計する方法を授ける。
—
1. なぜ「力技のループ」が破綻を招くのか
よくある失敗例はこうだ。Excelを上から順に読み込み、`ActiveProject.Resources.Add`を繰り返し呼び出す。
このやり方は、規模が数千行になった瞬間にプロジェクトファイル全体のパフォーマンスを劣化させる。なぜなら、Projectはリソースが追加されるたびに、既存の全タスクとの割り当て整合性を再計算しようとするからだ。
解決策: 処理の前後で`Calculation = pjManual`を明示的に指定し、バックエンドの再計算を強制停止させること。これが大前提だ。
—
2. リソース登録エンジンのアーキテクチャ
単に名前を入れるだけでは足りない。標準レート、最大単位数、カレンダーの適用。これらを「設定用データ構造」として事前に定義し、イテレーターで流し込む設計にする。
プロダクション・コード:ResourceSyncEngine
以下のコードは、エラーハンドリングを完備し、既存リソースの更新(Upsert)にも対応した堅牢な設計だ。
Option Explicit
‘ ———————————————————
‘ 業務効率化ツール:ExcelからProjectへのリソース一括登録
‘ 設計思想: 計算モードの切り替えによる負荷軽減とUpsertの実装
‘ ———————————————————
Public Sub SyncResourcesFromExcel()
Dim proj As Project
Dim xlSheet As Worksheet
Dim lastRow As Long, i As Long
Dim resName As String
Dim res As Resource
Set proj = ActiveProject
Set xlSheet = ThisWorkbook.Sheets(“ResourceList”)
lastRow = xlSheet.Cells(xlSheet.Rows.Count, “A”).End(xlUp).Row
‘ 1. パフォーマンス最適化:再計算を停止
Application.Calculation = pjManual
On Error GoTo ErrorHandler
For i = 2 To lastRow
resName = xlSheet.Cells(i, 1).Value ‘ A列:リソース名
‘ 2. Upsertロジック:存在すれば取得、なければ生成
Set res = GetOrCreateResource(proj, resName)
‘ 3. プロパティの流し込み
With res
.StandardRate = xlSheet.Cells(i, 2).Value ‘ B列:標準単価
.MaxUnits = xlSheet.Cells(i, 3).Value ‘ C列:最大稼働率
.BaseCalendar = “標準” ‘ カレンダーの強制適用
End With
Next i
CleanUp:
‘ 4. 復旧
Application.Calculation = pjAutomatic
MsgBox “リソースの同期が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
Private Function GetOrCreateResource(p As Project, resName As String) As Resource
On Error Resume Next
Set GetOrCreateResource = p.Resources(resName)
If GetOrCreateResource Is Nothing Then
Set GetOrCreateResource = p.Resources.Add(resName)
End If
On Error GoTo 0
End Function
—
3. 現場で生き残るための「3つの鉄則」
① データの「正規化」はExcel側で行え
VBAで複雑な条件分岐を行うな。Excelのセル内で`IF`や`VLOOKUP`を使い、Projectに渡すデータは「型」を揃えたクリーンな状態にしておくこと。VBAはあくまで「転送エンジン」に徹するべきだ。
② カレンダーの一貫性を担保する
リソースに適用するカレンダーが存在しない場合、Projectはデフォルトのカレンダーに逃げる。これは後々「なぜかコスト計算が合わない」という悲劇を生む。`BaseCalendar`をセットする前には、必ず対象のカレンダーが存在するかチェックするルーチンを挟むのがプロの仕事だ。
③ ログを残せ
数千件の登録を行う場合、どこで失敗したかが分からないのは致命的だ。「リソース名」「成功/失敗」「エラーコード」を別シートに出力する、あるいはイミディエイトウィンドウに詳細なログを吐く仕組みを必ず組み込め。
—
まとめ:自動化の先にあるもの
このツールを導入することで、リソース管理の負荷は劇的に下がる。だが、真の目的は「効率化」ではない。「誰もが正確にリソースを登録できる状態を維持し、プロジェクトのコストと進捗をリアルタイムに可視化すること」にある。
VBAは古臭い言語だと言われることもある。しかし、Projectの深部を操るには、これ以上の武器はない。設計を磨き、泥臭い手作業を駆逐せよ。それが、君がこのプロジェクトを掌握するための第一歩だ。
