wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA Weekdayで土日祝日を正確に判定!労務の勤怠管理・休日手当計算を自動化する実務テクニック

VBA Weekdayで土日祝日を正確に判定!労務の勤怠管理・休日手当計算を自動化する実務テクニック

毎月の勤怠管理、稼働日ベースの納期計算、そして複雑な休日出勤手当の自動計算…労務担当者として、日付の判定、特に土日祝日の正確な把握は常に頭を悩ませる課題ではないでしょうか?手作業での確認はミスを招きやすく、時間もかかります。しかし、VBAのWeekday関数をマスターすれば、これらの手間のかかる作業を劇的に効率化し、ミスなく自動化することが可能です! この記事では、VBAエキスパートがWeekday関数を使った土日祝日判定の基本から、実務で役立つ具体的なコード、そして誰もがハマりがちな「落とし穴」とその回避策まで、労務担当者の方々が今日から使える実践的なノウハウを徹底解説します。

コピペで即解決!土日祝日を判定するVBA実務コード

まずは、指定された日付が「稼働日」「休日(土日)」「休日(祝日)」のいずれであるかを判定するVBA関数をご覧ください。このコードをExcel VBAの標準モジュールに貼り付けるだけで、すぐに利用開始できます。


Function GetDayType(TargetDate As Date) As String
    Dim dayOfWeek As VbDayOfWeek
    Dim isPublicHoliday As Boolean
    Dim publicHolidayList As Variant ' 祝日リスト

    ' --- Weekday関数の落とし穴回避策:第2引数で週の始まりをvbMondayに設定 ---
    ' これにより、月曜日=1, 火曜日=2, ... 土曜日=6, 日曜日=7 となり、
    ' 一般的な感覚やExcelのWEEKDAY関数(種類2)と設定が一致し、混乱を避けられます。
    dayOfWeek = Weekday(TargetDate, vbMonday)

    ' 土日判定
    If dayOfWeek = vbSaturday Or dayOfWeek = vbSunday Then ' vbSaturdayは6, vbSundayは7 (vbMonday設定時)
        GetDayType = "休日 (土日)"
        Exit Function
    End If

    ' 祝日判定(簡易版)
    ' 【重要】実際の運用では、この祝日リストを動的に管理(例: Excelシートから読み込む、内閣府の祝日APIを利用するなど)
    '         することをお勧めします。ここではデモンストレーションとして2026年の祝日の一部を記載します。
    publicHolidayList = Array( _
        #2026/1/1#, #2026/1/12#, #2026/2/11#, #2026/2/23#, #2026/3/20#, _
        #2026/4/29#, #2026/5/3#, #2026/5/4#, #2026/5/5#, #2026/5/6#, _
        #2026/7/20#, #2026/9/15#, #2026/9/23#, #2026/10/13#, #2026/11/3#, _
        #2026/11/23#, #2026/12/23# _
    )

    For Each holDate In publicHolidayList
        ' 日付部分のみを比較するため、Format関数で整形
        If Format(TargetDate, "yyyy/mm/dd") = Format(holDate, "yyyy/mm/dd") Then
            isPublicHoliday = True
            Exit For
        End If
    Next holDate

    If isPublicHoliday Then
        GetDayType = "休日 (祝日)"
    Else
        GetDayType = "稼働日"
    End If

End Function

' --- 動作確認用のテストコード ---
Sub TestGetDayType()
    Debug.Print "--- 日付判定テスト ---"
    Debug.Print "2026/05/04 (月): " & GetDayType(#2026/05/04#)  ' 稼働日
    Debug.Print "2026/05/05 (火・祝): " & GetDayType(#2026/05/05#) ' 休日 (祝日) - 例の入力日付
    Debug.Print "2026/05/06 (水・振替): " & GetDayType(#2026/05/06#) ' 休日 (祝日)
    Debug.Print "2026/05/09 (土): " & GetDayType(#2026/05/09#)  ' 休日 (土日)
    Debug.Print "2026/05/10 (日): " & GetDayType(#2026/05/10#)  ' 休日 (土日)
    Debug.Print "2026/05/11 (月): " & GetDayType(#2026/05/11#)  ' 稼働日
    Debug.Print "--------------------"
End Sub

重要解説:Weekday関数の「落とし穴」とその回避策

Weekday関数は非常に便利ですが、実務で使う上で見落とされがちな重要なポイントがあります。それは第2引数(週の始まり)の設定です。

🚨 要注意!Weekday関数の「落とし穴」 🚨

VBAのWeekday関数は、第2引数を省略すると日曜が1として扱われます(vbSundayがデフォルト)。しかし、これは日本の一般的な感覚(月曜始まり)や、ExcelのWEEKDAY関数でよく使われる「種類2」(月曜が1)とは異なります。

このズレを意識せずにコードを組むと、「月曜日が土曜日と判定されてしまう」といった思わぬバグや、Excelシート上のデータとの不一致が発生し、勤怠計算や納期管理で大きなトラブルに繋がる可能性があります。

上記のコードでは、この落とし穴を回避するために、Weekday(TargetDate, vbMonday)のように第2引数にvbMondayを明示的に指定しています。

  • vbMondayを指定した場合: 月曜日が1、火曜日が2、…土曜日が6、日曜日が7となります。
  • 省略(デフォルト)の場合: 日曜日が1、月曜日が2、…土曜日が7となります。

vbMondayを指定することで、日本のビジネス慣習やExcel関数との互換性が高まり、コードの可読性と保守性も向上します。常に第2引数を明示的に指定する習慣をつけましょう。

まとめ:VBA Weekdayで労務業務を次のレベルへ

VBAのWeekday関数と祝日判定ロジックを組み合わせることで、日付のタイプ(稼働日、土日、祝日)を正確に判定し、労務業務における多くの手作業を自動化できます。特に、Weekday関数の第2引数vbMondayの重要性を理解し、実践することで、予期せぬエラーを回避し、信頼性の高いシステムを構築することが可能です。

今回ご紹介したコードは、あくまで基本形です。このロジックを応用すれば、給与計算システムの休日手当判定、プロジェクトの稼働日ベースの進捗管理、人員配置の最適化など、労務に関するあらゆる課題解決の強力な武器となるでしょう。ぜひこの技術を習得し、日々の業務効率化にお役立てください。

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら