VBAで勤怠計算を自動化するには、出勤時刻・退勤時刻・休憩時間から勤務時間を計算するマクロを作ります。Excelの時刻は「1日=1」として数値で管理されているので、引き算して24をかけると時間数に変換できます。遅刻・早退のチェックや月間合計の集計もマクロで自動化できます。
この記事では、次の内容を順番に解説します。
- Excelの時刻データの考え方(シリアル値)
- 勤務時間を自動計算するマクロ
- 遅刻・早退を自動でチェックするマクロ
- 月間合計勤務時間を集計するマクロ
Excelの時刻データはどう扱われている?
Excelでは時刻を「1日=1」という数値(シリアル値)で管理しています。
- 1 = 24時間
- 0.5 = 12時間
- 1時間 = 約0.0417(1÷24)
つまり 18:00 - 09:00 は 0.375(9時間÷24時間)として計算されます。これに24をかけると「9(時間)」になります。VBAで時間を計算するときはこの考え方が基本になります。
勤務時間を自動計算するマクロ
次のような勤怠表を前提にしています。
| A列 | B列 | C列 | D列 | E列 |
|---|---|---|---|---|
| 日付 | 出勤時刻 | 退勤時刻 | 休憩時間 | 勤務時間 |
| 4/1 | 09:00 | 18:00 | 1:00 | (自動計算) |
Sub Work_hour()
Dim i As Long
Dim startTime As Date
Dim endTime As Date
Dim restTime As Date
Dim workTime As Double
For i = 2 To 32
startTime = Cells(i, 2).Value ' 出勤時刻
endTime = Cells(i, 3).Value ' 退勤時刻
restTime = Cells(i, 4).Value ' 休憩時間
' 時刻が入っているかを確認してから計算する
If IsDate(startTime) And IsDate(endTime) And IsDate(restTime) Then
workTime = (endTime - startTime - restTime) * 24 ' 時間数に変換
Cells(i, 5).Value = Format(workTime, "0.00")
End If
Next i
End Sub
コードの流れ
- 2行目から32行目(最大31日分)を1行ずつ確認します。
IsDateで出勤・退勤・休憩のセルに時刻が入っているかを確認します。空白やエラーのある行はスキップされます。- 退勤時刻から出勤時刻と休憩時間を引き、24をかけて時間数に変換します。
- 結果をE列に表示します。
遅刻・早退を自動でチェックするマクロ
出勤・退勤時刻をもとに、遅刻・早退を自動でF列に書き込みます。
Sub late_early()
Dim i As Long
For i = 2 To 32
' 出勤が9:00より後なら遅刻
If Cells(i, 2).Value > TimeValue("09:00") Then
Cells(i, 6).Value = "遅刻"
End If
' 退勤が18:00より前なら早退
If Cells(i, 3).Value < TimeValue("18:00") And Cells(i, 3).Value <> 0 Then
If Cells(i, 6).Value = "遅刻" Then
Cells(i, 6).Value = "遅刻・早退"
Else
Cells(i, 6).Value = "早退"
End If
End If
Next i
End Sub
遅刻と早退が両方ある日は「遅刻・早退」と表示されます。定時(09:00・18:00)は自分の会社に合わせて変更してください。
月間合計勤務時間を集計するマクロ
E列に入った1日ごとの勤務時間を合計して、33行目に表示します。
Sub Monthly_total()
Dim totalTime As Double
Dim i As Long
For i = 2 To 32
totalTime = totalTime + Cells(i, 5).Value
Next i
Cells(33, 5).Value = "合計"
Cells(33, 6).Value = Format(totalTime, "0.00") & " 時間"
End Sub
E列の値を順番に足していって、33行目に合計時間を表示します。
まとめ
Excelの時刻データを理解してVBAで計算することで、勤怠の集計作業を自動化できます。
- 時刻の計算:退勤 − 出勤 − 休憩の結果に24をかけると時間数になる。
- 勤務時間の自動計算:
IsDateでデータの有無を確認してから計算する。 - 遅刻・早退チェック:
TimeValueで定時と比較する。 - 月間合計:E列を全行分足し合わせて33行目に表示する。
よくある質問
勤務時間がマイナスになる場合は?
退勤時刻が出勤時刻より前になっている(入力ミス)か、日をまたいだ勤務(例:22:00〜翌6:00)の場合に起こります。日またぎの場合は退勤時刻に1を足す(1日分のシリアル値)ことで対応できます。
時刻ではなく小数点(例:9.5時間)で入力されている場合は?
その場合は Date 型ではなく Double 型で受け取り、そのまま引き算すればOKです。IsDate のチェックも不要になります。
定時を社員ごとに変えたい場合は?
定時をデータシートの別の列(例:G列・H列)に入れておいて、TimeValue("09:00") の代わりに Cells(i, 7).Value のように参照する形にすると、社員ごとに異なる定時に対応できます。
有給や休日を除いて集計したい場合は?
備考列(例:F列)に「有給」「休日」などを入れておいて、ループの中で If Cells(i, 6).Value = "" Then のように空白の行だけ集計するようにします。
結果をhh:mm形式で表示したい場合は?
勤務時間を時間数(Double型)ではなく時刻のシリアル値のまま保持して、Format(workTime / 24, "h:mm") のように表示すると「8:00」のような形式で表示できます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



