はじめに:Excel VBAで営業日を正確に判定する重要性
ビジネスシーンでExcelを使う際、特定のタスクを「営業日」に基づいて実行したい、あるいは「N営業日後」の日付を計算したい、といったニーズは非常に多いのではないでしょうか。しかし、土日だけでなく「祝日」も考慮して営業日を正確に判定するのは、意外と手間がかかる作業です。
この記事では、Excel VBAを使って土日祝日を自動で除外し、柔軟かつ正確に営業日を判定する方法を、具体的なコードと分かりやすい解説でご紹介します。初級者の方でも安心して取り組めるよう、ステップバイステップで進めていきますので、ぜひ最後までご覧ください。
営業日判定の基本:土日の除外
まずは、土日を除外する基本的な営業日判定の方法から見ていきましょう。VBAには日付の曜日を取得する便利な関数 Weekday があります。
Weekday 関数で曜日を判定する
Weekday 関数は、指定された日付の曜日を数値で返します。第2引数で週の開始曜日を指定でき、これによって返される数値が変わります。ここでは、標準的な日曜日始まり(vbSunday)で使ってみましょう。
vbSunday(1): 日曜日vbMonday(2): 月曜日- …
vbSaturday(7): 土曜日
'////////////////////////////////////////////////////////////////////////////////
' 関数名:IsWeekend
' 概要 :指定された日付が土日かどうかを判定します。
' 引数 :targetDate (Date) - 判定したい日付
' 戻り値:Boolean - 土日なら True、それ以外なら False
'////////////////////////////////////////////////////////////////////////////////
Function IsWeekend(ByVal targetDate As Date) As Boolean
Dim dayOfWeek As VbDayOfWeek
dayOfWeek = Weekday(targetDate, vbSunday) ' 日曜日を1とする
If dayOfWeek = vbSaturday Or dayOfWeek = vbSunday Then
IsWeekend = True
Else
IsWeekend = False
End If
End Function
' 使用例
Sub TestIsWeekend()
Debug.Print "2024/7/20 (土): " & IsWeekend(DateSerial(2024, 7, 20)) ' True
Debug.Print "2024/7/21 (日): " & IsWeekend(DateSerial(2024, 7, 21)) ' True
Debug.Print "2024/7/22 (月): " & IsWeekend(DateSerial(2024, 7, 22)) ' False
End Sub
この IsWeekend 関数を使えば、特定の日付が土日かどうかを簡単に判定できます。
祝日を考慮した営業日判定の実現
土日だけでなく、日本の祝日も営業日判定から除外するにはどうすれば良いでしょうか?VBAには祝日を自動で判別する組み込み関数がないため、祝日リストを別途用意し、それと照合する方法が最も一般的で実用的です。
祝日リストの準備
最も簡単な方法は、Excelシートの特定の範囲に祝日の一覧を記述することです。例えば、「設定」というシートを作成し、A列に祝日を日付形式で入力しておくと良いでしょう。
祝日リストから日付を検索する関数
次に、指定された日付が祝日リストに含まれているかを判定する関数を作成します。
'////////////////////////////////////////////////////////////////////////////////
' 関数名:IsHoliday
' 概要 :指定された日付が祝日リストに含まれているかを判定します。
' 引数 :targetDate (Date) - 判定したい日付
' holidayRange (Range) - 祝日リストが入力されているExcelシートの範囲
' 戻り値:Boolean - 祝日リストに含まれていれば True、そうでなければ False
'////////////////////////////////////////////////////////////////////////////////
Function IsHoliday(ByVal targetDate As Date, ByVal holidayRange As Range) As Boolean
Dim cell As Range
IsHoliday = False ' 初期値は祝日ではない
For Each cell In holidayRange
' セルが日付として有効かつ、判定対象日と一致するかチェック
If IsDate(cell.Value) And Format(cell.Value, "yyyy/mm/dd") = Format(targetDate, "yyyy/mm/dd") Then
IsHoliday = True
Exit Function ' 見つかったらループを終了
End If
Next cell
End Function
' 使用例 (「設定」シートのA列に祝日リストがあると仮定)
Sub TestIsHoliday()
Dim wsSetting As Worksheet
Dim holidayList As Range
Set wsSetting = ThisWorkbook.Sheets("設定") ' 「設定」シートを指定
Set holidayList = wsSetting.Range("A:A") ' A列全体を祝日リスト範囲とする
Debug.Print "2024/7/15 (海の日): " & IsHoliday(DateSerial(2024, 7, 15), holidayList) ' True (リストにあれば)
Debug.Print "2024/7/16 (火): " & IsHoliday(DateSerial(2024, 7, 16), holidayList) ' False
End Sub
holidayRange には、祝日リストが入力されているシートの範囲(例: Worksheets("設定").Range("A2:A100") など)を指定します。Format 関数を使って日付の書式を統一することで、比較の精度を高めています。
土日祝日を除外した総合的な営業日判定関数
これで、土日を判定する IsWeekend 関数と、祝日を判定する IsHoliday 関数の両方が揃いました。これらを組み合わせて、真の営業日を判定する関数を作成しましょう。
'////////////////////////////////////////////////////////////////////////////////
' 関数名:IsBusinessDay
' 概要 :指定された日付が土日祝日を除いた営業日であるかを判定します。
' 引数 :targetDate (Date) - 判定したい日付
' holidayRange (Range) - 祝日リストが入力されているExcelシートの範囲
' 戻り値:Boolean - 営業日なら True、それ以外なら False
'////////////////////////////////////////////////////////////////////////////////
Function IsBusinessDay(ByVal targetDate As Date, ByVal holidayRange As Range) As Boolean
' 土日ではない かつ 祝日ではない => 営業日
If Not IsWeekend(targetDate) And Not IsHoliday(targetDate, holidayRange) Then
IsBusinessDay = True
Else
IsBusinessDay = False
End If
End Function
' 使用例マクロ
Sub CheckBusinessDayExample()
Dim targetDate As Date
Dim holidayList As Range
' ★★★ ここを実際の祝日リスト範囲に合わせて変更してください ★★★
Set holidayList = ThisWorkbook.Sheets("設定").Range("A:A") ' 例: 「設定」シートのA列
' 判定テスト
targetDate = DateSerial(2024, 7, 15) ' 2024/7/15 (月・海の日) - 祝日
If IsBusinessDay(targetDate, holidayList) Then
MsgBox targetDate & " は営業日です。", vbInformation, "営業日判定"
Else
MsgBox targetDate & " は営業日ではありません。", vbInformation, "営業日判定"
End If
targetDate = DateSerial(2024, 7, 20) ' 2024/7/20 (土) - 土曜日
If IsBusinessDay(targetDate, holidayList) Then
MsgBox targetDate & " は営業日です。", vbInformation, "営業日判定"
Else
MsgBox targetDate & " は営業日ではありません。", vbInformation, "営業日判定"
End If
targetDate = DateSerial(2024, 7, 16) ' 2024/7/16 (火) - 営業日
If IsBusinessDay(targetDate, holidayList) Then
MsgBox targetDate & " は営業日です。", vbInformation, "営業日判定"
Else
MsgBox targetDate & " は営業日ではありません。", vbInformation, "営業日判定"
End If
End Sub
この IsBusinessDay 関数を使えば、どんな日付でも土日祝日を考慮した営業日判定が可能です。ぜひ、ご自身のExcelファイルに組み込んで試してみてください。
応用編:N営業日後の日付を求める
営業日判定ができるようになると、次に必要となるのが「今日からN営業日後の日付」を求める機能です。これも、先ほどの IsBusinessDay 関数を使えば簡単に実現できます。
'////////////////////////////////////////////////////////////////////////////////
' 関数名:GetNthBusinessDay
' 概要 :指定された日付から数えてN営業日後の日付を計算します。
' 引数 :startDate (Date) - 開始日付
' n (Long) - 何営業日後か
' holidayRange (Range) - 祝日リストが入力されているExcelシートの範囲
' 戻り値:Date - N営業日後の日付
'////////////////////////////////////////////////////////////////////////////////
Function GetNthBusinessDay(ByVal startDate As Date, ByVal n As Long, ByVal holidayRange As Range) As Date
Dim count As Long
Dim currentDate As Date
currentDate = startDate ' 開始日付からスタート
' nが0以下の場合は開始日付を返す
If n <= 0 Then
GetNthBusinessDay = startDate
Exit Function
End If
Do While count < n
currentDate = currentDate + 1 ' 日付を1日進める
' 進めた日付が営業日であればカウント
If IsBusinessDay(currentDate, holidayRange) Then
count = count + 1
End If
Loop
GetNthBusinessDay = currentDate
End Function
' 使用例マクロ
Sub GetNthBusinessDayExample()
Dim startDate As Date
Dim nthDay As Long
Dim resultDate As Date
Dim holidayList As Range
' ★★★ ここを実際の祝日リスト範囲に合わせて変更してください ★★★
Set holidayList = ThisWorkbook.Sheets("設定").Range("A:A") ' 例: 「設定」シートのA列
startDate = DateSerial(2024, 7, 12) ' 2024/7/12 (金)
nthDay = 3 ' 3営業日後
' 2024/7/12(金) -> 7/13(土)X -> 7/14(日)X -> 7/15(月・海の日)X -> 7/16(火)1 -> 7/17(水)2 -> 7/18(木)3
resultDate = GetNthBusinessDay(startDate, nthDay, holidayList)
MsgBox startDate & " の " & nthDay & " 営業日後の日付は " & resultDate & " です。", vbInformation, "N営業日後"
startDate = DateSerial(2024, 7, 15) ' 2024/7/15 (月・海の日)
nthDay = 1 ' 1営業日後
' 2024/7/15(月・海の日)X -> 7/16(火)1
resultDate = GetNthBusinessDay(startDate, nthDay, holidayList)
MsgBox startDate & " の " & nthDay & " 営業日後の日付は " & resultDate & " です。", vbInformation, "N営業日後"
End Sub
GetNthBusinessDay 関数は、開始日から1日ずつ日付を進めながら IsBusinessDay 関数で営業日かどうかをチェックし、指定された営業日数に達するまで繰り返します。これにより、土日祝日を正確にスキップしてN営業日後の日付を算出できます。
まとめ:VBAで業務効率を飛躍的に向上させよう
この記事では、Excel VBAを使って土日祝日を除外した営業日を自動判定する方法から、N営業日後の日付を計算する応用例までを解説しました。
Weekday関数で土日を判定- Excelシートに祝日リストを作成し、
IsHoliday関数で祝日を判定 - これらを組み合わせた
IsBusinessDay関数で総合的な営業日判定 IsBusinessDay関数を活用し、GetNthBusinessDay関数でN営業日後の日付を計算
これらのVBAコードを活用することで、手作業での日付計算ミスをなくし、業務の効率と正確性を大幅に向上させることができます。ぜひ、ご自身の業務に合わせてカスタマイズし、日々の作業にお役立てください。


コメント