勤怠の計算は「毎月の悩みの種」
通常の会社の業務として、給与計算は欠かせないものですが、給与計算を行う上で、勤怠計算も欠かせないものとなります。
勤怠計算については、システムで行なっている会社も多いと思いますが、Excelで勤怠計算した上で、システム上に入力している、もしくは、Excelで管理しているなど、まだまだExcelを現役で使っていることが多いと感じています。
「毎月手入力で時間計算をしていて大変」「関数では限界がある」と感じている方も少なくありません。
「VBAマクロを使って勤怠計算を自動化する」方法について、見ていきましょう。
勤怠データの基本構造と前提条件
まずは、どのような勤怠データを扱うのかを整理しておきましょう。
一般的な勤怠表の例
| 日付 | 出勤時刻 | 退勤時刻 | 休憩時間 | 勤務時間 | 備考 |
|---|---|---|---|---|---|
| 4/1 | 09:00 | 18:00 | 1:00 | 8:00 |
このように、日付ごとに出勤時刻・退勤時刻・休憩時間が記録されており、最終的には勤務時間を計算します。
勤怠マクロの目的
勤怠で必要な情報としては、下記の情報です。
- 毎日の勤務時間を自動計算
- 月間合計の勤務時間を集計
- 遅刻・早退・欠勤などを自動で分類
Excelでの時間計算の基本
Excelで時間を扱うポイント
Excelでは時刻データは「日付+時間」のシリアル値として扱われます。
このシリアル値の理解をしなくても、なんとなく計算はできてしまいますが、シリアル値を理解した方が正確に計算をすることができます。
シリアル値とは「1日24時間を”1″」として、次のように見ています。
- 1 = 1日 = 24時間
- 0.5 = 12時間
- 1時間 = 約0.041666…(1時間÷24時間)
つまり、18:00 - 09:00 は 0.375(9時間÷24時間)として扱われるのです。
勤務時間を計算する基本マクロ
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 ' 2行目から最終行まで繰り返し
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
このマクロでは、各行の出勤・退勤・休憩時間から勤務時間を自動で算出し、E列(5列目)に表示します。
基本的には最大31日になるため、For構文では2行目〜32行目の31行分を処理するようになっています。
また、それぞれの変数に入れられたものが、日付や時間になるかをIsDate関数で確認した上で、計算をしています。
遅刻や早退をチェックするマクロ
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") Then
If Cells(i, 6).Value = "遅刻" Then
Cells(i, 6).Value = Cells(i, 6).Value & "・早退"
Else
Cells(i, 6).Value = Cells(i, 6).Value & "早退"
End If
End If
Next i
End Sub
F列に遅刻の時には「遅刻」、早退の場合には「早退」、両方の場合には、「遅刻・早退」といった情報を付け加えることができます。
月間合計勤務時間を計算するマクロ
Sub Montly_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
totalTimeという変数に、E列(5列目)の値を順番に足していく、という動作をした上で、合計されたものをF33に入れるという内容です。
まとめ
時間の計算は Date 型や Double 型を活用し、エラー回避のために IsDate を併用するのが安全です。
「まず1日分から始める」「エラーが出たら原因を追ってみる」そんな一歩から進めていくと、安全に進めることができます。
