【VBAリファレンス|実務向け】日を跨ぐ勤怠管理の落とし穴!Excelで「マイナス時間」を防ぐスマートな計算術

スポンサーリンク

なぜ「日を跨ぐ計算」はエラーになるのか

実務で勤怠管理表を作成する際、もっとも頭を悩ませるのが「夜勤」や「深夜残業」の計算です。Excelで単純に「終了時刻-開始時刻」と計算すると、例えば「23:00から翌05:00」を計算しようとした場合、「05:00 – 23:00 = -18:00」となり、Excel上では計算結果が正しく表示されず「

」というエラー(表示しきれない状態)になってしまいます。これは、Excelが時刻を「1日=1」とする数値で管理しているため、終了時刻が開始時刻より小さい(=数値が小さい)と判定されてしまうからです。この問題を解決し、日を跨いでも正確に労働時間を算出するテクニックを解説します。

基礎知識:Excelにおける時刻の仕組み

Excelにとって「1日」は「1」という数値です。つまり、「1時間」は「1/24」となります。
日を跨いだ場合、終了時刻は開始時刻よりも数学的に小さな値になってしまいます。そこで、終了時刻が開始時刻よりも小さい(=日を跨いでいる)場合に、強制的に「1(=24時間分)」を足してあげることで、正しい経過時間を算出することが可能になります。

実装:IF関数を使った解決策

最も汎用的な解決策は、IF関数を使って「終了時刻が開始時刻より小さい場合に1を加算する」という論理式を組むことです。

・数式:=終了時刻 – 開始時刻 + IF(開始時刻 >= 終了時刻, 1, 0)

この数式は、「開始時刻が終了時刻以降である場合(日を跨いでいる)、1日分を足す」という意味になります。最後に、結果を表示するセルの表示形式を「h:mm」に変更すれば完成です。

サンプルプログラム:VBAでの自動算出

もし、大量のデータに対して自動的に時間を計算させたい場合は、VBAを使うとより実務的です。以下のコードは、選択範囲の開始時刻と終了時刻を計算し、経過時間を入力するサンプルです。

Sub CalculateWorkingHours()
‘ 選択範囲の各行に対して計算を実行します
Dim rng As Range
Dim startTime As Double
Dim endTime As Double

For Each rng In Selection.Rows
‘ A列を開始時刻、B列を終了時刻と想定
startTime = rng.Cells(1, 1).Value
endTime = rng.Cells(1, 2).Value

‘ 日を跨いでいる場合(終了時刻が開始時刻より小さい)
If startTime >= endTime Then
‘ 24時間分(1)を足して計算
rng.Cells(1, 3).Value = endTime – startTime + 1
Else
‘ 通常の引き算
rng.Cells(1, 3).Value = endTime – startTime
End If

‘ 結果を時刻形式で表示
rng.Cells(1, 3).NumberFormatLocal = “h:mm”
Next rng
End Sub

応用・注意点:24時間を超える場合の罠

今回の数式は「経過時間が24時間以内」であることを前提としています。もし、宿泊を伴う勤務などで「24時間を超える計算」が必要な場合は、時刻だけでなく「日付」を含めて入力するのが鉄則です。

日付を含めて入力(例:2023/10/01 22:00)しておけば、単純な引き算「=終了日時 – 開始日時」で済みます。この際、セルの表示形式を「[h]:mm」とすることで、24時間を超える時間(例:26:00など)も正しく表示されます。現場の要件に合わせて、数式のみで対応するか、日付まで含めて入力するかを使い分けるのが、バグを防ぐコツです。

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