1. 導入:なぜこの関数が実務で必須なのか
実務におけるスケジュール管理や給与計算で、「土日祝日を除いた実働日数」や「指定した営業日後の日付」を求めることは頻繁にあります。手動でカレンダーを見ながら数えるのはミスのもとですし、何より時間がかかります。ExcelのNETWORKDAYS関数やWORKDAY関数をVBAで自動化することで、複雑なカレンダー計算を一瞬で終わらせ、ヒューマンエラーをゼロにすることができます。
2. 基礎知識:関数のおさらい
まず、VBAで扱う前にそれぞれの役割を理解しましょう。
・NETWORKDAYS関数:開始日と終了日の間の「稼働日数(土日祝日を除く)」を返します。
・WORKDAY関数:開始日から指定した稼働日数が経過した後の「日付」を返します。
これらはExcelのワークシート関数ですが、VBAのWorksheetFunctionオブジェクト経由で呼び出すことで、マクロ内に組み込むことができます。特に、祝日リストをあらかじめセル範囲として用意しておけば、会社独自の休日も柔軟に除外可能です。
3. 実装/解決策:VBAでの呼び出し方
VBAでこれらの関数を使用するには、Application.WorksheetFunction.関数名 という形式を使います。
重要なのは「祝日リスト」の扱いです。コード内で範囲を指定する際、Rangeオブジェクトとして渡すことで、Excelが自動的に土日祝日を判定して計算してくれます。
4. サンプルプログラム
以下のコードは、指定した期間の実働日数を算出し、さらに10営業日後の日付を求める実用的な例です。
Sub CalculateBusinessDays()
Dim startDate As Date
Dim endDate As Date
Dim holidayRange As Range
Dim workingDays As Long
Dim deadlineDate As Date
‘ 1. 計算の前提条件を設定
startDate = DateValue(“2023/10/01”)
endDate = DateValue(“2023/10/31”)
‘ 祝日リストが入っているセル範囲を指定(シート名:Sheet1のA1:A10など)
Set holidayRange = ThisWorkbook.Sheets(“Sheet1”).Range(“A1:A10”)
‘ 2. NETWORKDAYS関数:実働日数を取得
‘ 引数:開始日, 終了日, 祝日範囲
workingDays = Application.WorksheetFunction.NetworkDays(startDate, endDate, holidayRange)
‘ 3. WORKDAY関数:10営業日後の日付を取得
‘ 引数:開始日, 経過日数, 祝日範囲
deadlineDate = Application.WorksheetFunction.WorkDay(startDate, 10, holidayRange)
‘ 結果を表示
MsgBox “実働日数: ” & workingDays & “日” & vbCrLf & _
“10営業日後の日付: ” & Format(deadlineDate, “yyyy/mm/dd”)
End Sub
5. 応用・注意点:現場で陥りやすい罠
・祝日範囲の空白セルに注意
祝日リストの範囲内に空白セルが含まれていると、エラーになったり計算が狂ったりすることがあります。VBAで範囲を指定する際は、データの最終行を動的に取得する工夫(End(xlUp)など)を取り入れ、常に正確な範囲を渡すようにしましょう。
・エラーハンドリング
引数に不正な日付形式が渡されると、VBAが実行時エラーで停止してしまいます。計算を実行する前に IsDate関数 で日付が正しいかチェックする処理を挟むと、より堅牢なプログラムになります。
これらの関数を使いこなせば、プロジェクト管理や勤怠集計の自動化が劇的に進みます。ぜひ、実際の業務データで試してみてください。
