wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA DateDiff 関数を極める!人事担当者向け 勤続年数と月数を正確に計算する方法

VBA DateDiff 関数を極める!人事担当者向け 勤続年数と月数を正確に計算する方法

人事担当者の皆様、退職金計算や有給付与日数の管理で「勤続期間」の正確な計算に頭を悩ませていませんか?たった1日のズレが、計算結果に大きな影響を及ぼすこともあるため、Excel VBAでの厳密な期間計算は必須のスキルです。

本記事では、VBAのDateDiff関数を使って、勤続年数と月数を誰でも正確に算出できる実用的なコードをご紹介します。特に、見落としがちなDateDiff関数の「落とし穴」と、それを回避して厳密な期間を計算するテクニックを詳しく解説します。もう計算ミスに怯える必要はありません!

コピペで即解決!正確な勤続年数・月数計算VBAコード

まずは、退職金計算や有給付与の基準となる「勤続年数」と「勤続月数」を正確に算出するためのVBAコードをご覧ください。指定された開始日から計算対象日までの期間を「満〇年〇ヶ月」の形式で表示します。

Sub CalculatePreciseServiceDuration()
    ' -----------------------------------------------------------------------
    ' 目的: 勤続開始日から計算対象日までの期間を「厳密」に計算し表示する
    ' 対象: 人事担当者(退職金計算、有給付与日数計算など)
    ' 注意: DateDiff関数の「yyyy」や「m」指定の特性を考慮し、正確な期間を算出
    ' -----------------------------------------------------------------------
    
    Dim startDate As Date     ' 勤続開始日 (例: 入社日)
    Dim endDate As Date       ' 計算対象日 (例: 退職日、有給付与基準日、今日)
    Dim years As Long         ' 勤続年数
    Dim months As Long        ' 残りの勤続月数
    Dim tempDate As Date      ' 中間計算用日付変数

    ' --- ① 計算対象となる日付を設定します ---
    ' 人事システムのデータなど、実際の日付に置き換えてください
    startDate = #2000/04/01# ' 例: 入社日
    endDate = Date           ' 例: 今日の日付 (または #2023/12/31# のように特定日を指定)

    Debug.Print "--- 勤続期間 厳密計算 ---"
    Debug.Print "勤続開始日: " & Format(startDate, "yyyy/mm/dd")
    Debug.Print "計算対象日: " & Format(endDate, "yyyy/mm/dd")

    ' --- ② 勤続年数を計算します ---
    ' まずはDateDiff("yyyy")で概算の年数を取得
    years = DateDiff("yyyy", startDate, endDate)
    
    ' DateDiff("yyyy")は年が変わった回数を数えるため、
    ' 誕生日が来ていない場合(例: 2020/4/1 → 2021/3/31 は1年と数えられる)は調整が必要
    tempDate = DateAdd("yyyy", years, startDate)
    If tempDate > endDate Then
        years = years - 1
    End If

    ' --- ③ 残りの勤続月数を計算します ---
    ' 年数を加算した日付を基準にして、残りの月数を計算
    tempDate = DateAdd("yyyy", years, startDate) ' 調整後の年数を加算
    months = DateDiff("m", tempDate, endDate)
    
    ' DateDiff("m")は月が変わった回数を数えるため、
    ' 特定の日付を跨がない場合(例: 1/31 → 2/1 は1ヶ月と数えられる)は調整が必要
    ' この調整が、後述の「落とし穴」を回避するポイントです。
    If DateAdd("m", months, tempDate) > endDate Then
        months = months - 1
    End If

    ' --- ④ 結果を表示します ---
    Debug.Print "勤続期間: " & years & " 年 " & months & " ヶ月"
    
    ' 参考: 満勤続月数(退職金計算などで必要となることがあります)
    Dim totalMonths As Long
    totalMonths = years * 12 + months
    Debug.Print "(参考)満勤続月数: " & totalMonths & " ヶ月"

End Sub

【重要】DateDiff関数の「落とし穴」と正確な期間計算の解説

上記のコードでは、DateDiff関数の特性を理解した上で、正確な勤続期間を算出するための工夫が盛り込まれています。特に注意が必要なのが、DateDiff("m", Date1, Date2) を使った月数計算です。

この誤差を回避するために、先ほどのコードでは以下のロジックを採用しています。

  1. まず、DateDiff("yyyy", startDate, endDate) で年数の概算を計算します。
  2. 次に、DateAdd("yyyy", years, startDate) で計算された年数をstartDateに加算した日付(tempDate)が、endDateを過ぎていないかを確認します。過ぎている場合は、まだ年数が満了していないため、yearsから1を引いて調整します。
  3. 同様に、調整後の年数で得られたtempDateを基準に、DateDiff("m", tempDate, endDate) で月数の概算を計算します。
  4. 最後に、DateAdd("m", months, tempDate) で計算された月数をtempDateに加算した日付が、endDateを過ぎていないかを確認します。過ぎている場合は、まだ月数が満了していないため、monthsから1を引いて調整します。

この「DateAddで日付を進めて、endDateと比較し、必要なら差し引く」という手順を踏むことで、DateDiff関数の特性による誤差を排除し、「満〇年満〇ヶ月」という実務で求められる正確な期間計算が可能になります。

まとめ

人事担当者にとって、勤続期間の正確な計算は、業務の信頼性と公平性を保つ上で極めて重要です。VBAのDateDiff関数は非常に強力ですが、その特性を理解し、今回ご紹介したような厳密な調整を加えることで、初めて人事の現場で本当に役立つコードになります。

このコードを活用して、退職金計算、有給付与日数の管理、その他あらゆる勤続期間に関わる業務の精度を高め、効率化を進めてください。正確なデータ管理は、従業員との信頼関係を築く第一歩です!

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

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

無料相談はこちら