VBAで時間を計算する方法|シリアル値の仕組みと遅刻判定・所要時間の求め方

VBAで時間を扱うとき、Excelでは「1日=1」という数値(シリアル値)で時間を管理しています。たとえば「12:00」は「0.5」、「9時間」は「0.375」として計算されます。この仕組みを理解しておくと、勤怠計算や所要時間の集計が正確に書けるようになります。

この記事では、次の内容を順番に解説します。

  • Excelの時間がどのような数値で管理されているか
  • 時間の差分を計算する方法
  • 遅刻・早退の判定や所要時間の表示方法
  • 小数点の誤差への対処法

Excelの時間はどのような数値で管理されている?

Excelでは時間を「1日=1」という小数値(シリアル値)で管理しています。

  • 6:00 = 0.25(6時間 ÷ 24時間)
  • 12:00 = 0.5(12時間 ÷ 24時間)
  • 18:00 = 0.75(18時間 ÷ 24時間)

見た目は「9:00」のような文字列に見えますが、内部では数値として管理されています。この性質を利用して引き算をすると、時間の差を計算できます。

Dim t1 As Date
Dim t2 As Date
Dim diff As Double

t1 = TimeValue("09:00")
t2 = TimeValue("18:00")
diff = t2 - t1

MsgBox diff  ' 結果:0.375(= 9時間 ÷ 24時間)

TimeValue は「09:00」のような文字列を時刻データに変換する関数です。

時間の差を時間数(〇時間)に変換するには?

引き算の結果は「日数の小数値」なので、24をかけると時間数に変換できます。

Dim inTime As Date
Dim outTime As Date
Dim totalH As Double

inTime = Cells(2, 1).Value   ' 出勤時刻
outTime = Cells(2, 2).Value  ' 退勤時刻

totalH = (outTime - inTime) * 24  ' 時間数に変換

MsgBox totalH  ' 例:9(時間)

「9:00〜18:00」の場合、0.375 × 24 = 9 となり、9時間と表示されます。

遅刻・早退を判定するには?

時刻同士を比較するだけで遅刻・早退の判定ができます。

Dim t As Date
t = Cells(2, 2).Value  ' 出勤時刻

If t > TimeValue("09:00") Then
    Cells(2, 3).Value = "遅刻"
End If

所要時間をhh:mm形式で表示するには?

引き算の結果をそのまま Format 関数に渡すと「hh:mm」形式で表示できます。

Dim inTime As Date
Dim outTime As Date

inTime = Cells(2, 1).Value
outTime = Cells(2, 2).Value

Cells(2, 3).Value = Format(outTime - inTime, "hh:mm")

「9:00〜18:00」なら「09:00」と表示されます。

小数点の誤差に注意が必要な場合は?

時間を数値として計算すると、ごくわずかな誤差が生じることがあります。たとえば「9時間ぴったりのはず」なのに内部では「8.99999…」になってしまい、条件が一致しないことがあります。

' 誤差が出ることがある書き方
If totalH = 9 Then ...

' Roundで丸めてから比較する(おすすめ)
If Round(totalH, 2) = 9 Then
    MsgBox "9時間ぴったりです"
End If

時間の比較をするときは Round で小数第2位程度に丸めてから比較するのがおすすめです。

誤差を完全になくすには?

誤差を完全になくしたい場合は、時間を「分」の整数に変換してから計算する方法が確実です。整数同士の計算になるので誤差がゼロになります。

' 時間を「分」に変換してから計算する
Dim inMin As Long
Dim outMin As Long
Dim totalMin As Long

inMin = Hour(inTime) * 60 + Minute(inTime)
outMin = Hour(outTime) * 60 + Minute(outTime)
totalMin = outMin - inMin  ' 分単位の整数で計算

MsgBox totalMin & "分"  ' 例:540分(9時間)

分単位で持っておいて、表示するときだけ「時間:分」に変換します。

' 分を「〇時間〇分」に変換して表示する
MsgBox totalMin \ 60 & "時間" & totalMin Mod 60 & "分"
' 例:9時間0分

\(バックスラッシュ)は「整数の割り算(小数を切り捨てた商)」を求める演算子です。通常の /(スラッシュ)との違いは、9 / 2 = 4.5 に対して 9 \ 2 = 4 になる点です。Mod は割り算の余りを求める演算子です。

まとめ

Excelの時間は「1日=1」の小数値で管理されていることを理解しておくと、VBAでの時間計算がスムーズになります。

  • 時間の取得TimeValue("09:00") で文字列を時刻データに変換する。
  • 差の計算:引き算して24をかけると時間数になる。
  • 表示形式Format(差分, "hh:mm") でhh:mm形式に変換できる。
  • 比較するときRound で丸めてから比較すると誤差を防げる。
  • 誤差を完全になくすHour() * 60 + Minute() で分の整数に変換してから計算する。

よくある質問

TimeValueとはどんな関数?

TimeValue("09:00") は「09:00」という文字列をExcelが扱える時刻データに変換する関数です。セルに入力された時刻はすでに時刻データになっているので、セルから読み込む場合は TimeValue は不要です。文字列を時刻として計算したい場合に使います。

日をまたいだ時間(例:22:00〜翌2:00)はどう計算する?

退勤時刻が出勤時刻より小さくなるため、そのまま引き算するとマイナスになります。この場合は退勤時刻に1を足します。例:(outTime + 1) - inTime とすると正しい時間差が計算できます。

合計時間が24時間を超える場合の表示は?

Format(diff, "hh:mm") では24時間を超えると「00:00」に戻ってしまいます。合計が24時間を超える場合は、totalH = diff * 24 で時間数に変換して数値として表示する方法が確実です。

時間を比較するとき「以上・以下」はどう書く?

時刻同士の比較は通常の不等号でできます。例:If t >= TimeValue("09:00") And t <= TimeValue("18:00") Then で「9時以上18時以下」の条件を書けます。

現在の時刻を取得するには?

Time 関数で現在の時刻を取得できます。Now は日付と時刻の両方を返し、Time は時刻だけを返します。現在時刻と比較したい場合は If Cells(i,1).Value > Time Then のように使います。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール