月の日数(月の末日)を求めるには
VBAの機能を使えば、DateSerial関数かDateAdd関数のどちらかを使えば月の末日を取得できます。
一応ですが、月の日数(月の末日、最終日)は以下の通り、年に関わらず決まっています。
1月:31日
2月:28日(うるう年の場合は29日)
3月:31日
4月:30日
5月:31日
6月:30日
7月:31日
8月:31日
9月:30日
10月:31日
11月:30日
12月:31日
問題なのは2月で、うるう年かどうかによって28日か29日に分かれることになります。なお、うるう年の判定方法については「VBAでうるう年の判定を行う」をご参照ください。
ただ、そういうことを考えなくても、VBAの機能を使えば簡単に求める方法が2つあります。
1つ目の方法は、DateSerial関数を使って翌月1日の前日を求める方法です。こちらは単純ですが関数の挙動を理解していないと何をやっているコードなのか分かりにくい点があります。
2つ目の方法は、DateAdd関数を使って翌月1日から1日引いた日付を求める方法です。
どちらを使っても構いません。結果は同じです。
DateSerial関数を使って月の日数を求める
DateSerial関数の詳細については「年月日の数値をDate型に変換する(DateSerial)」をご参照ください。
DateSerial関数の2番目の引数に+1しているのは翌月として扱うためです。
3番目の引数は-32,768から32,767の範囲を指定することが出来ます。
その際に日付の1日から31日の範囲を超えた分は年や月の増減に振り替えられます。
この性質を利用して、0を設定すると1日の前日となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub GetLastDay3() Dim sDate '// 調べたい日付 Dim sLast '// 末日 Dim sLastDay '// 末日の日のみ sDate = "2018/12/11" '// 翌月1日の前日を取得 sLast = DateSerial(Year(sDate), Month(sDate) + 1, 0) '// 末日の日のみを取得 sLastDay = Format(sLast, "d") End Sub |
実行するとsLastDayに2018/12/31の”31″が設定されます。
DateAdd関数を使って月の日数を求める
DateAdd関数については「VBAで日付や時刻の加減算を行う(DateAdd)」をご参照ください。
DateAdd関数を使う方法はコードが少し長くなります。
調べたい日付(yyyy/mm/dd)の末日を調べたい場合に分かりやすく処理を分けて書くと以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub GetLastDay() Dim sDate '// 調べたい日付 Dim sLast '// 末日 Dim sFirst '// 初日 Dim sNext '// 翌月 Dim sLastDay '// 末日の日のみ sDate = "2018/12/11" '// 対象年月の1日を取得 sFirst = Format(sDate, "yyyy/mm/01") '// 対象年月1日の翌月を取得 sNext = DateAdd("m", 1, sFirst) '// 末日を取得 sLast = DateAdd("d", -1, sNext) '// 末日の日のみを取得 sLastDay = Format(sLast, "d") End Sub |
1行で書くことももちろん出来ます。
1 2 3 4 5 6 7 8 |
Sub GetLastDay2() Dim sDate '// 調べたい日付 Dim sLastDay '// 末日の日のみ sDate = "2018/12/11" sLastDay = Format(DateAdd("d", -1, DateAdd("m", 1, Format(sDate, "yyyy/mm/01"))), "d") End Sub |
2つの関数はいずれもsLastDayには2018/12/31の”31″が設定されます。