【VBA】Weekday関数で人事・勤怠管理を効率化:日付から曜日を自動判定する方法

【VBA】Weekday関数で人事・勤怠管理を効率化:日付から曜日を自動判定する方法

人事・勤怠管理において、従業員の勤務日を正確に把握し、適切な給与計算や休暇管理を行うことは非常に重要です。手作業で曜日を確認し、集計する作業は時間と労力がかかり、ミスも発生しやすくなります。VBAのWeekday関数を使用することで、日付から曜日を自動的に判定し、これらの課題を解決できます。

Weekday関数の基本

Weekday関数は、日付を表す値を引数として受け取り、対応する曜日を表す数値を返します。この数値は、vbSunday(1)からvbSaturday(7)までの範囲で表されます。また、第2引数で週の開始曜日を指定できます。

Weekday(Date, [FirstDayOfWeek])

  • Date:日付を表すVariant型または数式
  • FirstDayOfWeek:週の開始曜日を指定する定数(省略可能)

FirstDayOfWeekに指定できる主な定数は以下の通りです。

  • vbSunday (1):日曜日(既定値)
  • vbMonday (2):月曜日
  • vbTuesday (3):火曜日
  • vbWednesday (4):水曜日
  • vbThursday (5):木曜日
  • vbFriday (6):金曜日
  • vbSaturday (7):土曜日

人事・勤怠管理でのWeekday関数の活用例

例1:勤務日の曜日を自動判定

従業員の勤務日リストから、各日付の曜日を自動的に判定し、表示します。

Sub GetWeekday()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long

Set ws = ThisWorkbook.Sheets("勤務データ") ' シート名を適切に変更
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row ' A列の最終行を取得

For i = 2 To lastRow ' 2行目から最終行までループ(1行目はヘッダーと仮定)
Dim targetDate As Date
targetDate = ws.Cells(i, 1).Value ' A列に日付データがあるとする

Dim weekdayNum As Integer
weekdayNum = Weekday(targetDate, vbMonday) ' 月曜日を週の開始とする

Dim weekdayName As String
Select Case weekdayNum
Case 1: weekdayName = "月"
Case 2: weekdayName = "火"
Case 3: weekdayName = "水"
Case 4: weekdayName = "木"
Case 5: weekdayName = "金"
Case 6: weekdayName = "土"
Case 7: weekdayName = "日"
End Select

ws.Cells(i, 2).Value = weekdayName ' B列に曜日を表示
Next i

MsgBox "曜日の判定が完了しました。"
End Sub

このコードでは、勤務データシートのA列に日付が入力されていると仮定し、B列に曜日を表示します。Weekday関数の第2引数にvbMondayを指定することで、月曜日を週の開始曜日としています。

例2:特定の曜日の勤務時間を集計

特定の曜日(例えば土曜日)の従業員の勤務時間を集計し、残業時間計算などに利用します。

Sub CalculateSaturdayWorkHours()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim totalHours As Double

Set ws = ThisWorkbook.Sheets("勤務データ") ' シート名を適切に変更
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row ' A列の最終行を取得
totalHours = 0

For i = 2 To lastRow ' 2行目から最終行までループ(1行目はヘッダーと仮定)
Dim targetDate As Date
targetDate = ws.Cells(i, 1).Value ' A列に日付データがあるとする

If Weekday(targetDate, vbMonday) = 6 Then ' 土曜日の場合
totalHours = totalHours + ws.Cells(i, 3).Value ' C列に勤務時間があるとする
End If
Next i

MsgBox "土曜日の総勤務時間は " & totalHours & " 時間です。"
End Sub

このコードでは、勤務データシートのA列に日付、C列に勤務時間が入力されていると仮定し、土曜日の総勤務時間を計算します。

例3:祝日判定を組み込む

祝日リストを参照し、祝日を除外して勤務日をカウントします。Weekday関数と組み合わせることで、より正確な勤務日数や労働時間の集計が可能です。

Function IsHoliday(targetDate As Date) As Boolean
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long

Set ws = ThisWorkbook.Sheets("祝日リスト") ' 祝日リストのシート名を指定
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row ' A列の最終行を取得

For i = 1 To lastRow
If ws.Cells(i, 1).Value = targetDate Then
IsHoliday = True
Exit Function
End If
Next i

IsHoliday = False
End Function

Sub CountWorkdays()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim workdayCount As Integer
Dim targetDate As Date

Set ws = ThisWorkbook.Sheets("勤務データ") '勤務データシートを指定
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
workdayCount = 0

For i = 2 To lastRow
targetDate = ws.Cells(i, 1).Value

'土日祝日を除外
If Weekday(targetDate, vbMonday) < 6 And Not IsHoliday(targetDate) Then
workdayCount = workdayCount + 1
End If
Next i

MsgBox "平日日数は: " & workdayCount & "日です。"
End Sub

この例では、IsHoliday関数で祝日を判定し、土日と祝日を除外して平日の日数をカウントしています。祝日リストというシートに祝日の一覧がA列に入力されていることを前提としています。

実際の業務での応用例

  • シフト作成: 従業員の希望休やスキルを考慮しながら、曜日ごとの人員配置を最適化します。
  • 給与計算: 曜日ごとの勤務時間に基づいて、時給計算や残業手当を自動化します。
  • 休暇管理: 従業員の有給休暇取得状況を管理し、特定の曜日に偏りがないかを確認します。
  • 勤怠レポート作成: 従業員の勤務状況を曜日別に集計し、レポートを作成します。

トラブルシューティング

  • 日付が正しく認識されない: セルの書式設定が日付型になっているか確認してください。
  • 曜日がずれる: Weekday関数の第2引数(週の開始曜日)が適切に設定されているか確認してください。
  • 祝日判定がうまくいかない: 祝日リストシートの形式が正しいか、日付が正しく入力されているか確認してください。

まとめ

VBAのWeekday関数を活用することで、人事・勤怠管理における曜日判定作業を大幅に効率化できます。日付データの入力ミスを減らし、正確な勤務状況の把握に貢献します。これにより、人事担当者の負担を軽減し、より戦略的な業務に集中できるようになります。