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



