- マネジメント
要員計画の書き方|山積み表と山崩しをエクセルで作る手順と数式
要員計画とは、見積もった工数を「どの役割の人が、どの月に、何人月ぶん働くか」に割り付けた計画です。必要な人月を月ごとに積み上げた表が山積み表、上限の人数を超えた月の作業を別の月へ移して平らにする作業が山崩しです。
この記事はシステム開発の要員計画に絞り、工数の見積もりが終わった後の配置と平準化だけを扱います。8か月・8名の架空の開発を題材に、貼り付けて使えるタブ区切りのデータ、SUMIFS と COUNTIF の数式、山崩しの計算手順を載せました。数式は LibreOffice Calc で計算した結果を、山崩しは Python で同じ計算をした結果を並べています。
確認環境:Ubuntu 24.04、LibreOffice Calc 24.2.7(数式の計算)、Python 3.11.15(山崩しの計算)。記事の計算結果はすべて Calc で求めた値で、使う関数は SUMIFS・COUNTIF・SUM・MIN・MAX・IF・ROUND の7つです。
要員計画の早見表
| 作るもの | 中身 | 使う数式 | 見るところ |
|---|---|---|---|
| 必要工数の一覧 | 工程・役割・月・人月を1行ずつ | なし(入力) | 見積もりの合計と一致しているか |
| 山積み表 | 役割×月の必要人月 | SUMIFS |
上限を超える月があるか |
| 過負荷の検出 | 上限を超えた月の数 | COUNTIF、IF |
どの役割の、どの月か |
| 山崩し | 超えた分を前後の月へ移す | MIN、MAX |
合計が変わっていないか、終了月 |
| アサイン表 | 氏名×月の人月 | SUMIFS |
1人が1.0人月を超える月がないか |
| 稼働率 | 割り当てた人月÷働ける人月 | ROUND |
低すぎ・高すぎの人がいないか |
作る順番は、必要工数の一覧 → 山積み表 → 山崩し → アサイン表です。先に役割ごとの山をならしてから人の名前を入れると、手戻りが少なくなります。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「要員計画の書き方|山積み表と山崩しをエクセルで作る手順と数式」
人月・人日・稼働率の換算
1人月は「1人が1か月働く量」です。日数や時間に直すときの値は組織ごとに決めます。ここでは 1人月=20人日、1人日=8時間と置きます。
DAYS, HOURS = 20, 8 # 1人月 = 20人日、1人日 = 8時間 と置いた場合
print("稼働率\t人月\t人日\t時間")
for rate in (1.0, 0.8, 0.75, 0.6, 0.5, 0.4, 0.25, 0.2, 0.1):
print(f"{rate:.0%}\t{rate:g}\t{rate * DAYS:g}\t{rate * DAYS * HOURS:g}")
実行結果(タブ区切りなので、そのまま表計算ソフトに貼れます):
稼働率 人月 人日 時間
100% 1 20 160
80% 0.8 16 128
75% 0.75 15 120
60% 0.6 12 96
50% 0.5 10 80
40% 0.4 8 64
25% 0.25 5 40
20% 0.2 4 32
10% 0.1 2 16
| 用語 | 意味 | 式 |
|---|---|---|
| 人月 | 1人が1か月働く量 | 人数 × 月数 |
| 人日 | 1人が1日働く量 | 人月 × 20(この記事の前提) |
| 稼働率 | 働ける量のうち、割り当てた量の割合 | 割り当てた人月 ÷ 働ける人月 |
| 上限(キャパシティ) | その月に用意できる人月 | 人数 × 1人あたりの上限 |
1人の上限を1.0人月ちょうどにすると、会議・問い合わせ対応・休暇の余地がなくなります。計画では1人あたり0.8〜0.9人月を上限に置く方法がよく使われます。この記事では計算を追いやすくするため、上限を1.0人月として説明します。
手順1:必要工数を「工程・役割・月・人月」の縦長の表にする
題材は、要件定義から移行・リリースまでを4月〜11月の8か月で行う開発です。見積もりで出した工数を、次のように1行に1つの値で並べます。横に月を並べた表より行は増えますが、SUMIFS でどの切り口にも集計できます。
次のブロックを、新しいシートの A1 セルに貼り付けてください(A列〜D列、1行目が見出し、26行目まで)。
工程 役割 月 人月
要件定義 PM 4月 0.5
要件定義 PM 5月 0.5
要件定義 SE 4月 1.5
要件定義 SE 5月 2
設計 PM 6月 0.5
設計 SE 6月 2
設計 PG 5月 1
設計 PG 6月 3
製造 PM 7月 0.5
製造 PM 8月 0.5
製造 SE 7月 1
製造 SE 8月 1
製造 PG 7月 6
製造 PG 8月 5
結合テスト PM 9月 0.5
結合テスト SE 9月 1.5
結合テスト PG 9月 3
結合テスト テスター 9月 1
総合テスト PM 10月 0.5
総合テスト SE 10月 2
総合テスト PG 10月 1
総合テスト テスター 10月 1
移行・リリース PM 11月 0.5
移行・リリース SE 11月 1
移行・リリース テスター 11月 0.5
手順2:SUMIFSで山積み表(役割×月)を作る
F1 セルから右に見出し(役割、4月〜11月、合計、上限、超過月数)、F2〜F5 に役割名(PM、SE、PG、テスター)を入力し、次の数式を入れます。
| セル | 数式 | 意味 |
|---|---|---|
| G2 | =SUMIFS($D$2:$D$100,$B$2:$B$100,$F2,$C$2:$C$100,G$1) |
役割がF列、月が1行目と一致する人月の合計 |
| O2 | =SUM(G2:N2) |
役割ごとの合計 |
| P2 | 1(PM)、2(SE)、4(PG)、1(テスター) |
月あたりの上限(人月)を入力 |
| Q2 | =COUNTIF(G2:N2,">"&P2) |
上限を超えた月の数 |
| G6 | =SUM(G2:G5) |
月ごとの合計 |
| G7 | =IF(G4>$P4,"超過","") |
PGの行が上限を超えた月に印を付ける |
G2 の数式は、範囲を絶対参照($D$2:$D$100)、役割を列だけ固定($F2)、月を行だけ固定(G$1)にしてあるので、N5 までそのままコピーできます。
LibreOffice Calc で計算した結果は次のとおりです。
| 役割 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 合計 | 上限 | 超過月数 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| PM | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 4 | 1 | 0 |
| SE | 1.5 | 2 | 2 | 1 | 1 | 1.5 | 2 | 1 | 12 | 2 | 0 |
| PG | 0 | 1 | 3 | 6 | 5 | 3 | 1 | 0 | 19 | 4 | 2 |
| テスター | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0.5 | 2.5 | 1 | 0 |
| 合計 | 2 | 3.5 | 5.5 | 7.5 | 6.5 | 6 | 4.5 | 2 | 37.5 | 8 | 0 |
| 判定(PG) | 超過 | 超過 |
この表から2つのことが読み取れます。
- PG は7月(6人月)と8月(5人月)が、上限の4人月を超えています。
- 合計の行の超過月数は 0 です。 全体の上限8人月には収まっていても、役割ごとに見ると超えている月があります。山積み表は役割(またはスキル)ごとに見るのが要点です。
手順3:山崩しを1ステップずつ計算する
山崩しは、上限を超えた分を、隣の月へ順に送る計算です。PG の行(上限4人月)を、4月から順に見ていきます。
| ステップ | 見る月 | その月の人月 | 上限との差 | 行うこと | 結果 |
|---|---|---|---|---|---|
| 1 | 4月〜6月 | 0、1、3 | 超えていない | そのまま | 0、1、3 |
| 2 | 7月 | 6 | 2 超過 | 2人月を8月へ送る | 7月は4、8月は 5+2=7 |
| 3 | 8月 | 7 | 3 超過 | 3人月を9月へ送る | 8月は4、9月は 3+3=6 |
| 4 | 9月 | 6 | 2 超過 | 2人月を10月へ送る | 9月は4、10月は 1+2=3 |
| 5 | 10月 | 3 | 超えていない | そのまま | 3 |
| 6 | 11月 | 0 | 超えていない | そのまま | 0 |
| PG | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 合計 |
|---|---|---|---|---|---|---|---|---|---|
| 山崩し前 | 0 | 1 | 3 | 6 | 5 | 3 | 1 | 0 | 19 |
| 山崩し後 | 0 | 1 | 3 | 4 | 4 | 4 | 3 | 0 | 19 |
合計は19人月のままで、山の高さだけが4人月に収まりました。合計が変わっていないことは、山崩しの後に必ず確かめる点です。
表計算ソフトの数式で山崩しをする
同じ計算は MIN と MAX で書けます。1行目に見出し、2行目に山崩し前の値(B2〜I2)、K2 に上限を置いた場合の数式です。
項目 4月 5月 6月 7月 8月 9月 10月 11月 合計 上限
山崩し前 0 1 3 6 5 3 1 0 =SUM(B2:I2) 4
山崩し後 =MIN($K$2,B2) =MIN($K$2,C2+B4) =MIN($K$2,D2+C4) =MIN($K$2,E2+D4) =MIN($K$2,F2+E4) =MIN($K$2,G2+F4) =MIN($K$2,H2+G4) =MIN($K$2,I2+H4) =SUM(B3:I3)
翌月へ送る分 =MAX(0,B2-$K$2) =MAX(0,C2+B4-$K$2) =MAX(0,D2+C4-$K$2) =MAX(0,E2+D4-$K$2) =MAX(0,F2+E4-$K$2) =MAX(0,G2+F4-$K$2) =MAX(0,H2+G4-$K$2) =MAX(0,I2+H4-$K$2)
| 行 | 数式(C列の例) | 意味 |
|---|---|---|
| 山崩し後 | =MIN($K$2,C2+B4) |
「その月の人月+前月から送られた分」と上限の小さいほう |
| 翌月へ送る分 | =MAX(0,C2+B4-$K$2) |
上限を超えた分。超えていなければ 0 |
LibreOffice Calc で計算した結果:
項目,4月,5月,6月,7月,8月,9月,10月,11月,合計,上限
山崩し前,0,1,3,6,5,3,1,0,19,4
山崩し後,0,1,3,4,4,4,3,0,19,
翌月へ送る分,0,0,0,2,3,2,0,0,,
手計算のステップ2〜4で送った 2、3、2 が「翌月へ送る分」の行に並びます。最終月(I4)が 0 でなければ、期間内に収まっていないという合図です。K2 の上限を書き換えると、何人なら何月に終わるかをすぐに試せます。
手順4:同じ山崩しをPythonで再現する
上限を変えたときと、後ろではなく前へ送ったときの結果を、Python で確かめます。
MONTHS = ["4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月"]
PG = [0, 1, 3, 6, 5, 3, 1, 0] # 山積み表のPGの行(人月)
def level_forward(demand, cap, months):
"""上限を超えた分を翌月へ送る(後ろへずらす山崩し)。"""
plan, months = list(demand), list(months)
i = 0
while i < len(plan):
over = round(plan[i] - cap, 2)
if over > 0:
if i + 1 == len(plan): # 最終月でも収まらなければ月を足す
plan.append(0)
months.append(f"延長{len(plan) - len(demand)}")
print(f" {months[i]}: {plan[i]:g} > {cap:g} なので {over:g} を{months[i + 1]}へ "
f"({months[i + 1]}: {plan[i + 1]:g} -> {plan[i + 1] + over:g})")
plan[i] = cap
plan[i + 1] = round(plan[i + 1] + over, 2)
i += 1
return plan, months
def level_backward(demand, cap, months):
"""上限を超えた分を前月へ送る(前倒しの山崩し)。"""
plan = list(demand)
for i in range(len(plan) - 1, 0, -1):
over = round(plan[i] - cap, 2)
if over > 0:
print(f" {months[i]}: {plan[i]:g} > {cap:g} なので {over:g} を{months[i - 1]}へ "
f"({months[i - 1]}: {plan[i - 1]:g} -> {plan[i - 1] + over:g})")
plan[i] = cap
plan[i - 1] = round(plan[i - 1] + over, 2)
return plan
def show(label, months, plan):
print(label)
print(" " + "\t".join(months) + "\t合計")
print(" " + "\t".join(f"{v:g}" for v in plan) + f"\t{sum(plan):g}")
show("山崩し前", MONTHS, PG)
for cap in (4, 2.5):
print(f"\n== 上限 {cap:g} 人月/月:後ろへずらす ==")
plan, months = level_forward(PG, cap, MONTHS)
show("山崩し後", months, plan)
print("\n== 上限 4 人月/月:前倒しする ==")
plan = level_backward(PG, 4, MONTHS)
show("山崩し後", MONTHS, plan)
実行結果:
山崩し前
4月 5月 6月 7月 8月 9月 10月 11月 合計
0 1 3 6 5 3 1 0 19
== 上限 4 人月/月:後ろへずらす ==
7月: 6 > 4 なので 2 を8月へ (8月: 5 -> 7)
8月: 7 > 4 なので 3 を9月へ (9月: 3 -> 6)
9月: 6 > 4 なので 2 を10月へ (10月: 1 -> 3)
山崩し後
4月 5月 6月 7月 8月 9月 10月 11月 合計
0 1 3 4 4 4 3 0 19
== 上限 2.5 人月/月:後ろへずらす ==
6月: 3 > 2.5 なので 0.5 を7月へ (7月: 6 -> 6.5)
7月: 6.5 > 2.5 なので 4 を8月へ (8月: 5 -> 9)
8月: 9 > 2.5 なので 6.5 を9月へ (9月: 3 -> 9.5)
9月: 9.5 > 2.5 なので 7 を10月へ (10月: 1 -> 8)
10月: 8 > 2.5 なので 5.5 を11月へ (11月: 0 -> 5.5)
11月: 5.5 > 2.5 なので 3 を延長1へ (延長1: 0 -> 3)
延長1: 3 > 2.5 なので 0.5 を延長2へ (延長2: 0 -> 0.5)
山崩し後
4月 5月 6月 7月 8月 9月 10月 11月 延長1 延長2 合計
0 1 2.5 2.5 2.5 2.5 2.5 2.5 2.5 0.5 19
== 上限 4 人月/月:前倒しする ==
8月: 5 > 4 なので 1 を7月へ (7月: 6 -> 7)
7月: 7 > 4 なので 3 を6月へ (6月: 3 -> 6)
6月: 6 > 4 なので 2 を5月へ (5月: 1 -> 3)
山崩し後
4月 5月 6月 7月 8月 9月 10月 11月 合計
0 3 4 4 4 3 1 0 19
3つの結果を並べると、選び方が見えてきます。
| 方法 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 延長 | 読み取れること |
|---|---|---|---|---|---|---|---|---|---|---|
| 山崩し前 | 0 | 1 | 3 | 6 | 5 | 3 | 1 | 0 | なし | 7月・8月が上限4を超える |
| 上限4・後ろへ | 0 | 1 | 3 | 4 | 4 | 4 | 3 | 0 | なし | 期間内に収まる。9月・10月の作業が増える |
| 上限2.5・後ろへ | 0 | 1 | 2.5 | 2.5 | 2.5 | 2.5 | 2.5 | 2.5 | 2か月 | 人数を絞ると終了が2か月延びる |
| 上限4・前倒し | 0 | 3 | 4 | 4 | 4 | 3 | 1 | 0 | なし | 後半は元のまま。5月・6月に着手できる作業が必要 |
上限(人数)と期間は、片方を下げるともう片方が伸びる関係にあります。上限2.5の結果は、PG を2〜3名に抑えると11月を超えて2か月分の作業が残ることを示しています。
山の形を文字のグラフで見る
グラフを作る前に、形だけ確かめたいときのスクリプトです。
MONTHS = ["4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月"]
before = [0, 1, 3, 6, 5, 3, 1, 0]
after = [0, 1, 3, 4, 4, 4, 3, 0]
CAP = 4
for label, plan in (("山崩し前", before), ("山崩し後", after)):
print(f"{label}(上限 {CAP} 人月。上限を超えた分は □)")
for m, v in zip(MONTHS, plan):
bar = "■" * min(v, CAP) + "□" * max(0, v - CAP)
print(f"{m:>3} | {bar} {v}")
print()
実行結果:
山崩し前(上限 4 人月。上限を超えた分は □)
4月 | 0
5月 | ■ 1
6月 | ■■■ 3
7月 | ■■■■□□ 6
8月 | ■■■■□ 5
9月 | ■■■ 3
10月 | ■ 1
11月 | 0
山崩し後(上限 4 人月。上限を超えた分は □)
4月 | 0
5月 | ■ 1
6月 | ■■■ 3
7月 | ■■■■ 4
8月 | ■■■■ 4
9月 | ■■■■ 4
10月 | ■■■ 3
11月 | 0
手順5:山崩しの結果を工程に戻して確かめる
山崩しは数字の移動ですが、実際に動くのは工程の作業です。PG の19人月を工程に戻すと、次のようになります。
| PGの作業 | 山崩し前 | 山崩し後 | 変わった点 |
|---|---|---|---|
| 設計 | 5月 1、6月 3 | 5月 1、6月 3 | 変更なし |
| 製造(11人月) | 7月 6、8月 5 | 7月 4、8月 4、9月 3 | 製造の完了が8月末から9月に延びる |
| 結合テスト(3人月) | 9月 3 | 9月 1、10月 2 | 開始は9月のまま、完了が10月に延びる |
| 総合テスト(1人月) | 10月 1 | 10月 1 | 結合テストの後半と重なる |
| 合計 | 19 | 19 | 変更なし |
数字の上では期間内に収まりましたが、結合テストの完了が10月にずれるため、同じ工程に入る SE とテスターの月も見直す必要があります。山崩しの後に確かめる点をまとめます。
| 確かめること | 見方 |
|---|---|
| 合計が変わっていない | 山崩し前後の合計が同じ |
| 工程の順序が保たれている | 後の工程が、前の工程の完了より先に終わっていない |
| 他の役割とずれていない | 同じ工程の PM・SE・テスターの月も合わせて動かしたか |
| 節目の日付に影響しない | リリース日や受け入れテストの開始日が動かないか |
| 余裕のある作業から動かしている | 遅らせても終了日に響かない作業を先に動かす |
上限を超えたときの選択肢
後ろへずらす以外にも方法があります。条件に合うものを組み合わせます。
| 選択肢 | 行うこと | 向いている場面 | 一緒に確かめること |
|---|---|---|---|
| 後ろへずらす | 超えた分を翌月以降へ送る | 終了までに余裕がある | 後続の工程と節目の日付 |
| 前倒しする | 超えた分を前の月へ送る | 先に着手できる作業がある(環境構築、共通部品など) | 前提となる設計が済んでいるか |
| 人を増やす | 山の月だけ上限を上げる | 期間を動かせない | 立ち上がりの時間、教える側の負担 |
| 役割をまたぐ | 余裕のある役割が手伝う | SE が製造の一部を担当できる | スキルが合うか |
| 範囲を分ける | 一部の機能を次の段階に回す | 優先度の低い機能がある | 依頼者との合意 |
手順6:アサイン表(氏名×月)を作り、過負荷を検出する
役割ごとの山がならせたら、人の名前を入れます。ここでも氏名・役割・作業・月・人月を1行ずつ並べ、他の仕事(別システムの保守、研修の講師など)も同じ表に入れるのが要点です。開発の分だけを見ていると、掛け持ちによる重なりが見えないためです。
次のブロックを、新しいシートの A1 セルに貼り付けてください(A列〜E列、52行目まで)。
氏名 役割 作業 月 人月
佐藤 PM 進行管理 4月 0.5
佐藤 PM 進行管理 5月 0.5
佐藤 PM 進行管理 6月 0.5
佐藤 PM 進行管理 7月 0.5
佐藤 PM 進行管理 8月 0.5
佐藤 PM 進行管理 9月 0.5
佐藤 PM 進行管理 10月 0.5
佐藤 PM 進行管理 11月 0.5
鈴木 SE 要件定義・設計 4月 1
鈴木 SE 要件定義・設計 5月 1
鈴木 SE 要件定義・設計 6月 1
鈴木 SE 要件定義・設計 7月 0.5
鈴木 SE 要件定義・設計 8月 0.5
鈴木 SE 要件定義・設計 9月 1
鈴木 SE 要件定義・設計 10月 1
鈴木 SE 要件定義・設計 11月 0.5
鈴木 SE 別システムの保守 6月 0.2
鈴木 SE 別システムの保守 7月 0.2
鈴木 SE 別システムの保守 10月 0.2
高橋 SE 要件定義・設計 4月 0.5
高橋 SE 要件定義・設計 5月 1
高橋 SE 要件定義・設計 6月 1
高橋 SE 要件定義・設計 7月 0.5
高橋 SE 要件定義・設計 8月 0.5
高橋 SE 要件定義・設計 9月 0.5
高橋 SE 要件定義・設計 10月 1
高橋 SE 要件定義・設計 11月 0.5
田中 PG 製造・テスト 5月 1
田中 PG 製造・テスト 6月 1
田中 PG 製造・テスト 7月 1
田中 PG 製造・テスト 8月 1
田中 PG 製造・テスト 9月 1
田中 PG 製造・テスト 10月 1
伊藤 PG 製造・テスト 6月 1
伊藤 PG 製造・テスト 7月 1
伊藤 PG 製造・テスト 8月 1
伊藤 PG 製造・テスト 9月 1
伊藤 PG 製造・テスト 10月 1
渡辺 PG 製造・テスト 6月 1
渡辺 PG 製造・テスト 7月 1
渡辺 PG 製造・テスト 8月 1
渡辺 PG 製造・テスト 9月 1
渡辺 PG 製造・テスト 10月 0.5
渡辺 PG 社内研修の講師 7月 0.2
山本 PG 製造・テスト 7月 1
山本 PG 製造・テスト 8月 1
山本 PG 製造・テスト 9月 1
山本 PG 製造・テスト 10月 0.5
中村 テスター テスト 9月 1
中村 テスター テスト 10月 1
中村 テスター テスト 11月 0.5
G1 セルから右に見出し(氏名、4月〜11月、合計、1.0超の月数、平均稼働率)、G2〜G9 に氏名を入力し、次の数式を入れます。
| セル | 数式 | 意味 |
|---|---|---|
| H2 | =SUMIFS($E$2:$E$200,$A$2:$A$200,$G2,$D$2:$D$200,H$1) |
氏名と月が一致する人月の合計(作業をまたいで合算) |
| P2 | =SUM(H2:O2) |
1人の合計人月 |
| Q2 | =COUNTIF(H2:O2,">1") |
1.0人月を超えた月の数 |
| R2 | =ROUND(P2/8,2) |
8か月の平均稼働率 |
| H10 | =SUM(H2:H9) |
月ごとの合計 |
| H11 | =SUMIFS($E$2:$E$200,$B$2:$B$200,"PG",$D$2:$D$200,H$1,$C$2:$C$200,"製造・テスト") |
PG の開発分の合計(山崩し後の値との照合用) |
| H12 | =COUNTIF(H2:H9,">1") |
その月に1.0人月を超えた人数 |
LibreOffice Calc で計算した結果:
| 氏名 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 合計 | 1.0超の月数 | 平均稼働率 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 佐藤 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 4 | 0 | 0.5 |
| 鈴木 | 1 | 1 | 1.2 | 0.7 | 0.5 | 1 | 1.2 | 0.5 | 7.1 | 2 | 0.89 |
| 高橋 | 0.5 | 1 | 1 | 0.5 | 0.5 | 0.5 | 1 | 0.5 | 5.5 | 0 | 0.69 |
| 田中 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 6 | 0 | 0.75 |
| 伊藤 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 5 | 0 | 0.63 |
| 渡辺 | 0 | 0 | 1 | 1.2 | 1 | 1 | 0.5 | 0 | 4.7 | 1 | 0.59 |
| 山本 | 0 | 0 | 0 | 1 | 1 | 1 | 0.5 | 0 | 3.5 | 0 | 0.44 |
| 中村 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0.5 | 2.5 | 0 | 0.31 |
| 合計 | 2 | 3.5 | 5.7 | 5.9 | 5.5 | 7 | 6.7 | 2 | 38.3 | 3 | |
| PGの合計 | 0 | 1 | 3 | 4 | 4 | 4 | 3 | 0 | |||
| 1.0超の人数 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
- 「PGの合計」の行は 0、1、3、4、4、4、3、0 で、山崩し後の値と一致しています。役割の計画と人の割り当てがずれていないことの確認になります。
- 鈴木さんは6月と10月、渡辺さんは7月が1.2人月です。どちらも開発の作業に別の仕事が重なった月で、作業別の行を1人分まとめて初めて見つかります。
- 平均稼働率は8か月をならした値なので、鈴木さんの 0.89 だけを見ても月ごとの超過はわかりません。平均と月別の両方を見ます。
過負荷を直す
見つかった3か所は、山崩しと同じ考え方で直せます。
| 対象 | 状況 | 直し方の例 |
|---|---|---|
| 鈴木・6月(1.2) | 設計 1.0+別システムの保守 0.2 | 保守の 0.2 を、0.7人月の7月へ移す(7月は 0.9 になる) |
| 鈴木・10月(1.2) | 総合テスト 1.0+保守 0.2 | 保守の 0.2 を、0.5人月の11月へ移す(11月は 0.7 になる) |
| 渡辺・7月(1.2) | 製造 1.0+研修の講師 0.2 | 講師の 0.2 を、0.5人月の10月へ移す(10月は 0.7 になる) |
直したら COUNTIF の列(Q列と12行目)がすべて 0 になることを確かめます。
要員計画書に書く項目
表だけでなく、前提を文章で添えると読み手に伝わります。
# 要員計画書
## 1. 前提
- 対象期間:【YYYY年MM月〜YYYY年MM月】
- 換算:1人月=【20】人日、1人日=【8】時間
- 1人あたりの上限:【0.9】人月/月(会議・休暇の分を除く)
- 見積もりの合計:【37.5】人月(見積書【番号】の値)
## 2. 役割と人数
| 役割 | 人数 | 月あたりの上限(人月) | 担当する工程 |
|---|---|---|---|
| PM | 【1】 | 【1】 | 全工程 |
| SE | 【2】 | 【2】 | 要件定義、設計、テスト |
| PG | 【4】 | 【4】 | 設計、製造、テスト |
| テスター | 【1】 | 【1】 | 結合テスト以降 |
## 3. 山積み表(役割×月)
(山崩し前と山崩し後の両方を貼る)
## 4. 山崩しの内容
| 役割 | 超過した月 | 行ったこと | 影響 |
|---|---|---|---|
| 【PG】 | 【7月、8月】 | 【製造の一部を9月へ】 | 【結合テストの完了が10月に】 |
## 5. アサイン表(氏名×月)
(他の仕事を含めた表を貼る)
## 6. 参加と離任の時期
| 氏名 | 参加 | 離任 | 引き継ぎ |
|---|---|---|---|
| 【 】 | 【MM月】 | 【MM月】 | 【 】 |
## 7. 未決事項とリスク
- 【 】
つまずきやすい点と直し方
| 起きること | 理由 | 直し方 |
|---|---|---|
| SUMIFS の結果が 0 になる | 見出しの「7月」と明細の「7月」のように、全角・半角や空白が違う | 月と役割は入力規則のリストから選ぶ |
| 合計が見積もりと合わない | 明細の行が集計の範囲(100行目まで)を超えた | 範囲を広げる。合計のセルで見積もりの値と照合する |
| 全体では収まるのに遅れる | 役割をまとめた合計だけを見ている | 役割ごと、できればスキルごとに山積みする |
| 山崩し後に順序が合わない | 数字だけを動かし、工程の前後関係を見ていない | 手順5の表で工程に戻して確かめる |
| 1人の負荷が見えない | 開発の分だけを表に入れている | 他の仕事も同じ表に行として入れる |
| 月の途中の参加が表せない | 月単位では粗い | 0.5人月のように小数で入れるか、週単位の表に分ける |
| 余裕がなくなる | 上限を1.0人月で計画している | 上限を0.8〜0.9人月に置く |
よくある質問
Q. 山積みと山崩しの違いは何ですか? A. 山積みは、必要な人月を期間ごとに積み上げて負荷の形を見えるようにすることです。山崩しは、その山が上限を超えた部分を前後の期間へ移して平らにすることです。山積みで見つけ、山崩しで整える、という順番で使います。
Q. 月単位と週単位のどちらで作るとよいですか? A. 全体の計画は月単位で十分です。製造やテストのように人の出入りが多い工程は、その期間だけ週単位の表を作ると細かな重なりが見えます。縦長の表の「月」の列を「週」に変えれば、同じ数式が使えます。
Q. 人を増やせば期間は短くなりますか? A. 山の月だけ上限を上げれば、計算上は期間内に収まります。ただ、加わった人が作業に慣れるまでの時間と、教える人の時間がかかるため、増やした人数分がそのまま進むとは限りません。参加の月を1か月早め、最初の月は0.5人月で計画する方法がよく使われます。
Q. 山崩しは、後ろへずらすのと前倒しのどちらがよいですか? A. 先に着手できる作業があるなら前倒し、なければ後ろへずらします。前倒しは終了日に響かない一方、前提となる設計が済んでいる必要があります。この記事の例では、前倒しだと5月に3人月、後ろへずらすと10月に3人月が必要になり、どちらも合計は19人月のままです。
まとめ
- 要員計画は、見積もった工数を役割・人・月に割り付ける計画です。
- データは工程・役割・月・人月の縦長の表で持ち、
SUMIFSで役割×月の山積み表にします。 - 全体の合計が上限内でも、役割ごとに見ると超える月があります。
COUNTIF(範囲,">"&上限)で超過月数を数えます。 - 山崩しは、上限を超えた分を隣の月へ順に送る計算です。
MINとMAXで書け、合計は変わりません。 - 人数(上限)と期間は引き換えの関係です。上限を書き換えて、終了月がどう動くかを試します。
- 山崩しの後は工程に戻して、順序と他の役割への影響を確かめます。
- アサイン表には他の仕事も入れ、
COUNTIF(範囲,">1")で1人の過負荷を見つけます。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「要員計画の書き方|山積み表と山崩しをエクセルで作る手順と数式」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。