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