月の日数(月の末日)を求めるには

月の日数は1、3、5、7、8、10、12月は31日で、4、6、9、11月が30日で、2月が28日か29日です。

にぎりこぶしを使って求める方法は有名ですね。

問題なのは2月で、うるう年かどうかによって28日か29日に分かれることになります。

なお、うるう年の判定方法については「VBAでうるう年の判定を行う」をご参照ください。

ただ、そういうことを考えなくても、VBAの機能を使えば簡単に求める方法があります。

1つはDateSerial関数を使って翌月1日の前日を求める方法で、もう1つはDateAdd関数を使って翌月1日から1日引いた日付を求める方法です。

1つ目のDateSerial関数の方法がより単純ですが、関数の挙動を理解していないと何をやっているコードなのか分かりにくい点があります。

その点は後述しています。

DateSerial関数を使って月の日数を求める

DateSerial関数の詳細については「年月日の数値をDate型に変換する(DateSerial)」をご参照ください。

DateSerial関数の2番目の引数に+1しているのは翌月として扱うためです。

3番目の引数は-32,768から32,767の範囲を指定することが出来ます。

その際に日付の1日から31日の範囲を超えた分は年や月の増減に振り替えられます。

この性質を利用して、0を設定すると1日の前日となります。

実行するとsLastDayに2018/12/31の”31″が設定されます。

DateAdd関数を使って月の日数を求める

DateAdd関数については「VBAで日付や時刻の加減算を行う(DateAdd)」をご参照ください。

DateAdd関数を使う方法はコードが少し長くなります。

調べたい日付(yyyy/mm/dd)の末日を調べたい場合に分かりやすく処理を分けて書くと以下のようになります。

1行で書くことももちろん出来ます。

2つの関数はいずれもsLastDayには2018/12/31の”31″が設定されます。