リソースの「参画期間」を自動化せよ:Project VBAでプロジェクト管理の泥沼から脱出する
こんにちは。現場の「自動化」を極めるアーキテクトです。
MS Projectを使っていると、必ずぶつかる壁があります。「タスクが増えるたびに、リソースの開始日や終了日を手動で修正して回る」という非生産的な作業です。
リソースシートの「開始/終了日」は、プロジェクトの予算管理や稼働率算出の要(かなめ)。ここがズレれば、レポートの信頼性はゼロになります。今回は、「タスクのスケジュールからリソースの参画期間を自動算出する」という、現場のエンジニアが喉から手が出るほど欲しがる自動化ロジックを伝授します。
—
1. なぜ「手動」ではいけないのか?
初学者のうちは、「リソースシートで日付を直せばいいじゃん」と思うかもしれません。しかし、プロジェクトが進行し、タスクの順序が入れ替わったり、担当者が追加されたりするたびに修正するのは、「泥沼の始まり」です。
VBAを使えば、以下の利点が得られます。
- 整合性の担保: タスクの実態とリソースの稼働期間が常に一致する。
- ヒューマンエラーの排除: 入力ミスによるコスト計算の狂いを防ぐ。
- 圧倒的な時短: 1時間かかる集計が、ボタン一つで0.1秒に。
—
2. 核心を突くVBAロジック
今回のプログラムの考え方はシンプルです。
1. プロジェクト内の全リソースをループで回す。
2. 各リソースが担当している全「割り当て(Assignment)」を調査する。
3. そのリソースの「一番早い開始日」と「一番遅い終了日」を特定する。
4. その値をリソースシートのフィールドに書き込む。
実装コード:ResourceDatesAutoCalc
Sub AutoUpdateResourceDates()
Dim res As Resource
Dim asgn As Assignment
Dim minStart As Date
Dim maxFinish As Date
‘ プロジェクト内の全リソースを走査
For Each res In ActiveProject.Resources
‘ リソースが割り当てられていない場合はスキップ
If res.Assignments.Count > 0 Then
‘ 初期値を設定
minStart = #12/31/2099#
maxFinish = #1/1/1900#
‘ そのリソースの全割り当てを確認
For Each asgn In res.Assignments
‘ 一番早い開始日を取得
If asgn.Start < minStart Then minStart = asgn.Start
' 一番遅い終了日を取得
If asgn.Finish > maxFinish Then maxFinish = asgn.Finish
Next asgn
‘ リソースの開始/終了フィールドに反映
‘ ユーザー設定フィールド(Text1等)を使わず、標準のStart/Finishを更新
res.Start = minStart
res.Finish = maxFinish
Debug.Print res.Name & “: ” & minStart & ” ~ ” & maxFinish
End If
Next res
MsgBox “全リソースの参画期間を更新しました!”, vbInformation
End Sub
—
3. 初学者が陥りやすい「3つの落とし穴」
このコードを書く際、多くの人が躓くポイントがあります。ここをクリアすれば、あなたはもう中級者です。
① 「割り当て(Assignment)」という概念の理解
Projectのデータ構造は、「プロジェクト > リソース」と「プロジェクト > タスク」が「割り当て」を介して紐付いているという特殊な形をしています。リソースそのものをいじっても、タスクの開始日は変わりません。必ず`res.Assignments`を辿るのが鉄則です。
② 日付型の初期化ミス
`minStart`の初期値に0を入れると、1900年1月1日として扱われます。これでは比較ロジックが破綻します。未来の日付を初期値に置くという逆転の発想が、バグを生まない秘訣です。
③ 読み取り専用フィールドへの干渉
MS Projectでは、一部のフィールドが「計算フィールド」として保護されています。今回のように`res.Start`に値を代入する場合、そのリソースが「手動スケジュール」のリソース設定になっているか確認が必要です。もし更新されない場合は、リソースシート上の項目が正しいかチェックしてください。
—
4. プロの視点:パフォーマンスを意識する
もしプロジェクトに数千のタスクがある場合、`For Each`ループを多用すると、PCがフリーズしそうになります。
- 画面更新の停止: コードの先頭に `Application.ScreenUpdating = False` を入れ、最後に `True` に戻すだけで、実行速度は劇的に向上します。
- エラーハンドリング: `On Error Resume Next` を軽率に使わず、`If res Is Nothing Then` といった生存確認を丁寧に行うのが、伝説的なコードの書き方です。
—
さあ、次のステップへ
このコードを「開発」タブのVBAエディタに貼り付けて実行してみてください。これまで手作業で苦労していた時間が、一瞬で解決される感動を味わえるはずです。
Project VBAは、ただの「自動化ツール」ではありません。プロジェクトという複雑な生命体を、あなたの手で正しく制御するための「魔法の杖」です。
ここを突破したあなたは、もうマクロの記録をポチポチ押すだけのユーザーではありません。次は、この日付情報を元に「コストを自動でアラートする機能」を実装してみませんか?
応援していますよ。困ったことがあれば、またいつでも聞きに来てください。
