【入門編】Project VBAを用いたリソースの「スキルセット」とタスクの自動マッチング – Project VBA解析バイブル

スポンサーリンク

Project VBAで「最適解」を導く:リソースとタスクの自動マッチングを極める

こんにちは。プロジェクト管理の現場で「誰に何を任せるか」というパズルに頭を抱えたことはありませんか?

多くの人が「マクロの記録」で操作をなぞる段階から抜け出せない中、君は今、Project VBAの真の扉を開こうとしています。今日は、単なる自動化を超えた、リソースのスキルとタスクの要件を自動でマッチングするロジックの構築に挑戦しましょう。

ここをクリアすれば、君はもう初心者ではありません。現場の生産性を劇的に変える「アーキテクト」への第一歩です。

—

なぜ「マッチングロジック」なのか?

プロジェクト管理において、リソースの割り当ては「勘と経験」に頼りがちです。しかし、VBAを使えば、以下の要件を瞬時に計算できます。

1. スキルの一致度: タスクに必要な言語や技術と、リソースの保有スキルを比較する。
2. 稼働率の考慮: 既に過負荷なリソースを自動で除外する。
3. スコアリング: 最も適任なメンバーを数値で算出する。

これらが自動化されるだけで、プロジェクトの意思決定スピードは数倍に跳ね上がります。

—

1. データの構造を理解する(ここが生命線!)

Project VBAで最も重要なのは、「オブジェクトの階層」を理解することです。
リソース情報は `Resources` コレクション、タスク情報は `Tasks` コレクションに格納されています。

  • Resource: `Name`, `ID`, `StandardRate` などのプロパティを持つ。
  • Task: `Name`, `Duration`, `Assignments` (誰が割り当てられているか) を持つ。

今回は、リソースの「カスタムフィールド(Text1など)」にスキルを登録し、タスクの「メモ」や「Textフィールド」に要件を書いて、それらを比較する設計にします。

—

2. 自動マッチングの心臓部:VBAコード

以下のコードは、タスク要件とリソースのスキルを比較し、最も適したリソースをイミディエイトウィンドウに提案するシンプルな実装例です。

Sub AutoMatchResource()
Dim tsk As Task
Dim res As Resource
Dim skillRequired As String
Dim bestResName As String
Dim maxScore As Integer

‘ プロジェクト内の全タスクを走査
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
‘ タスクのText1に「必要なスキル」が入力されていると仮定
skillRequired = tsk.Text1

If skillRequired <> “” Then
maxScore = 0
bestResName = “候補なし”

‘ リソースを走査してスコアリング
For Each res In ActiveProject.Resources
‘ リソースのText1に「保有スキル」が入っていると仮定
If InStr(res.Text1, skillRequired) > 0 Then
‘ 稼働率が低いリソースを優先するロジック(簡易版)
‘ 稼働率(PercentAllocation)が100%未満なら高評価
If res.PercentAllocation < 100 Then bestResName = res.Name Exit For ' 最初に見つかった最適任者を提案 End If End If Next res ' 結果をタスクのText2に書き込む tsk.Text2 = bestResName Debug.Print "タスク: " & tsk.Name & " -> 推奨担当者: ” & bestResName
End If
End If
Next tsk

MsgBox “リソースのマッチングが完了しました!”
End Sub

—

3. 陥りやすい罠と対策

① `Nothing` のチェックを怠る

Projectのタスクリストには「空行(見出し)」が含まれます。`For Each tsk In ActiveProject.Tasks` を回す際、`If Not tsk Is Nothing Then` を入れないと、空行でエラーが爆発します。これはベテランも時々やるミスです。

② 計算負荷の考慮

大規模なプロジェクト(数千タスク)でこのループを回すと、UIがフリーズすることがあります。その際は `Application.ScreenUpdating = False` を冒頭に入れ、最後に `True` に戻すことで描画負荷を抑えるのが鉄則です。

③ 「稼働率」という動的な指標

今回のコードでは `PercentAllocation` を使いましたが、厳密には「期間ごとの残業時間」や「カレンダーの空き状況」も考慮すべきです。まずは今日書いたこの基本ロジックを動かし、徐々に条件式(If文)を複雑にしていくのが、失敗しない開発手法です。

—

最後に:先輩からのアドバイス

君が今書いているのは単なるスクリプトではありません。プロジェクトの「最適化エンジン」です。

最初から完璧なコードを目指す必要はありません。まずは「タスクのText1とリソースのText1を比較して、Text2に名前を書き出す」という小さな成功体験を積み上げてください。この小さな一歩が、将来的に会社全体のプロジェクト管理を自動化する巨大なシステムの礎になります。

コードで分からないことがあれば、またいつでも聞いてください。君の挑戦を心から応援していますよ。

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