【Excel関数】TIMEVALUEが24時間以上で誤る原因と対処

【Excel関数】TIMEVALUEが24時間以上で誤る原因と対処のアイキャッチ Excel関数

勤怠データの月間労働時間が「171:00」のような文字列で出力されていて、計算に使える数値に変えたい。そんなときにTIMEVALUE関数を使うと、エラーにならないまま誤った値が返ってきます。

この記事では、TIMEVALUEが24時間以上の値で誤る原因と、累計時間を正しく変換する方法を紹介します。数値はすべて、実際にExcelで確かめた結果です。

こんな方に向けた記事です

  • 勤怠データなど、時間が「hh:mm」の文字列で出力される資料を扱う方
  • 月間・年間の累計時間を、関数で数値に変換したい方
  • TIMEVALUEで変換したのに、合計が合わなくて困っている方

TIMEVALUEに24時間以上の値を渡すとどうなるか

TIMEVALUEは、時刻を表す文字列をシリアル値(1日を1とする数値)に変換する関数です。1日以内の時刻なら、問題なく変換できます。

=TIMEVALUE("08:30")   → 0.354166667

ところが、24時間を超える値を渡すと結果が変わります。次の表は、同じ文字列を3通りの方法で変換した結果です。

Excelで「171:00」などの文字列をTIMEVALUE関数・VALUE関数・LEFTとMIDの組み合わせで変換した結果。TIMEVALUEだけが24時間を超えた分を捨てており、171:00が0.125になっている
実測結果。E列は、VALUEの結果を[h]:mm形式で表示したもの
元の文字列TIMEVALUEVALUE本来の値(時間)
08:300.3541666670.3541666678.5
25:000.0416666671.04166666725
171:000.1257.125171
2000:300.35416666783.354166672000.5

「171:00」は、本来なら171時間(シリアル値では7.125)です。しかしTIMEVALUEは0.125、つまり3時間分しか返しません。「2000:30」も、返ってくるのは8時間30分分の値です。

#VALUE!などのエラーは出ません。値が小さいだけなので、月末の集計が合わなくなるまで気づけないのが厄介な点です。

TIMEVALUEが24時間以上で誤る原因

TIMEVALUEは「時刻」を扱う関数で、「経過時間」を扱う関数ではありません。Microsoftの公式説明でも、戻り値は0〜0.99988426(0:00:00〜23:59:59)の範囲とされています。

この範囲を超える値を渡すと、24時間分が捨てられ、1日未満の端数だけが返ります。実測でも、次のとおり24で割った余りになっていました。

  • 「24:00」→ 0
  • 「25:00」→ 1時間分
  • 「171:00」→ 3時間分(171 ÷ 24 の余り)
  • 「2000:30」→ 8時間30分分(2000 ÷ 24 の余りが8)

累計時間は経過時間なので、時刻用のTIMEVALUEとは用途が合いません。

対処法1:VALUE関数で変換する

いちばん簡単なのは、TIMEVALUEをVALUEに置き換える方法です。

=VALUE(A2)

先ほどの表のとおり、「171:00」は7.125、「2000:30」は83.35416667と、正しい値になります。秒が付いた文字列にも対応でき、「171:00:30」は7.12534722…になりました。

対処法2:LEFTとMIDで時間と分に分ける

「:」の前後で時間と分を取り出し、自分で換算する方法もあります。

=VALUE(LEFT(A2,FIND(":",A2)-1))/24 + VALUE(MID(A2,FIND(":",A2)+1,2))/1440
  • LEFTで「:」より前(時間)を取り出し、24で割る(1日=1に換算)
  • MIDで「:」より後ろ2文字(分)を取り出し、1440(24×60)で割る

結果はVALUEと同じです。違いは秒の扱いで、この式は時間と分だけを見るため、「171:00:30」でも7.125になります(秒は無視されます)。秒を切り捨てたいときは、こちらが向いています。

分の取り出しを2文字で固定しているので、「hh:mm」形式の文字列が前提です。

変換した累計時間を表示・計算に使う

変換後の値はシリアル値なので、そのままでは「7.125」のように表示されます。セルの表示形式を[h]:mmにすると、「171:00」の形で表示できます。実測では、25:00は「25:00」、2000:30は「2000:30」と表示されました(画像のE列)。

変換後の値は数値なので、合計や時間数への換算にも使えます。

=SUM(C2:C5)     ← 変換後の値の合計(表示形式は[h]:mm)
=C4*24          ← 時間数に換算(7.125 → 171)

時刻や日付がシリアル値という数字で保存されている仕組みは、日付が数字になる仕組みとVBA・PQでの扱いで整理しています。

よくある失敗

  • TIMEVALUEに数値を渡している:セルにすでに数値(0.5など)が入っている場合、TIMEVALUEは#VALUE!になります。TIMEVALUEは文字列を渡す関数です。
  • 秒付きのデータにLEFT+MIDを使う:秒が無視されます。秒まで必要なら、VALUEを使います。
  • 表示形式が「標準」のまま:値は合っていても「7.125」と表示され、誤りに見えます。表示形式を[h]:mmに変えます。

#VALUE! が出たときに最初に確認する場所は、【Excel関数】#N/A・#VALUE!・#REF!が出たら最初に確認にまとめています。

使い分けの目安

  • 1日以内で完結する値(日次の労働時間など):TIMEVALUEでも問題ありません。
  • 月間・年間の累計値:TIMEVALUEは使わず、VALUEで変換します。

この境界線を意識しておくと、集計結果が合わないときの原因を切り分けやすくなります。

24時間以内の時刻を15分単位などに丸める場合の注意点は、【Excel関数】時間の丸めは順序で結果が変わる理由と対処にまとめています。

まとめ

  • TIMEVALUEは「時刻」用で、24時間以上を渡すと24で割った余りが返る
  • エラーにならないため、誤りに気づきにくい
  • 累計時間はVALUEで変換する。秒を無視したいときはLEFTとMIDを使う
  • 表示は[h]:mmにする

コメント

タイトルとURLをコピーしました