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

📖 使い方
- VBAエディタを開く(Alt + F11)
- モジュールを挿入(挿入 > モジュール)
- 下記VBAコードをコピー&ペースト
- ブック上で実行(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