【VBAリファレンス】Excel VBAで習得する月間所定労働時間計算の自動化手法と実務への応用

スポンサーリンク

概要

Excel VBAを活用した業務効率化において、日付データと勤務時間の管理は避けては通れない壁です。特に「月間の所定労働時間」を正確に算出するロジックは、給与計算や労務管理の基幹システムを構築する上で極めて重要な要素となります。本記事では、単なる日付の引き算ではなく、土日祝日や会社固有の休日設定を考慮した、プロフェッショナルレベルの所定労働時間算出プログラムの構築方法を解説します。VBAを用いて動的にカレンダーを生成し、月ごとの労働時間を自動算定するロジックを身につけることで、事務作業の生産性を劇的に向上させることが可能です。

詳細解説

Excelで月間所定労働時間を算出する際、多くの初心者は単純に「1日8時間×営業日数」という計算式をセルに記述します。しかし、実務では「祝日の判定」「半休の扱い」「有給休暇との兼ね合い」など、複雑なロジックが必要となります。VBAを用いる最大の利点は、これら複雑な条件分岐を一つのプロシージャ内に集約し、再利用可能な関数として切り出せる点にあります。

まず、所定労働時間を計算するためのロジックは以下のステップで構成されます。

1. 対象年月の取得:入力された年と月から、その月が何日まであるか、また各日が何曜日かを判定する。
2. 休日マスターの照合:カレンダーテーブルや祝日リストを参照し、出勤日か休日かを判定するフラグを立てる。
3. 労働時間の加算:出勤日と判定された日付に対して、設定されている所定時間を加算する。

この際、Excelの「WorksheetFunction」を活用して「NETWORKDAYS.INTL」関数をVBAから呼び出す手法もありますが、より細かなカスタマイズ(例:午前休、午後休の控除など)を行うためには、日付をループ処理で走査するアルゴリズムを構築するのが最適です。

サンプルコード

以下に、指定した年月の所定労働時間を、土日を除外して算出するVBAコードを提示します。このコードは、柔軟性を考慮し、1日の所定時間も引数として与えられる設計にしています。


Option Explicit

' 月間所定労働時間を算出する関数
' @param targetYear 年
' @param targetMonth 月
' @param dailyHours 1日の所定労働時間(デフォルト8時間)
' @return 月間所定労働時間(時間)
Function CalculateMonthlyWorkingHours(targetYear As Integer, targetMonth As Integer, Optional dailyHours As Double = 8) As Double
    Dim d As Date
    Dim lastDay As Integer
    Dim totalHours As Double
    Dim i As Integer
    
    ' その月の末日を取得
    lastDay = Day(DateSerial(targetYear, targetMonth + 1, 0))
    
    totalHours = 0
    
    ' 1日から末日までループ
    For i = 1 To lastDay
        d = DateSerial(targetYear, targetMonth, i)
        
        ' 土曜日(7)と日曜日(1)を除外(Weekday関数の戻り値)
        If Weekday(d) <> vbSunday And Weekday(d) <> vbSaturday Then
            ' ここに祝日判定や特定休日判定のロジックを追加可能
            totalHours = totalHours + dailyHours
        End If
    Next i
    
    CalculateMonthlyWorkingHours = totalHours
End Function

' 実行用サブプロシージャ
Sub RunMonthlyCalculation()
    Dim result As Double
    Dim y As Integer, m As Integer
    
    y = 2023
    m = 10
    
    result = CalculateMonthlyWorkingHours(y, m)
    
    MsgBox y & "年" & m & "月の所定労働時間は " & result & " 時間です。", vbInformation
End Sub

このコードをベースに、さらに「祝日リスト」を別シートから読み込んで判定する機能を付与することで、実務レベルの堅牢なツールへと進化させることができます。

実務アドバイス

VBAで労働時間を計算する際に最も注意すべきは「浮動小数点演算の誤差」です。Excelの時刻データは内部的に1日を「1」とするシリアル値で管理されています。例えば、15分を「0.25」時間として計算する場合、微細な誤差が積み重なり、合計値が本来の数値と一致しないケースが発生します。

これを防ぐための実務上のテクニックとして、「計算結果を一度分単位の整数に変換する」ことを推奨します。例えば、1日の所定時間が8時間であれば「480分」として計算し、最後に60で割ることで、小数の切り捨てによる誤差を完全に排除できます。

また、保守性を高めるために、休日リストはハードコーディングせず、必ずExcelのシート上で管理してください。VBAコード内に休日を記述してしまうと、翌年になった際にコードの改修が必要となり、属人化の原因となります。シート上のテーブルを`ListObjects`として読み込む設計にすれば、担当者がExcel上で祝日を追加するだけで、プログラム側は自動的に追従するようになります。

まとめ

月間所定労働時間の計算は、一見単純な算数のように思えますが、企業ごとの細かなルールを考慮すると、Excel関数の組み合わせだけでは限界があります。VBAを活用し、日付を「オブジェクト」としてループ処理で判定するロジックを構築することで、人的ミスを排除し、計算根拠が明確なシステムを構築することが可能になります。

今回紹介したコードはあくまで基礎ですが、ここから「祝日シートの連携」「半休の考慮」「個人ごとの勤務パターンの適用」といった機能を肉付けしていくことで、貴社の労務管理を支える強力なツールに成長させることができます。Excel VBAは単なる自動化ツールではありません。論理的思考に基づいた「業務の自動化基盤」です。ぜひ、このコードをベースに、ご自身の環境に最適な計算ロジックを組み上げてみてください。継続的な改善こそが、ベテランへの第一歩です。

タイトルとURLをコピーしました