ワークシートを作成するとき、特定の月の最終営業日を知る必要がある場合があります。営業日が月曜日から金曜日であるとすると、次の数式は目的の日付を返します。

=DATE(YEAR(A1),MONTH(A1)+1,0)-(MAX(0,WEEKDAY (DATE(YEAR(A1),MONTH(A1)+1,0),2)-5))

この数式は、月曜日から金曜日までの日付を返し、常にA1の日付で表される月の最後の日を返します。目的によっては、特定の月の最終金曜日が何であるかを知る必要がある場合があります。これは次の式で簡単に決定できます:

=DATE(YEAR(A1),MONTH(A1)+1,0)-WEEKDAY(DATE (YEAR(A1),MONTH(A1)+1,0))+(WEEKDAY(DATE (YEAR(A1),MONTH(A1)+1,0))>5)*7-1

この数式は、セルA1の日付の月末日を計算し、その日付が何曜日であるかに基づいて、適切な日数を差し引いて前の金曜日を返します。

休日を考慮に入れたい場合は、数式の複雑さが非常に速くなります。そのため、最終営業日を決定し、休日を補うユーザー定義関数(マクロ)を作成するのが最善です。

次のマクロは、最終営業日を表す月曜日から金曜日までの日付を返します。日付は、ブック内の名前付き範囲である休日リスト(HolidayList)と比較されます。日付が休日であることが判明した場合、適切な日が見つかるまで終了営業日が減らされます。

Function LastWorkDay(lRawDate As Long, _     Optional rHolidayList As Range, _     Optional bFriday As Boolean = False) As Long

LastWorkDay = DateSerial(Year(lRawDate), _       Month(lRawDate) + 1, 0) - 0     If bFriday Then         LastWorkDay = MakeItFriday(LastWorkDay)

Else         LastWorkDay = NoWeekends(LastWorkDay)

End If

If Not rHolidayList Is Nothing Then         Do Until myMatch(LastWorkDay, rHolidayList) = 0             LastWorkDay = LastWorkDay - 1             If bFriday Then                 LastWorkDay = MakeItFriday(LastWorkDay)

Else                 LastWorkDay = NoWeekends(LastWorkDay)

End If         Loop     End If End Function
Private Function myMatch(vValue, rng As Range) As Long     myMatch = 0     On Error Resume Next     myMatch = Application.WorksheetFunction _         .Match(vValue, rng, 0)

On Error GoTo 0 End Function
Private Function NoWeekends(lLastDay As Long) As Long     NoWeekends = lLastDay     If Weekday(lLastDay) = vbSunday Then _       NoWeekends = NoWeekends - 2     If Weekday(lLastDay) = vbSaturday Then _       NoWeekends = NoWeekends - 1 End Function
Private Function MakeItFriday(lLastDay As Long) As Long     MakeItFriday = lLastDay     While Weekday(MakeItFriday) <> vbFriday         MakeItFriday = MakeItFriday - 1     Wend End Function

含まれている3つのプライベート関数があることに注意してください。これらの関数は、メインのLastWorkDay関数内から呼び出されます。最初のmyMatchは、通常のMatchメソッドの「ラッパー」です。この使用法は、必要なエラー処理のために含まれています。

2番目の関数NoWeekdendsは、土曜日または日曜日の日付を前の金曜日までバックアップするために使用されます。 MakeItFriday関数は、日付が常に金曜日になるようにするために使用されます。

ワークシートからこのユーザー定義関数を使用するには、次のような数式で使用します。

=LastWorkDay(A1, HolidayList, TRUE)

最初のパラメーター(A1)は、評価される日付です。 2番目のパラメーター(HolidayList)は、休日の日付のオプションのリストです。ここに示すように、HolidayListはワークシート内の名前付き範囲であると想定されています。

このパラメーターが指定されている場合、関数は、返す日付がHolidayListの日付のリストにないことを確認します。

最後のパラメーターもオプションです。 TRUEまたはFALSEのいずれかになります。

(指定されていない場合、デフォルトはFALSEです。)このパラメーターがTRUEに設定されている場合、関数は常にその月の最終金曜日を返します。このパラメーターがTRUEで、HolidayListが指定されている場合、関数はその月の最後の非休日金曜日を返します。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(10085)は、Microsoft Excel 2007および2010に適用されます。Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります。