エクセルで勤怠表や残業時間の集計をしていて、こんなトラブルや疑問に頭を悩ませていませんか?
- 「早退した日があると、残業時間のセルが
#####とエラー表示されてしまう」 - 「15分単位で切り捨て集計したら、1か月分の合計で1分ズレたり、労務からNGが出た…」
- 「1か月分の残業時間をSUM関数で合計したら、なぜか『17:00』のように数字が小さくなる」
この記事では、複雑なロジックを自分で一から組み立てる必要はありません。数式をそのままセルに貼り付けるだけで、8時間超え・深夜残業の自動判定から端数処理(丸め)、エラーの解消まで完了します。
実務でよく起こる「計算ズレ」の理由と正しい対処法も分かりやすく解説しますので、まずは必要な数式をコピペして使ってみてください!
今回使用するシフト勤怠管理表の基本レイアウト
まずは以下のレイアウト(2行目)を例にして、必要なセルに数式を貼り付けていきましょう。
(所定労働時間:8:00、定時:9:00〜18:00、休憩:1:00 と設定)
| セル位置 | A (日付) | B (出勤) | C (退勤) | D (休憩) | E (実労働) | F (通常残業) | G (深夜残業) |
| 2行目 | 10/1 (月) | 9:00 | 20:30 | 1:00 | 10:30 | 2:30 | 0:00 |
【法律上の原則】1分単位で正確に残業時間を自動計算するコピペ数式
労働基準法および厚生労働省のガイドライン上、労働時間は原則として「1分単位(実労働時間)」で適正に把握・計算することが義務付けられています。まずは基本となる1分単位の数式を押さえましょう。
- 8時間超えの通常残業時間を算出する数式【入力セル:F2】
- 参照セル: E2(実労働時間
=C2-B2-D2)
- 参照セル: E2(実労働時間
=MAX(0, E2 - TIME(8,0,0))マイナスの残業時間が表示されて計算が崩れる原因
単純に 実働時間 - TIME(8,0,0) や 退勤時間 - TIME(18,0,0) という引き算を行うと、定時前退勤や早退の際に計算結果がマイナス(負の値)になります。エクセルの標準設定では時刻のマイナス表示に対応していないため、セルが ##### とエラー表示されたり、月合計の集計が狂う原因になります。
解決策:MAX 関数で 0:00 で留める数式を組む
残業時間は「8時間を超えた分のみ発生する」ため、マイナスを出さずに 0:00 で留める関数を組みます。MAX(0, 計算式) で数式を組むことで、「マイナスの場合は 0:00 を表示する」という安全な処理になり、シートの崩れを防止する事ができます。
残業時間の15分単位・30分単位の端数処理(丸め)と関数の使い分け
社内ルール等で出退勤時刻や勤務時間を一定単位に揃える場合、CEILING 関数と FLOOR 関数を使い分けます。
残業時間の関数の基本ルールと使い分け
数式を組む際は、指定した時間を「切り上げて揃える」のか「切り捨てて丸める」のかによって関数を選び分けます。実務の運用ルール(出勤前か退勤後か)に合わせて適切に使い分けます。
CEILING関数(切り上げ)
指定した単位の整数倍に向かって、数値を一律で「切り上げる」処理を行う関数です。定時前に早め出勤した従業員の開始時刻を、規定の勤務開始時間へ切り上げて揃えたい場面で活用されます。- 関数の用途: 出勤時刻を15分単位に切り上げる場合(例:
8:52出勤 ➔9:00扱い)
- 関数の用途: 出勤時刻を15分単位に切り上げる場合(例:
FLOOR関数(切り捨て)
指定した単位の整数倍に向かって、端数を一律で「切り捨てる」処理を行う関数です。労働時間を計算する際、規定の単位に満たない端数の分数を削って一括処理したい場合に用いられます。- 関数の用途: 退勤時刻や実働時間・残業時間を15分単位で切り捨てる場合(例:
18:14退勤 ➔18:00扱い)
- 関数の用途: 退勤時刻や実働時間・残業時間を15分単位で切り捨てる場合(例:
① 残業時間を15分単位で端数処理(丸め)する場合
一般的な企業の勤怠管理で最も広く採用されている集計単位です。基準値の引数に "0:15" を指定することで、1時間を4分割した細やかな端数処理に対応できます。
- 出勤時刻を15分単位で「切り上げ」る場合(例: 8:51 ➔ 9:00)【入力セル:E2セル(実労働時間セル)】
- 参照セル:
B2(出勤時刻)
- 参照セル:
=CEILING(B2, "0:15")関数のポイントCEILING(数値, 基準値) は指定した倍数に切り上げる関数です。基準値を "0:15" と指定することで、8:46〜9:00の打刻をすべて「9:00」に切り上げて定時・規定単位に揃えることができます。
- 退勤時刻を15分単位で「切り捨て」る場合(例: 18:14 ➔ 18:00)【入力セル:E2セル(実労働時間セル)】
- 参照セル:
C2(退勤時刻)
- 参照セル:
=FLOOR(C2, "0:15")関数のポイントFLOOR(数値, 基準値) は指定した倍数に切り捨てる関数です。18:14など15分に満たない端数の退勤時間を切り捨てて「18:00」として集計できます。
- 端数処理後の残業時間を1セルで計算する数式【入力セル:F2】
- 参照セル:
B2(出勤時刻)、C2(退勤時刻)、D2(休憩時間)
- 参照セル:
=MAX(0, FLOOR(C2, "0:15") - CEILING(B2, "0:15") - D2 - TIME(8,0,0))関数のポイント
出勤の切り上げと退勤の切り捨てを1つの数式内で同時に処理し、8時間超えの残業時間のみを算出します。MAX(0, ...) と組み合わせることで、定時前退勤や実労働8時間未満の日にマイナスエラー(#####)が発生するのを防ぎます。
② 残業時間を30分単位で端数処理(丸め)する場合
パート・アルバイトのシフト集計や、残業申請を30分刻みで管理する企業でよく使用される設定です。基準値を "0:30" に変更するだけで、大まかな時間単位へ素早く切り替えることができます。
- 出勤切り上げ(30分)【入力セル:B列の計算用セル(例:H列)】
- 参照セル:
B2(出勤時刻)
- 参照セル:
=CEILING(B2, "0:30")関数のポイント
基準値を "0:30" に変更することで、30分単位の切り上げ(例: 8:31〜9:00 ➔ 9:00)に対応できます。
- 退勤切り捨て(30分)【入力セル:C列の計算用セル(例:I列)】
- 参照セル:
C2(退勤時刻)
- 参照セル:
=FLOOR(C2, "0:30")関数のポイント
基準値を "0:30" と指定することで、30分未満の退勤端数(例: 18:29 ➔ 18:00)を一律で切り捨てて集計します。
【労務注意】残業時間の端数処理は「日ごと」と「月合計」のどちらでやる?
労働基準法上、「日ごと」の切り捨て処理は一切認められていません。
日々発生した10分前後の残業等を毎日切り捨てて計算してしまうと、労働者が実際に働いた時間数が削られ、結果として割増賃金(残業代)の未払いが発生します(労基法第24条「全額払いの原則」違反)。
基本的には「日々の残業時間の計算は1分単位で保持し、月合計に対して適切に丸める」設計にするのが安全です。
なぜ「日々の残業時間の計算は1分単位で保持し、月合計で丸める」のが安全なのか?
労働基準法における時間管理の基本姿勢は「1分単位の全額支給」であり、日々の集計で端数を削る運用は法令違反のリスクと隣り合わせです。実務において生の打刻データを削らず月合計で丸める運用を選択すべき理由は、主に以下の3点に集約されます。
- 未払い賃金(法令違反)リスクを確実に回避できるため
日ごとに切り捨てを行うと、1回あたりは10分前後の小さな切り捨てであっても、1か月(約20営業日)で数時間分の未払い残業代が蓄積してしまいます。日々のデータを1分単位で正確に集計・保存しておくことで、労働基準監督署からの是正勧告や賃金未払いトラブルを根本から防ぐことができます。 - 法律で唯一認められている「端数処理の例外規定」に適合するため
行政解釈(昭和63年3月14日 基発第150号)において、事務簡素化のための端数処理として認められているのは「1か月間の時間外労働などの「月合計時間」に対して、30分未満を切り捨て、30分以上を1時間に切り上げる処理」のみだからです。 - 集計の透明性と従業員の納得感が保たれるため
日々打刻した生の労働時間を削らずに保持することで、給与明細の集計根拠が明瞭になり、労働者側にとっても不信感や不満が生まれにくくなります。
CEILING関数やFLOOR関数を使うと特定の時刻だけ「数分ずれる」原因と解決策
「8:30 出勤・17:30 退勤・休憩 1:00 の実働 8:00 なのに、FLOOR 関数で15分丸めをかけるとなぜか 7:45 に化けてしまう…」という経験はありませんか?
原因:2進数によるシリアル値の演算誤差
エクセルでは時刻を「1日=1」とするシリアル値(小数)で管理しているため、内部の2進数計算で割り切れない無限小数が発生します。
実働 8:00(内部値 0.333333...)に対して直接 FLOOR関数を適用すると、内部で 7:59:59.999... と評価され、1つ下の 7:45 に落ちてしまうのです。
解決策:1440 を掛けて「分」の整数に丸めてから処理する
小数のまま FLOOR関数 に渡さず、一度 1440(1日の分数=24時間×60分)を掛け算して ROUND 関数で「分」の整数に整え、その後に FLOOR で丸めて /1440 で時刻に戻すと、演算誤差が100%発生しなくなります。
- 誤差が発生しない15分切り捨ての数式【入力セル:E2】
- 参照セル:
B2(出勤時刻)、C2(退勤時刻)、D2(休憩時間)
- 参照セル:
=FLOOR(ROUND((C2 - B2 - D2) * 1440, 0), 15) / 1440関数のポイントC2 - B2 - D2 で求めた実労働時間(シリアル値)に 1440(1日の分数=24時間×60分)を掛けて ROUND 関数で「分単位の整数」に丸めた後、FLOOR で15分切り捨てを行い、最後に 1440 で割って時刻データに戻しています。エクセル特有の小数の演算誤差(シリアル値のズレ)を完全に解消できる安全な数式です。
「計算した8時間」と「所定の8時間」が一致しない(不一致)の解決策
退勤 − 出勤 − 休憩で計算した結果がピッタリ 8:00 なのに、=TIME(8,0,0) と比較すると「不一致(FALSE)」になって判定がおかしくなるのも、上記と同じ演算誤差が原因です。
なぜ「計算した8時間」と「所定の8時間」が不一致になるのか(原因)
見た目上はどちらも「8:00」と画面表示されていても、エクセル内部では人間が見ている文字データではなく数値で時間を保持しています。この時間データの管理構造とPC特有の計算処理により、目に見えないミリ単位以下のわずかな誤差が生じることが主な原因です。
- シリアル値による小数管理
エクセルでは時刻を「1日=1」とする小数で管理しています(8時間は8÷24 ≒ 0.3333...)。 - 2進数計算の微小誤差
割り切れない時刻の引き算を行う際、コンピューター内部の計算によって15桁目付近に微小な誤差(例:0.33333333333333326)が生じます。 - 直接入力値との食い違い
セルに手入力した8:00(内部値:0.333333333333333)やTIME(8,0,0)と比較すると、見た目は同じ8:00でも内部数値がわずかに異なるため「不一致」と判定されます。
解決方法:TEXT 関数で微小誤差を切り捨てて数値(*1)に戻す
計算で出た時刻のシリアル値を一度 TEXT 関数で "h:mm" 形式の文字列に変換して微小誤差を削り、それをさらに数値に戻してから比較します。
- 演算誤差を防ぐ判定・残業計算の数式【入力セル:F2】
- 参照セル:
B2(出勤時刻)、C2(退勤時刻)、D2(休憩時間)
- 参照セル:
=IF(TEXT(C2 - B2 - D2, "h:mm")*1 > TIME(8,0,0), (TEXT(C2 - B2 - D2, "h:mm")*1 - TIME(8,0,0)), 0)関数のポイントTEXT(C2 - B2 - D2, "h:mm") で実労働時間を一時的に「時:分」の文字列に変換し、15桁目付近の小数微小誤差を削り落としています。その直後に *1 を掛けることで、エクセルが計算可能な正しい時刻シリアル値に復元し、TIME(8,0,0) と安全に比較・引き算を行っています。
※注意: TEXT 関数で変換しただけの文字列のまま TIME(8,0,0) と比較すると型の違いにより不一致になります。必ず *1 または VALUE 関数で数値(シリアル値)に戻して比較する必要があります。
1か月の残業時間を「SUM」で合計したら数字が小さく表示される時の対処法
1か月の残業時間を SUM 関数で合計した際、「41時間」の残業があるはずなのに「17:00」と小さく表示されるトラブルが頻発します。
なぜ「41時間」が「17:00」になるのか?(原因)
入力された数字や計算自体が間違っているわけではなく、エクセル側が「24時間を超えると0にリセットして、あまりの時間(24時間で割った余り)だけを表示する」という計算をしているために起こります。
エクセルでは、1日(24時間)を「1.0」という数値(シリアル値)で管理しています。
- 41時間は、日数に換算すると 「1日(24時間)+ 17時間」 です。
- 標準の表示形式(
h:mm)だと、経過した日数(1日分=24時間)を非表示にしてしまい、あまった「17時間(17:00)」だけを表示してしまうため、数字が小さくなったように見えてしまいます。
解決方法:24時間を超えても累計表示する設定に変更する
- 合計時間が表示されているセルを選択して
Ctrl + 1(または右クリック > [セルの書式設定]) - 左側の分類で [ユーザー定義] を選択
- 「種類(T)」の入力欄に
[h]:mm(時間をカッコ[ ]で囲む)と入力して [OK]
補足:計算結果を「41.0(数値)」として扱いたい場合
「41時間 × 時給」のような掛け算の計算をしたい場合は、時刻形式のままでは正しく金額が出ません(内部値が小数だからです)。
計算式を SUM(...) * 24 とし、24 を掛け算して数値化(シリアル値を一般的な十進数に変換)したうえで、セルの表示形式を [標準] または [数値] に設定してください。
「もう数式のエラーや端数ズレに悩まないために」——エクセル勤怠管理からシフト作成システムへの移行サイン
本記事でご紹介したように、エクセルの数式やエラー対策(MAX関数、ROUNDによる演算誤差の防止、[h]:mm の書式設定など)を駆使すれば、精度の高い勤怠管理や残業・深夜集計を行うことは可能です。
しかし、以下のような運用上の壁に直面したときは、エクセル管理から専用のシフト作成・勤怠管理システム(シフティーなど)への移行を検討すべきサインです。
移行サイン1. 複雑な数式の「属人化」や、ファイル破損・シート破壊のリスクに怯えているとき
本記事のような高度な数式や、複数の丸め・端数処理を組み込んだ管理表は、作成した担当者が異動や退職した途端に誰もメンテナンスできなくなる(ブラックボックス化する)リスクがあります。また、誰かが誤って数式セルを上書き削除してしまうと、シート全体の集計が狂う原因になります。
- シフト作成システムのメリット
システムであれば数式が破損する心配がなく、誰が触っても常に正確な計算ロジックが保たれます。
移行サイン2. 「15分単位の丸め」や「日別・月別の端数処理ルール」の複雑さにエクセル管理者が疲弊したとき
「日々の打刻は1分単位で保持しつつ、月合計で30分未満の切り捨てを行う」といった適法な労務ルールや、部署ごとに異なる端数処理の条件をすべてエクセルで網羅しようとすると、数式が何重にもなりいずれメンテナンスが追いつかなくなるタイミングが来ます。
- シフト作成システムのメリット
就業規則や丸めルールをあらかじめ初期設定しておくだけで、システムが自動ですべての従業員の端数処理や残業時間を正確に割り出してくれます。
移行サイン3. シフト表の作成・回収と、毎月の勤怠集計(給与連動)の二度手間に限界を感じたとき
エクセルで勤怠管理を行っている企業の多くは、シフトの希望回収や表の作成を紙やチャット、別管理のファイルで行っています。シフト表と勤怠集計表の間でデータを二重に転記・確認する作業は、従業員数が増えるほど管理者の大きな負担になります。
- シフト作成システムのメリット
シフト作成から日々の打刻収集、残業・深夜・遅刻の自動判定、そして給与ソフトへの連携までが1つのプラットフォームで完結するため、月末の集計作業を劇的に効率化できます。
エクセルの数式エラー・集計地獄から解放されたいなら「シフティー」がおすすめ
「毎月の勤怠集計やエラーチェックに膨大な時間を取られている」「複雑な数式をこれ以上増やしたくない」と感じているなら、シフト作成・勤怠管理システム「シフティー」の導入が効果的です。
シフティーなら、本記事で解説したような分単位の正確な実労働集計や各種丸め処理、早退・残業・深夜の自動判定はもちろん、シフト作成から労務管理までシステム上でスムーズに自動化できます。エクセル運用による計算ミスや管理コストでお悩みの場合は、ぜひ一度無料体験や資料請求を検討されてみてください。
まとめ:正しい関数を使って残業時間の自動計算ミスをゼロにしよう!
エクセルでの残業時間計算は、単なる引き算だけでなく「シリアル値の仕様(演算誤差・24時間オーバー)」や「労働基準法のルール」を踏まえて数式を組むことが不可欠です。
- マイナスエラー対策:
MAX(0, 実働 - TIME(8,0,0))で#####を防止 - 基本ルール: 原則は1分単位で集計し、端数処理(丸め)は「月合計」で行う
- 関数使い分け: 出勤切り上げは
CEILING関数、退勤・残業切り捨てはFLOOR関数 - 計算ズレ対策:
FLOOR(ROUND((実働)*1440, 0), 15) / 1440やTEXT関数で補正 - 24時間超え合計: セルの書式設定を
[h]:mmに変更
まずは今回ご紹介したコピペ用数式をシートに貼り付けて日々の集計作業を効率化しつつ、もし将来的に手入力ミスや複雑な数式管理の限界を感じた際には、「シフティー」のようなシフト作成システムの導入もあわせて検討してみてください。
