月の最終営業日を取得する方法を紹介します。営業日は個々に異なるため、個別に祝日等の定義が必要となります。今回は、デフォルトで土日休み、祝日などを個別定義する方法で、月の最終営業日を取得する方法を記載します。
WorksheetFunction.WorkDay関数で解決する
WorksheetFunction.WorkDay関数の細かい仕様については、こちらの記事を参照してください。
WorksheetFunction.WorkDay関数には、負の数を渡す事ができます。月の最終営業日を取得したい月の翌月初日から「-1」営業日することで月の最終営業日を取得することができます。
サンプルプログラムを確認する(コピペOK)
まずは祝日を定義します。今回はA列に入力するものとします。土日については入力する必要はありません。例では、2019年のみとなっていますが、2018年以前や2020年以降について定義しても問題ありません。
Option Explicit
Sub sample()
' 2019年8月の最終営業日を求めたい
Dim sDate As String: sDate = "2019/9/1" ' 最終営業日を求めたい月の翌月初日を指定する
Debug.Print WorksheetFunction.WorkDay(sDate, 1, Range("a:a")) ' 43710
' WorkDay関数はSerialが返却されるので、CDateでDate型に変換する
Debug.Print CDate(WorksheetFunction.WorkDay(sDate, -1, Range("a:a"))) ' 2019/08/30
' 2019/08/31は土曜日
' 2019年4月の最終営業日を求めたい
sDate = "2019/5/1" ' 最終営業日を求めたい月の翌月初日を指定する
Debug.Print WorksheetFunction.WorkDay(sDate, -1, Range("a:a")) ' 43581
' WorkDay関数はSerialが返却されるので、CDateでDate型に変換する
Debug.Print CDate(WorksheetFunction.WorkDay(sDate, -1, Range("a:a"))) ' 2019/04/26
' 2019/04/27,28は土日
' 2019/04/29,30は祝日
End Sub