月の初日と最終日を取得する

DateSerial関数で任意の指定日付の日付データを取得するコード。月の初日と最終日の取得

'本月の1日を取得
Debug.Print DateSerial(Year(Date), Month(Date), 1)
'本月の最終日を取得
Debug.Print DateSerial(Year(Date), Month(Date) + 1, 0)

月末の日にちを取得するには「DateSerial」関数を使用します
この関数は引数に数値で指定した年月日の日付データを返す関数です

関数の書式

引数(太字は必須引数)
(year, month, day)
戻り値の型 Valiant型(Date型)

引数の「year」は年の数値、「month」は月の数値、「day」は日にちの数値を指定します

関数の解説

この関数は引数に指定した数値の日付データを返しますが、指定する数値に関しては通常の日付数値範囲内でなくても大丈夫です

範囲内を超えた場合は、その上位の範囲に自動的に変換されます
引数「day」に「50」を指定すると、引数「month」に1が加算されて、残りの数値が日にちとして返されます

Debug.Print DateSerial(2020, 1, 50)

このコードを実行すると「2020/02/19」が取得されます
「50 – 31(1月の日数) = 19(2月の日数)」となり、月が加算されて結果の日付になります

これは引数「month」も同様で、「13」以上を指定すると引数「year」に繰り上げされます
引数「year」の繰り上げは無いので関係ありません

コード解説

Debug.Print DateSerial(Year(Date), Month(Date), 1)

本月の1日を取得します

年月はDate関数を使用してコード実行日を取得します
日にちは「1」を固定で指定することで、「○年○月1日」を取得できます

Debug.Print DateSerial(Year(Date), Month(Date) + 1, 0)

本月の最終日を取得します
関数の解説でもあるように、「Month(Date) + 1」が「12 + 1」でmonthの指定値が「13」になるので、yearに繰り上げされるので問題なく取得できます

また、この関数の特別な使い方で、「0以下の数値も指定可能」です
dayに「0」を指定すると、1日の前日が指定されるため、前月の最終日が指定されます

「前月の」なので、月に1を加算する必要があります
月に1を加算することで、来月の0日を指定することになり、来月の前月の最終日
つまり、今月の最終日を取得することが出来ました

また、マイナス数値も可能と言いましたが、その場合は指定数値分前の日にちが返されます

ワークシート関数にあるEOMONTH関数がVBAには無いので、こうした工夫をして最終日は取得します