プロジェクトを自動で「最適化」する。VBAで実現するリソース割り当ての極意
こんにちは。現場で泥臭い自動化と格闘し続けてきた諸君、ようこそ。
「マクロの記録」で生成されたゴミのようなコードを卒業し、いよいよ「プロジェクトの頭脳」となるVBAを書きたいという意気込み、最高ですね。今回は、Project VBAにおける最もエキサイティングな領域、「リソースのスキルベース自動割り当て」について解説します。
リソースに「誰が何ができるか」を登録し、タスクの難易度に応じて最適な担当者を自動で選ぶ。これができれば、君はもう単なる作業者ではありません。プロジェクトの「アーキテクト」です。
—
1. なぜ「自動化」が必要なのか?
大規模なプロジェクトで、手動でリソースを割り当てるのは地獄です。誰がどのスキルを持ち、今どれだけ空いているか……。これを人間が管理しようとすれば、必ず「過負荷(オーバーアロケーション)」や「スキル不足による手戻り」が発生します。
VBAは、Projectの内部データ(`Project.Resources` や `Project.Tasks`)を直接操作できる唯一の武器です。この武器を使って、「タスクの難易度」と「リソースのスキル」の交差点を自動計算させましょう。
—
2. 実装の設計図:スキルを可視化する
まずは準備です。Projectの「リソースシート」で、カスタムフィールドを活用します。
- リソース側の設定: 「テキスト1」フィールドに「SkillLevel」(例:1〜5)を入力。
- タスク側の設定: 「テキスト1」フィールドに「RequiredLevel」(必要なスキルレベル)を入力。
この2つをVBAで突き合わせるのが今回のアルゴリズムの肝です。
—
3. 実践コード:スキルベース・アロケーター
以下のコードは、タスクに必要なスキルを満たすリソースを検索し、割り当てるためのコアロジックです。
Sub AutoAssignBySkill()
Dim tsk As Task
Dim res As Resource
Dim reqLevel As Integer
Dim resLevel As Integer
‘ プロジェクト内のすべてのタスクをループ処理
For Each tsk In ActiveProject.Tasks
‘ サマリータスクや空行はスキップ(無駄な処理を減らすのがプロの流儀)
If Not tsk Is Nothing And Not tsk.Summary Then
‘ タスクに必要なスキルレベルを取得
reqLevel = Val(tsk.Text1)
‘ スキルが設定されていないタスクは無視
If reqLevel > 0 Then
‘ リソースを探索して割り当て
For Each res In ActiveProject.Resources
‘ リソースのスキルレベルを取得
resLevel = Val(res.Text1)
‘ スキルが一致、かつ現在割り当てられていないリソースを探す
If resLevel >= reqLevel Then
‘ 割り当て実行
tsk.Assignments.Add TaskID:=tsk.ID, ResourceID:=res.ID
‘ 割り当てたらループを抜ける(一人の最適な担当者を決める)
Exit For
End If
Next res
End If
End If
Next tsk
MsgBox “リソースの割り当てが完了しました。”
End Sub
—
4. コードの解説:ここが「本質」です
- `If Not tsk Is Nothing`: 初学者が忘れがちなのが、空行(Null)のチェックです。Projectのタスクリストには、データが入っていない行も存在します。ここを無視すると、実行時にエラーで停止します。
- `Val()` 関数の活用: `Text1`は文字列型です。そのまま比較すると「10」が「2」より小さいと判定されるようなミス(文字列比較の罠)が起きます。必ず数値に変換してから比較しましょう。
- `Exit For` の重要性: 良いリソースが見つかった瞬間に `Exit For` でループを抜ける。これがアルゴリズムの「効率」です。全てのループを回し続けるのは、計算リソースの無駄遣いです。
—
5. 陥りやすいエラーと対策
1. 「オブジェクト変数または With ブロック変数が設定されていません」:
- これは、対象のタスクやリソースが空(Nothing)なのにアクセスしようとした時に発生します。`If Not tsk Is Nothing` を必ず入れましょう。
2. 割り当てが重複する:
- もし同じタスクに何度も割り当ててしまう場合は、`tsk.Assignments.Count` をチェックし、既に誰か割り当てられていないか確認するロジックを追加してください。
—
最後に:諸君へのアドバイス
VBAは、単なる「作業の短縮」ではありません。「プロジェクトのルールをコード化する」という行為そのものです。
「スキルレベル」という指標は、最初は荒削りでも構いません。そこから「稼働率(Resource.Work)」を組み合わせ、「残業が少ないリソースを優先する」といった条件を足していけば、それは世界に一つだけの最強の自動最適化エンジンになります。
まずはこのコードをコピーして、自分のプロジェクトで動かしてみてください。エラーが出たら、それが君の成長の記録です。応援していますよ。
さあ、自動化の先にある、より本質的な仕事に向き合う準備を始めましょう。
