【VBAリファレンス|実務向け】VBAで業務効率化!NETWORKDAYS関数を使いこなして「稼働日数」を自動計算する

スポンサーリンク

1. 導入:なぜVBAで稼働日数計算が必要なのか

実務において、プロジェクトの進捗管理や工数計算を行う際、「土日祝日を除いた実働日数」を求める場面は非常に多いものです。Excelのセル関数であるNETWORKDAYS関数は非常に優秀ですが、大量のデータを扱う際や、定型的なレポート作成を自動化する際には、VBAの中に組み込んで処理を完結させることで、手作業を減らし、ミスを大幅に削減できます。今回は、VBAを使ってこの関数を呼び出し、効率的に実働日数を算出する方法を解説します。

2. 基礎知識:NETWORKDAYS関数とは

NETWORKDAYS関数は、指定した「開始日」から「終了日」までの期間において、土日を除いた日数を返してくれる関数です。さらに、第3引数に「祝日リスト」の範囲を指定することで、会社独自の休日や祝日も正確に除外できます。VBAからこの機能を利用するには、Application.WorksheetFunctionオブジェクトを使用します。これにより、ワークシート上の関数をVBAコードから直接呼び出すことが可能になります。

3. 実装/解決策:VBAでNETWORKDAYSを呼び出す

VBAでこの関数を使う際のポイントは、引数に指定する「祭日(休日)リスト」の扱いです。Rangeオブジェクトとしてセル範囲を渡すことで、Excelが自動的に配列として処理してくれます。また、コードの再利用性を高めるために、休日リストの範囲は名前定義を使うか、可変のRangeとして指定するのが実務的なアプローチです。

4. サンプルプログラム

以下のコードは、アクティブシートのセルB4(開始日)からD4(終了日)までの稼働日数を計算し、E4セルに出力する実用的な例です。あらかじめA13からA36に休日リストを入力しておいてください。

Sub CalculateWorkingDays()
Dim ws As Worksheet
Dim startDate As Date
Dim endDate As Date
Dim holidayRange As Range
Dim workingDays As Long

Set ws = ActiveSheet

‘ 開始日と終了日の設定
startDate = ws.Range(“B4”).Value
endDate = ws.Range(“D4”).Value

‘ 祝日リストの範囲を設定(A13:A36)
Set holidayRange = ws.Range(“A13:A36”)

‘ WorksheetFunctionを使用してNETWORKDAYSを実行
‘ エラー回避のためOn Error Resume Nextを検討する場合もありますが、
‘ まずは正しく値が入っているか確認してから実行しましょう
workingDays = Application.WorksheetFunction.NetworkDays(startDate, endDate, holidayRange)

‘ 結果をE4セルに出力
ws.Range(“E4”).Value = workingDays

MsgBox “稼働日数の計算が完了しました:” & workingDays & “日”
End Sub

5. 応用・注意点:現場で陥りやすい罠

VBAで関数を扱う際に注意すべき点がいくつかあります。
・エラー処理: 開始日が終了日より後の場合や、入力値が日付形式でない場合、関数はエラーを返すことがあります。実務では If IsDate(ws.Range(“B4”).Value) Then などの判定を挟むのが安全です。
・絶対参照の意識: セル操作と異なり、VBAではRangeオブジェクトを直接指定するため、「数式をコピーして範囲がずれる」というミスは起きにくいですが、逆に参照するセルが正しいかをコード内で明示的にチェックする習慣をつけましょう。
・パフォーマンス: 数万行のループ内で毎回この関数を呼び出すと処理が重くなることがあります。その場合は、一度配列に休日リストを格納してから計算させるなどの工夫が必要です。

まずは上記コードで、自身のシート構成に合わせた稼働日数計算を自動化してみてください。これがVBAによる業務効率化の第一歩です。

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