doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

【Excel】時刻に「1.5時間」を足す=MOD(A2+B2/24,1)|30分が消えるTIME関数の罠

スポンサーリンク

Excelで時刻に小数の時間(1.5時間、0.25時間など)を足す最短の数式は =MOD(A2+B2/24,1) です。小数時間を24で割ってシリアル値に変換し、MODで24時超えを翌日扱いに丸めます。表示形式は h:mm にしてください。

TIME関数を使う手もありますが、TIME(B2,0,0) と書くと30分が音もなく消えます。勤怠表や作業予定表で必ずつまずくポイントを、症状別の逆引き表まで含めて順に潰していきます。

【Excel】時刻に「1.5時間」を足す=MOD(A2+B2/24,1)|30分が消えるTIME関数の罠のサンプル ▲ Date and Time サンプル

目次

  • Excelの時刻は「1日=1」のシリアル値
  • 方法1:小数の時間を24で割って足す(推奨)
  • 方法2:TIME関数で小数の時間を足す
  • TIME関数の罠1:時に小数を渡すと切り捨てられる
  • TIME関数の罠2・3:分の上限とマイナス
  • 24時間を超える合計を [h]:mm で表示する
  • 小数時間を「引く」ときはMOD一択
  • 秒の端数をなくす(ROUNDで丸める)
  • 実務例:出勤時刻+勤務時間+休憩=退勤時刻
  • 時刻を小数時間に戻す(逆変換)
  • 症状から探す逆引き表
  • まとめ

Excelの時刻は「1日=1」のシリアル値

Excelの日付・時刻はシリアル値という数値です。ルールはたった1つ、1日=1

  • 1時間 = 1/24 = 0.041666…
  • 1分 = 1/1440
  • 12:00 = 0.5

つまり「3.5時間を足す」は「3.5/24を足す」と同じ意味です。ここさえ理解すれば、あとの数式はすべて応用になります。

方法1:小数の時間を24で割って足す(推奨)

A2に開始時刻、B2に小数の時間(例:3.5)が入っているとします。

=MOD(A2+B2/24,1)

結果が「0.5」のような数値で出たら、書式が標準のままです。セルを選んで Ctrl+1 →「表示形式」タブ →「ユーザー定義」→ 種類欄に h:mm と入力してください。以降の数式もすべて同じ手順で書式を設定します。

A2(開始) B2(時間) 結果
9:00 3.5 12:30
9:00 0.25 9:15
22:00 4 2:00(翌日)

MODを付けないと何が壊れるか

問題は3行目です。22:00+4時間はシリアル値で1.0833。h:mm 表示では「2:00」と出るので、見た目には正しく見えます。

しかしこの値を別セルで使うと壊れます。たとえばC2に =MOD(A2+B2/24,1)(=2:00)ではなく =A2+B2/24(=1.0833)を入れておき、D2で =C2-A2(退勤-出勤)を計算すると、C2に含まれた「翌日ぶんの1」がそのまま残り、4時間ではなく 28時間 が返ってきます。24時間ぶんズレるわけです。

MOD(値,1) は小数部分だけを取り出すので、結果が常に0:00〜23:59に収まり、こうした事故を防げます。逆に「累計勤務時間」のように24時間超をそのまま残したい場合は、MODを外して =A2+B2/24 にし、書式を後述の [h]:mm にしてください。

方法2:TIME関数で小数の時間を足す

数式の意味を読みやすくしたいならTIME関数です。ただし罠が3つあるので、迷ったら方法1のままで構いません。

=A2+TIME(0,B2*60,0)

TIME関数は TIME(時,分,秒) の形。ポイントは、第1引数(時)ではなく第2引数(分)に入れていることです。B2×60で小数時間を分に変換してから渡します。分が60を超えても自動で繰り上がるので、TIME(0,210,0) は正しく3:30を返します。

TIME関数の罠1:時に小数を渡すと切り捨てられる

やりがちな失敗がこれです。

=A2+TIME(B2,0,0)   ← B2が3.5のとき

TIME関数は引数の小数点以下を切り捨てますTIME(3.5,0,0) は3:30ではなく 3:00。0.5時間=30分が消えます。エラーにならず静かに間違うので、勤怠表では致命的です。

同じ理由で、B2*60 が小数になるケース(例:0.13時間=7.8分)も切り捨てられます。秒に変換すれば実用上はほぼ足りますが、

=A2+TIME(0,0,B2*3600)

