VBAで勤怠・給与計算を自動化する方法|勤務時間の計算と遅刻・早退チェックのマクロ

VBAで勤怠計算を自動化するには、出勤時刻・退勤時刻・休憩時間から勤務時間を計算するマクロを作ります。Excelの時刻は「1日=1」として数値で管理されているので、引き算して24をかけると時間数に変換できます。遅刻・早退のチェックや月間合計の集計もマクロで自動化できます。

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

  • Excelの時刻データの考え方(シリアル値)
  • 勤務時間を自動計算するマクロ
  • 遅刻・早退を自動でチェックするマクロ
  • 月間合計勤務時間を集計するマクロ

Excelの時刻データはどう扱われている?

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

  • 1 = 24時間
  • 0.5 = 12時間
  • 1時間 = 約0.0417(1÷24)

つまり 18:00 - 09:000.375(9時間÷24時間)として計算されます。これに24をかけると「9(時間)」になります。VBAで時間を計算するときはこの考え方が基本になります。

勤務時間を自動計算するマクロ

次のような勤怠表を前提にしています。

A列B列C列D列E列
日付出勤時刻退勤時刻休憩時間勤務時間
4/109:0018:001: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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

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

コメントする

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

上部へスクロール