Excel VBAで「時間」を扱うシーンは、勤怠管理、残業計算、集計レポート作成など、実務の現場でも非常に多くあります。
しかし、「時間=文字列のように見えるけれど、実は数値である」というExcel独特のルールを理解しないまま扱うと、思った通りに動かないこともあります。
VBAで「時間」を扱う基本的な考え方と、実務でよく使う処理方法を紹介します。
時間は「日付の一部」として扱う
まず理解しておくべきは、Excelでは時間も数値で管理されているということです。
たとえば「12:00」は「0.5」という数値で、「6:00」は「0.25」、「18:00」は「0.75」として計算されます。
この考え方をもとに、VBAでも時間の計算ができます。
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時間)
「時間」同士の引き算は、その差分が「1日を1とした小数値」で返ってきます。
注意点
Date型で時間を扱うTimeValue関数で文字列から時間に変換- 差を取ると「日数(小数)」として返ってくる
実務でよく使う処理
時間を扱う処理には、次のようなパターンがあります。
勤怠管理(遅刻・早退の判定)
Dim t As Date
t = Cells(2, 2).Value ' 出勤時刻
If t > TimeValue("09:00") Then
Cells(2, 3).Value = "遅刻"
End If
「9時より遅れていたら遅刻」といった単純な比較は、時間同士の比較で可能です。
所要時間の計算
Dim inTime As Date
Dim outTime As Date
Dim duration As Double
inTime = Cells(2, 1).Value
outTime = Cells(2, 2).Value
duration = outTime - inTime
Cells(2, 3).Value = Format(duration, "hh:mm")
出勤時間と退勤時間の差を取り、Format関数で「hh:mm」形式に整えると見やすくなります。
所要時間を時間単位に変換(小数)
Dim totalH As Double
totalH = (outTime - inTime) * 24
たとえば「9:00~18:00」なら 9 時間 → 0.375 * 24 = 9
小数点の誤差に注意する
VBAで時間を「数値(Double型)」として計算する際、ごくわずかな小数点の誤差が生じる場合があります。
たとえば次のようなコードで、期待通りの値にならないことがあります。
Dim inTime As Date
Dim outTime As Date
Dim totalH As Double
inTime = TimeValue("09:00")
outTime = TimeValue("18:00")
totalH = (outTime - inTime) * 24
If totalH = 9 Then
MsgBox "9時間ぴったりです"
End If
このコードでは totalH は「9」になるはずですが、内部的に 8.99999999999999… のような数値になることがあり、条件に一致しないことがあります。
回避する方法
誤差に左右されずに処理したい場合は、次のように Round 関数や Int 関数を活用しましょう。
If Round(totalH, 2) = 9 Then
MsgBox "9時間ぴったりです"
End If
または、範囲で比較することも有効です。
If totalH > 8.99 And totalH < 9.01 Then
MsgBox "9時間付近です"
End If
ポイント
- Excelの「時間」は小数なので、計算時に微細な誤差が出ることがある
=や<>を使う場合は、そのまま比較せず、誤差を見越した処理が必要Roundを使って丸める、または範囲で条件を組むと実用的
時間を扱うメリットと考え方
VBAで時間をしっかり扱えるようになると、手動の確認や集計作業が自動化できるようになります。
特に以下のような業務では大きな効果を発揮します。
- 勤怠データの集計や判定
- 所要時間の計算と一覧表化
- 作業時間ごとの分類(3時間未満/8時間以上など)
Excelの時間は「見た目は文字列、でも中身は数値」という特徴を持っているため、見た目に惑わされず、常に数値として扱う意識を持つことが重要です。
まとめ
VBAで時間を扱うには、Excelにおける「時間=1日の小数値」という概念をしっかり理解しておくことが基本です。
TimeValue関数やFormat関数を活用しながら、文字列や数値としての時間を自在に扱えるようになることで、業務の自動化がよりスムーズになります。
- 時間は「日付の小数値」として管理されている
- 差分は「時間数 ÷ 24」として扱われる
TimeValueやFormatを活用して整形・比較が可能- 勤怠、所要時間、時間単位の集計などで非常に役立つ
- 微小な誤差を考慮し、条件判定では丸め処理や範囲比較を活用する
まずは「9時より遅れたら遅刻」のような簡単な判定から始めて、徐々に実務に応用していきましょう。