これでも小数秒は切り捨てです(0.1234時間=444.24秒 → 444秒)。厳密にやるなら結局、方法1の /24 にROUNDを組み合わせるのが正解になります。

TIME関数の罠2・3:分の上限とマイナス

  • 上限:TIME関数の分は32767が上限(約546時間)。超えると #NUM! です。大きな値を扱うなら /24 方式に。
  • マイナス不可:TIMEに負数を渡すと #NUM!。引き算の場面では使えません。

24時間を超える合計を [h]:mm で表示する

複数日の作業時間を積み上げると合計が24時間を超えます。このとき通常の h:mm 書式では「26:00」が「2:00」と表示されてしまいます。

Ctrl+1 →「ユーザー定義」で次を指定してください。

[h]:mm

角カッコ付きの [h] は「24で割らずに、経過時間としての時数をそのまま表示する」という意味です。分を累計したいなら [m]、秒なら [s] を使います。

小数時間を「引く」ときはMOD一択

=A2-B2/24 で引き算はできますが、結果がマイナスになるとExcelは #### を表示してエラー扱いになります。

ここでもMODが効きます。

=MOD(A2-B2/24,1)

ExcelのMODは除数の符号に合わせて結果を返すため、MOD(-0.1,1) は0.9になります。つまり「0:00の3時間前」は自動的に「21:00」として返ります。深夜勤務のシフト表で重宝する挙動です。TIME関数はマイナスを受け付けないので、引き算ではMOD方式が明確に優位です。

秒の端数をなくす(ROUNDで丸める)

小数時間は必ずしも割り切れません。9:00に0.333時間を足すと、値は 9:19:58.8 になります。h:mm 表示では「9:20」に見えるため一見問題なさそうですが、値としては端数を抱えたままです。この値どうしを足し引きすると、合計が1分ズレることがあります。浮動小数点の丸めで「8:59:59.9」のような値が生まれるのも同じ理由です。

秒単位に丸めてしまうのが確実です。

=ROUND(MOD(A2+B2/24,1)*86400,0)/86400

86400は1日の秒数。いったん秒に直して四捨五入し、また日に戻しています。5分単位に揃えたいなら =MROUND(A2+B2/24,"0:05") も使えます。

実務例:出勤時刻+勤務時間+休憩=退勤時刻

A2に出勤時刻(9:00)、B2に実働時間(7.5)、C2に休憩時間(1)を入れた場合の退勤時刻は次のとおりです。

=MOD(A2+(B2+C2)/24,1)

9:00+8.5時間で 17:30。小数時間が複数あっても、合計してから24で割るだけで済みます。夜勤で日をまたぐケース(22:00出勤・実働8・休憩1)でも、MODが効いて 7:00 と正しく返ります。

時刻を小数時間に戻す(逆変換)

足すのと逆で、時刻を小数時間に直すには24を掛けるだけです。

=A2*24

結果セルの表示形式は「標準」または「数値」に変更してください。書式が時刻のままだと、変換後の数値がまた時刻として解釈されます。3:30 は 3.5 になります。

症状から探す逆引き表

症状 原因 対処
#### になる 結果がマイナス =MOD(A2-B2/24,1)
30分だけ消える TIME(B2,0,0) で小数切り捨て TIME(0,B2*60,0) に変更
26:00 が 2:00 と出る 書式が h:mm [h]:mm に変更
結果が 0.5 など数値で出る 書式が標準のまま Ctrl+1 で h:mm に変更
#NUM! が出る TIMEに負数/分が32767超 /24 方式に変更
合計が24時間ズレる MODなしの値を差分計算に使った MOD(値,1) で丸める

まとめ

  • 基本は =MOD(A2+B2/24,1)。小数時間は24で割るだけ
  • 24時間超を残したいときはMODを外し、書式を [h]:mm
  • TIME関数は読みやすいが罠が3つ(時の小数切り捨て・32767上限・マイナス不可)。迷ったら /24
  • 引き算や深夜またぎはMOD方式一択
  • 端数が気になるなら秒に直してROUND

なお、Googleスプレッドシートもシリアル値の考え方は同じで、=MOD(A2+B2/24,1)[h]:mm 書式はそのまま使えます(書式設定は「表示形式」→「数字」→「カスタム数値形式」から)。

「1日=1」というシリアル値のルールさえ押さえておけば、時刻計算のトラブルはほぼ自力で解けるようになります。

#### の挙動は標準の1900年日付システム前提です。Mac版などで1904年日付システムを有効にしている場合は、負の時刻がそのまま表示されることがあります。


関連記事

あわせてチェック