【実務・中級編】リソースの「代行者」設定をVBAで管理し、プロジェクトメンバー変更をスムーズに行う – Project VBA解析バイブル

スポンサーリンク

【VBA】リソース交代の「負の連鎖」を断つ。代行者設定を自動化する極限の実装論

プロジェクトマネジメントにおいて、最もコストがかかり、かつバグを生みやすいのが「リソースの交代」だ。

「Aさんが抜けるからタスクをBさんに振り直す」。この単純作業が、手動で行われる限り、必ずデータの不整合を招く。割り当ての抜け漏れ、稼働率の計算ミス、過去の工数実績の消失……。これらを防ぐには、「代行者(Proxy)設定」をVBAで抽象化し、データ層と表示層を切り離した設計が必要不可欠だ。

今日は、場当たり的なマクロ作成から脱却し、エンタープライズレベルでも通用する「リソース管理自動化」の神髄を伝授する。

—

1. なぜ「力技の書き換え」は死を招くのか

多くの現場で散見されるのが、「タスクシートをループして文字列を直接書き換える」という実装だ。これは論外である。

  • 参照整合性の欠如: タスク表とリソース名簿が疎結合であるため、名簿の表記揺れ(「佐藤」と「佐藤 太郎」など)だけで破綻する。
  • 履歴の消失: 交代前の担当者が何をどれだけ消化したのかという「事実」を上書きしてしまう。

真の設計者は、「現在の担当者」と「本来の担当者(あるいは代行者)」を論理的に分離する。今回は、そのための「代行者設定」のロジックを解説する。

—

2. 堅牢な設計指針:マッピングテーブルの活用

VBAでリソース管理を構築する際、シート上のデータを直接操作してはならない。必ず「マッピング管理テーブル」を介在させる。

1. リソース名簿シート: IDとリソース名を一意に管理。
2. 代行者設定シート: `[元リソースID] | [代行者ID] | [有効期限]` を記録。
3. タスクシート: 「本来の担当者ID」のみを保持。

この3層構造にすることで、VBAは「誰が担当すべきか」を、代行者設定テーブルを参照するだけで算出できる。

—

3. 実装コード:代行者適用ロジック

以下は、タスクリストから現在の担当者を導き出し、代行者が設定されていればそれを返す汎用的な関数だ。このロジックを核にすれば、レポート生成や稼働率調整が劇的に安定する。

‘ ==========================================================
‘ 関数名: GetActiveResource
‘ 目的: 本来の担当者IDから、有効な代行者IDを特定する
‘ 備考: 辞書オブジェクト(Scripting.Dictionary)でキャッシュし、
‘ シートへのアクセス回数を最小化すること。
‘ ==========================================================
Public Function GetActiveResource(ByVal originalResID As String, _
ByRef proxyDict As Object) As String
‘ proxyDictには「元ID:代行ID」の辞書を事前にロードしておく

If proxyDict.Exists(originalResID) Then
‘ 代行者が設定されている場合は代行者を返す
GetActiveResource = proxyDict(originalResID)
Else
‘ 設定がない場合は本人を返す
GetActiveResource = originalResID
End If
End Function

‘ ==========================================================
‘ メイン処理: プロジェクトメンバーの代行設定をロードする
‘ ==========================================================
Public Sub UpdateResourceAssignments()
Dim wsProxy As Worksheet
Dim proxyDict As Object
Set proxyDict = CreateObject(“Scripting.Dictionary”)

Set wsProxy = ThisWorkbook.Sheets(“代行者設定”)

‘ データ範囲の最終行を検知し、辞書に格納 (高速化の肝)
Dim lastRow As Long
lastRow = wsProxy.Cells(wsProxy.Rows.Count, 1).End(xlUp).Row

Dim i As Long
For i = 2 To lastRow
‘ [元ID], [代行ID] が列1, 列2にあると仮定
If Not proxyDict.Exists(wsProxy.Cells(i, 1).Value) Then
proxyDict.Add wsProxy.Cells(i, 1).Value, wsProxy.Cells(i, 2).Value
End If
Next i

‘ ここでタスクシートをループさせ、GetActiveResourceを呼び出す
‘ 処理の詳細は割愛するが、この辞書を渡すことで高速かつ安全に処理可能
Debug.Print “リソース割り当ての再計算が完了しました。”
End Sub

—

4. プロダクション環境での重要注意点

ファイル連携の罠

CSVや外部DBと連携する場合、「排他制御」を忘れてはならない。複数の担当者が同時にツールを開く可能性があるなら、設定ファイルは読み取り専用で開くか、ADODBを用いてSQLで直接データのみを取得する手法を推奨する。

保守性のためのカプセル化

上記の `GetActiveResource` のように、ロジックを関数として独立させよ。「タスクを書き換えるマクロ」の中に計算式を直書きするな。計算ロジックを分離しておくことで、将来的に「代行期間の自動判定(日付比較)」といった要件変更が加わった際、修正箇所を1箇所に限定できる。

—

最後に:なぜ自動化するのか

リソース管理をVBA化するのは、単に楽をするためではない。「誰がどのタスクを負うべきか」というプロジェクトの透明性を担保し、人間が本来注力すべき「品質向上」や「課題解決」にリソースを割くためだ。

このコードをコピー&ペーストして終わりにするのではなく、あなたの現場のデータ構造に合わせて「どのID体系が最も安全か」を一度熟考してほしい。

システムとは、設計思想そのものだ。泥臭い手作業を、洗練されたロジックへと昇華させよう。期待している。

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