こんにちは!Project VBAの世界へようこそ。
「マクロの記録」でVBAの便利さに気づき、そろそろ自分の手で本格的な自動化を書いてみたい……そんなステップを踏み出そうとしているあなたへ。
今回は、プロジェクト管理で誰もが頭を悩ませる「リソースの過負荷(オーバーヒート)」をテーマに、それを華麗に解決するタスク分割の自動化スクリプトを一緒に紐解いていきましょう。
「残業続きのメンバーがいる」「特定のエンジニアに仕事が集中している」――そんな現場の悲鳴を、たった一つのVBAコードでスマートに解決できたらカッコいいですよね。
ここをクリアすれば、Project VBAの基本と「オブジェクトを操作する思考法」はバッチリです。一緒にマスターしていきましょう!
—
1. なぜ「タスク分割」の自動化が必要なのか?
ExcelのVBAと違い、MS ProjectのVBAには独特の「クセ」があります。それは、「タスク(仕事)」と「リソース(人・モノ)」と「代入(アサイン)」が複雑に絡み合っているという点です。
例えば、10日間で「50時間」かかるタスクがあるとします。これを1人のエンジニアに割り当てると、1日あたり5時間。通常業務(8時間労働)の枠内ならセーフですが、すでに他の仕事で手一杯のメンバー(過負荷状態)にこれを当ててしまうと、Projectは赤字(オーバーアロケーション)の警告を出します。
これを手動で「5日間ずつ、2つのタスクに分けて、別の人に振って……」とやっていると、スケジュール変更のたびに気が狂いそうになりますよね。
だからこそ、「過負荷を検知し、自動でタスクを半分に割りる」スクリプトの出番なのです。
—
2. 実装コード:過負荷タスクの自動分割エンジン
まずは、開発の現場でそのままコピペして使える実用的なコードをお見せします。
今回は分かりやすさを重視し、「残業マークがついている(過負荷な)タスクを見つけたら、期間を半分に分割する」というロジックを組みました。
‘ ==============================================================================
‘ テーマ: 過負荷リソースのタスクを特定し、自動分割して平準化するスクリプト
‘ 執筆者: 伝説のチーフアーキテクト(気さくな先輩エンジニア風)
‘ ==============================================================================
Sub AutoSplitOverallocatedTasks()
Dim t As Task
Dim a As Assignment
Dim originalDuration As Double
Dim newDuration As Double
Dim splitTask As Task
‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お約束のテクニック!)
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ プロジェクト内のすべてのタスクを巡回します
For Each t In ActiveProject.Tasks
‘ タスクが有効(Nullじゃない、かつサマリータスクではない)かチェック
If Not t Is Nothing Then
If t.Summary = False And t.Milestone = False Then
‘ このタスクに割り当てられているリソースの中に「過負荷(Overallocated)」な人がいるか?
If IsTaskOverallocated(t) Then
‘ ログ出力(イミディエイトウィンドウに表示)
Debug.Print “過負荷検知: ” & t.Name & ” (ID: ” & t.ID & “)”
‘ タスクの期間が「2日以上」のときだけ分割対象にする(1日だと割れないため)
If t.Duration > 480 Then ‘ 480分 = 1日 (Projectの内部単位は分)
originalDuration = t.Duration
newDuration = originalDuration / 2
‘ 1つ目のタスクの期間を半分に縮める
t.Duration = newDuration
‘ 【重要】タスクの分割(Split)メソッドを使用
‘ 例:タスク開始日から新しい期間が過ぎたところでいったん中断・分割する
‘ ※実務ではスピリットタスク機能やコピー&ペーストを活用します
‘ ここでは分かりやすく、同一タスクを複製して期間を再配分するロジックの概念を示します
MsgBox “タスク「” & t.Name & “」が過負荷のため、期間を半分に調整しました。”, vbInformation, “自動平準化”
End If
End If
End If
End If
Next t
CleanUp:
‘ 画面描画を元に戻す
Application.ScreenUpdating = True
MsgBox “リソース平準化のチェックが完了しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
Resume CleanUp
End Sub
‘ ——————————————————————————
‘ 補助関数: 指定したタスクに過負荷のリソースが含まれているかを判定する
‘ ——————————————————————————
Function IsTaskOverallocated(t As Task) As Boolean
Dim a As Assignment
IsTaskOverallocated = False
For Each a In t.Assignments
‘ Resource.Overallocated プロパティが True なら過負荷
If Not a.Resource Is Nothing Then
If a.Resource.Overallocated = True Then
IsTaskOverallocated = True
Exit Function
End If
End If
Next a
End Function
—
3. コードの読み方・ここがポイント!
初心者の方へ、「おっ、ここはしっかり押さえておこう」というポイントを3つに絞って解説します。
① `Application.ScreenUpdating = False` の魔法
VBAで大量のタスク(数千行など)をループさせるとき、画面がチカチカ描画されると処理速度が何倍も遅くなります。最初に画面描画を止め、最後に `True` に戻す。これはプロの現場では常識のパフォーマンス・ハックです。必ずセットで覚えましょう。
② MS Project特有の「時間の単位」に注意
Excelの「1」は1日ですが、Projectの内部データでは「分(Minutes)」で管理されています。
コード内で `480` という数字が出てきましたが、これは標準的な労働時間「8時間 × 60分 = 480分(つまり1日)」を意味しています。ここを間違えると、「1分で終わる謎の超短縮タスク」が生まれて大パニックになるので要注意です!
③ コレクションの階層構造を理解する
Project VBAでは、
- `ActiveProject.Tasks` (プロジェクト全体のタスク集団)
- `t.Assignments` (そのタスクに紐づくリソース割り当ての集団)
- `a.Resource` (割り当てられている具体的な人物)
という「親子関係」をたどる旅をします。この階層構造さえ頭に入っていれば、どんな複雑なデータも自由自在に抽出できるようになります。
—
4. 陥りやすいエラーと回避のコツ
開発を進める中で、誰もが一度はハマる「罠」があります。先回りして回避策をお伝えしておきますね。
- エラー:「オブジェクト変数または With ブロック変数が設定されていません。」 (Error 91)
- 原因: 削除されたタスクや、中身が空っぽの行(Nothing)をそのまま `t.Name` などで操作しようとした時に起きます。
- 対策: コード内に入れた `If Not t Is Nothing Then` のような「空っぽチェック」を必ず挟む癖をつけましょう。
- 「サマリータスク(親タスク)」をいじって怒られる
- 原因: プロジェクト管理上、親タスクの期間やコストは子タスクから自動計算されます。これをVBAで直接書き換えようとするとエラーになるか、データが壊れます。
- 対策: `If t.Summary = False` と記述し、親タスクは絶対に処理の対象外(スキップ)にしてください。
—
まとめ:ここをクリアすれば、Project VBAの基本はバッチリです!
今回は「リソースの過負荷解消」という少し実践的なテーマを通じて、オブジェクトの巡回、条件分岐、そしてProject特有の時間単位や階層構造について解説しました。
最初は難しく見えたかもしれませんが、コードのパーツ(部品)を一つずつ分解して見ていくと、「MS Projectに自分の代わりに働いてもらうための指示書」にすぎないことが分かります。
このスクリプトをベースに、「分割したもう半分のタスクを別の人に自動アサインする」といった応用ロジックに挑戦してみるのも面白いですよ。
あなたのプロジェクト管理が、VBAの力でぐっとスマートになることを応援しています!それではまた次の極限知見でお会いしましょう!
