📊 Excel VBA Top100
🔧

CalculateWorkdays

ユーティリティ

開始日から終了日までの営業日数を計算する

VBAで稼働日数(営業日数)を計算するマクロです。開始日と終了日の間の土日と祝日を除いた実際の業務日数を算出します。祝日リストをシートから読み込んでWorksheetFunction.NetworkDaysを使った計算や、カスタム休日リストとの照合ロジックを実装できます。プロジェクトの期間計算、支払い期日の算出、工程管理表の自動更新に役立ちます。内部ではWorksheetFunction.NetworkDaysメソッドを利用しており、祝日リストを別シートで一元管理しておけば、祝日改定があってもリストの更新だけで全計算に反映されます。土曜日を稼働日として扱いたい場合はNetworkDays.Intlに切り替えることで柔軟にカスタマイズできます。カレンダーを目視で数える作業が不要になり、期間計算のミスも防げます。

CalculateWorkdays デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 実行すると開始日・終了日を入力して営業日数が計算される

🎯 活用シーン

  • ✓プロジェクトのマイルストーン間の稼働日数を自動計算して工程表を更新
  • ✓請求書の支払期日(30営業日後)を自動算出して入力
  • ✓有給休暇申請から実際の稼働日減少数を自動カウント
  • ✓外注先への発注から納品までの標準リードタイムを、稼働日ベースで正確に見積もりたいとき
  • ✓有給休暇の残日数管理で、申請期間中の実際の稼働日数を自動算出したいとき

💡 実装のヒント

  • ▸WorksheetFunction.NetworkDays(開始, 終了, 祝日範囲) で稼働日を計算できます
  • ▸土曜稼働など独自カレンダーにはNetworkDays_Intlを使います
  • ▸祝日リストは別シートに一覧化してRangeで参照します
  • ▸海外拠点との協業案件では、現地の祝日リストを別途用意して計算を切り替える仕組みにすると精度が上がります。
  • ▸計算結果がマイナスになる場合は開始日と終了日の前後関係が逆になっている可能性があるため、入力チェックを追加すると安全です。

💻 VBAコード

' CalculateWorkdays
' -----------------
' Macro Name: CalculateWorkdays
' Description: 開始日から終了日までの営業日数を計算する
' Parameters: なし
' Returns: なし
' Usage: 実行すると開始日・終了日を入力して営業日数が計算される
' -----------------

Sub CalculateWorkdays()
    Dim startDate As Date
    Dim endDate As Date
    Dim workdays As Long
    Dim ws As Worksheet
    Dim outputCell As String

    On Error GoTo ErrorHandler

    Dim startDateStr As String
    startDateStr = InputBox("開始日を入力 (yyyy/mm/dd):", "営業日計算", Format(Date, "yyyy/mm/dd"))

    If startDateStr = "" Then
        Exit Sub
    End If

    On Error Resume Next
    startDate = CDate(startDateStr)
    On Error GoTo ErrorHandler
    If Err.Number <> 0 Then
        MsgBox "日付の形式が正しくありません。", vbExclamation
        Exit Sub
    End If

    Dim endDateStr As String
    endDateStr = InputBox("終了日を入力 (yyyy/mm/dd):", "営業日計算", Format(Date, "yyyy/mm/dd"))

    If endDateStr = "" Then
        Exit Sub
    End If

    On Error Resume Next
    endDate = CDate(endDateStr)
    On Error GoTo ErrorHandler
    If Err.Number <> 0 Then
        MsgBox "日付の形式が正しくありません。", vbExclamation
        Exit Sub
    End If

    If endDate < startDate Then
        MsgBox "終了日が開始日より前です。", vbExclamation
        Exit Sub
    End If

    workdays = Application.WorksheetFunction.NetworkDays(startDate, endDate)

    Set ws = ActiveSheet
    outputCell = InputBox("結果を出力するセルアドレスを入力:", "営業日計算", "A1")

    If outputCell <> "" Then
        ws.Range(outputCell).Value = workdays
        ws.Range(outputCell).NumberFormat = "0"
    End If

    MsgBox startDate & " から " & endDate & " まで:" & vbCrLf & _
           "営業日数: " & workdays & " 日", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub