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

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

人事・勤怠管理において、従業員の勤務日を曜日ごとに集計する作業は、非常に手間がかかります。特に、シフト制勤務や変則勤務の場合、手作業での集計はミスが発生しやすく、時間も浪費します。VBAのWeekday関数を利用することで、この作業を自動化し、大幅な業務効率化を実現できます。

Weekday関数の基本

Weekday関数は、日付を表す値から曜日を数値として返す関数です。戻り値は1(日曜日)から7(土曜日)までの整数です。書式は以下の通りです。

Weekday(date, [firstdayofweek])

  • date:曜日を調べたい日付
  • firstdayofweek:週の始まりの曜日を指定(省略可能)。省略した場合、vbSunday(日曜日)が既定値

firstdayofweekには以下の定数が使用できます。

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

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

例1:勤務日の曜日を判定する

従業員の勤務日リストから、各勤務日の曜日を判定するコード例です。

Sub GetWeekday()
Dim i As Long
Dim lastRow As Long
Dim dayOfWeek As Integer

' A列の最終行を取得
lastRow = Cells(Rows.Count, "A").End(xlUp).Row

' 2行目から最終行までループ
For i = 2 To lastRow
' A列の日付から曜日を取得(月曜日を週の始まりとする)
dayOfWeek = Weekday(Cells(i, "A").Value, vbMonday)

' 曜日をB列に出力
Select Case dayOfWeek
Case 1
Cells(i, "B").Value = "月曜日"
Case 2
Cells(i, "B").Value = "火曜日"
Case 3
Cells(i, "B").Value = "水曜日"
Case 4
Cells(i, "B").Value = "木曜日"
Case 5
Cells(i, "B").Value = "金曜日"
Case 6
Cells(i, "B").Value = "土曜日"
Case 7
Cells(i, "B").Value = "日曜日"
End Select
Next i

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

このコードでは、A列に日付が入力されていることを想定し、B列に曜日を出力します。

例2:特定の曜日の勤務日数を集計する

特定の曜日の勤務日数を集計するコード例です。

Sub CountWeekdays()
Dim i As Long
Dim lastRow As Long
Dim dayOfWeek As Integer
Dim mondayCount As Integer
Dim tuesdayCount As Integer
Dim wednesdayCount As Integer
Dim thursdayCount As Integer
Dim fridayCount As Integer
Dim saturdayCount As Integer
Dim sundayCount As Integer

' 各曜日のカウントを初期化
mondayCount = 0
tuesdayCount = 0
wednesdayCount = 0
thursdayCount = 0
fridayCount = 0
saturdayCount = 0
sundayCount = 0

' A列の最終行を取得
lastRow = Cells(Rows.Count, "A").End(xlUp).Row

' 2行目から最終行までループ
For i = 2 To lastRow
' A列の日付から曜日を取得(月曜日を週の始まりとする)
dayOfWeek = Weekday(Cells(i, "A").Value, vbMonday)

' 曜日ごとにカウント
Select Case dayOfWeek
Case 1
mondayCount = mondayCount + 1
Case 2
tuesdayCount = tuesdayCount + 1
Case 3
wednesdayCount = wednesdayCount + 1
Case 4
thursdayCount = thursdayCount + 1
Case 5
fridayCount = fridayCount + 1
Case 6
saturdayCount = saturdayCount + 1
Case 7
sundayCount = sundayCount + 1
End Select
Next i

' 集計結果をメッセージボックスに表示
MsgBox "月曜日: " & mondayCount & "日" & vbCrLf & _
"火曜日: " & tuesdayCount & "日" & vbCrLf & _
"水曜日: " & wednesdayCount & "日" & vbCrLf & _
"木曜日: " & thursdayCount & "日" & vbCrLf & _
"金曜日: " & fridayCount & "日" & vbCrLf & _
"土曜日: " & saturdayCount & "日" & vbCrLf & _
"日曜日: " & sundayCount & "日"
End Sub

このコードでは、A列に日付が入力されていることを想定し、各曜日の勤務日数を集計してメッセージボックスに表示します。

例3:特定期間の平日/休日数をカウント

指定された期間における平日と休日の日数をカウントするVBAコード。

Function CountWorkingDays(startDate As Date, endDate As Date) As Variant
Dim totalDays As Long
Dim workingDays As Long
Dim holidayDays As Long
Dim i As Long
Dim currentDate As Date

' 初期化
totalDays = 0
workingDays = 0
holidayDays = 0

' 開始日から終了日までループ
currentDate = startDate
For i = 0 To DateDiff("d", startDate, endDate)
' 曜日を取得 (1:日曜日, 2:月曜日, ..., 7:土曜日)
Dim dayOfWeek As Integer
dayOfWeek = Weekday(currentDate)

' 土日を判定
If dayOfWeek = 1 Or dayOfWeek = 7 Then
' 週末の場合
holidayDays = holidayDays + 1
Else
' 平日の場合
workingDays = workingDays + 1
End If

' 総日数をカウント
totalDays = totalDays + 1

' 日付を1日進める
currentDate = DateAdd("d", 1, startDate)
startDate = currentDate
Next i

' 結果を返す (配列として平日数、休日数、総日数を返す)
CountWorkingDays = Array(workingDays, holidayDays, totalDays)
End Function

Sub SampleUsage()
Dim startDate As Date
Dim endDate As Date
Dim result As Variant

' 開始日と終了日を設定
startDate = InputBox("開始日を入力してください (YYYY/MM/DD)", "日付入力", Date)
endDate = InputBox("終了日を入力してください (YYYY/MM/DD)", "日付入力", Date)

' 祝日リスト(必要に応じて)
' 例:Dim holidays As Variant: holidays = Array("2024/01/01", "2024/01/08")

' 関数実行
result = CountWorkingDays(startDate, endDate)

' 結果を表示
MsgBox "平日数: " & result(0) & vbCrLf & _
"休日数: " & result(1) & vbCrLf & _
"総日数: " & result(2), vbInformation, "期間中の日数"
End Sub

実際の業務での応用例

  • 勤怠管理システムへの組み込み: 従業員の出勤・退勤記録から自動的に曜日を判定し、勤務時間や残業時間を集計
  • シフト作成支援: 特定の曜日や時間帯に人員を配置する必要がある場合、Weekday関数で曜日を判定し、適切な人員配置を支援
  • 給与計算: 曜日ごとに異なる時給を設定している場合、Weekday関数で曜日を判定し、正しい給与を計算

トラブルシューティング

Q:Weekday関数の戻り値が期待と異なる

A:firstdayofweek引数が正しく設定されているか確認してください。日本の企業では、月曜日を週の始まりとする場合が多いため、vbMondayを指定すると良いでしょう。

Q:日付が正しく認識されない

A:日付の形式がVBAで認識できる形式になっているか確認してください。Format関数などを使用して、日付の形式を統一すると良いでしょう。

まとめ

VBAのWeekday関数を活用することで、人事・勤怠管理における曜日判定と集計作業を自動化し、大幅な業務効率化を実現できます。手作業によるミスを減らし、正確なデータに基づいた人事・勤怠管理を行うことで、従業員の満足度向上にも繋がります。ぜひ、Weekday関数を業務に取り入れて、より効率的な人事・勤怠管理を実現してください。