伝説のアーキテクトが説く:Project VBAの「配列処理」でリソース割り当てを爆速化せよ
こんにちは。現場で泥臭く、しかし誰よりもスマートにコードを書き続けてきたアーキテクトです。
Project VBA(Microsoft ProjectのVBA)を触り始めると、誰もが一度は「リソースの割り当てが遅い」という壁にぶつかります。何百、何千というタスクに対し、ループでセルを一つずつ叩いていては、処理が終わる頃にはコーヒーを飲み干してしまいます。
今日は、マクロの記録から脱却し、「配列(Array)」を駆使してプロジェクトのリソース管理を異次元の速度へ引き上げる極意を伝授します。ここをクリアすれば、あなたはもうただの初心者ではありません。
—
1. なぜ「セルへのアクセス」は遅いのか?
VBAで一番やってはいけないこと。それは、「ループの中で何度もセルの値を読み書きすること」です。
Projectのオブジェクトモデルは非常に強力ですが、VBAから各オブジェクト(TaskやResource)にアクセスするたびに、裏では「通信」のようなコストが発生しています。100個のタスクをループで処理すると、そのコストが100回積み重なる。これが遅延の正体です。
解決策:メモリ上の「配列」に逃がせ
一度データを配列という「メモリ上の箱」に一気に放り込み、計算処理を完了させてから、最後に一括で書き戻す。これだけで、処理速度は数倍から数十倍に跳ね上がります。
—
2. 実践:リソース割り当てを爆速化するコード
今回は、タスクIDとリソース名を配列に格納し、一括で割り当てるプロフェッショナルな設計を見ていきましょう。
Sub FastResourceAssignment()
Dim tsk As Task
Dim dataArray() As Variant
Dim i As Long, taskCount As Long
‘ 1. 対象タスク数を取得(メモリ確保のために必要)
taskCount = ActiveProject.Tasks.Count
‘ 2. 配列を定義:[1 to taskCount, 1 to 2] (IDと名前を保持)
ReDim dataArray(1 To taskCount, 1 To 2)
‘ 3. 配列への取り込み(高速な読み込み)
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
dataArray(tsk.ID, 1) = tsk.ID
dataArray(tsk.ID, 2) = “アーキテクト” ‘ 割り当てるリソース名
End If
Next tsk
‘ 4. 一括割り当ての実行(ここが肝!)
Dim res As Resource
For i = 1 To taskCount
If dataArray(i, 2) <> “” Then
‘ 割り当て処理:オブジェクトへの直接アクセスは最小限に
ActiveProject.Tasks(i).Assignments.Add ResourceID:=GetResID(dataArray(i, 2))
End If
Next i
MsgBox “処理完了:リソース割り当てを最適化しました。”
End Sub
‘ 補足:リソース名からIDを引くヘルパー関数(辞書オブジェクトを使うと更に速い)
Function GetResID(resName As String) As Long
GetResID = ActiveProject.Resources(resName).ID
End Function
コードのポイント
- ReDimによるメモリ管理: 配列のサイズを事前に決めることで、メモリの断片化を防ぎます。
- 分離の美学: 「データの読み込み」と「リソースの割り当て」を明確に分けることで、バグが入り込む余地を減らしています。
—
3. 初学者が陥りやすい「3つの罠」
この手法を取り入れる際、多くの人がここで躓きます。先回りしてケアしておきましょう。
1. 「Nothing」の判定漏れ:
Projectのタスクリストには、削除されたタスクの痕跡(Nothing)が残ることがあります。`If Not tsk Is Nothing` は、いわばVBAの守護神です。これを忘れると、実行時エラーで強制終了します。
2. 配列の添字(インデックス)の混乱:
VBAの配列はデフォルトで `0` から始まりますが、ProjectのIDは `1` から始まります。このズレを意識しないと、リソースが一つずつズレて割り当てられる悲劇が起きます。必ず `Option Base 1` を使うか、 `1 To N` と明示しましょう。
3. 型変換のコスト:
Variant型は便利ですが、大量データを扱う際はメモリを消費します。もし扱いたいデータが数値だけなら、`Long` 型や `String` 型の配列に限定することで、さらなる軽量化が可能です。
—
最後に:エンジニアとしてのマインドセット
「コードを速くする」ということは、単に待ち時間を減らすだけではありません。「コンピュータに優しい処理を書く」という、エンジニアとしての品格を磨くことと同義です。
今回紹介した「配列処理」は、Project VBAの世界ではまさに「基本にして最強」の技法。これが身につけば、どんなに巨大なプロジェクト計画書を前にしても、あなたは涼しい顔で自動化のコードを書けるようになるはずです。
何か不明点があれば、いつでも聞いてください。焦らず、一歩ずつ。あなたの自動化ライフを、心から応援していますよ。
