VBAでうるう年の判定を行う方法が2通り
ある年がうるう年かどうかを判定するには、VBAでは2通りの方法が考えられます。
1つはプログラミング言語とは関係なく、うるう年の考え方を実装する方法です。
もう1つはDateSerial関数を使う方法です。DateSerial関数についての詳細は「年月日の数値をDate型に変換する(DateSerial)」をご参照ください。
それぞれについてコードで説明します。
1. うるう年の考え方を実装する方法
一般的なうるう年かどうかの判定は以下の4つの判定を行います。先の判定でうるう年である・ない、が確定した場合は以降の判定は行いません。
- 年が400で割り切れる場合はうるう年とする。
- 100で割り切れる場合はうるう年ではなく通常年とする。
- 4で割り切れる場合はうるう年とする。
- それ以外はうるう年ではなく通常年とする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Function IsLeapYear(iYear As Integer) As Boolean Dim bRet As Boolean '// True:うるう年である、False:うるう年でない '// 400で割り切れる場合はうるう年 If (iYear Mod 400 = 0) Then bRet = True '// 100で割り切れる場合は通常年 ElseIf (iYear Mod 100 = 0) Then bRet = False '// 4で割り切れる場合はうるう年 ElseIf (iYear Mod 4 = 0) Then bRet = True '// 上記条件に一致しない場合は通常年 Else bRet = False End If IsLeapYear = bRet End Function |
2. DateSerial関数での判定方法
DateSerial関数を使う方法は、対象年の3月1日の1日前の2月末日が29日かどうかでうるう年か判定します。1日前はDay関数で取得します。
1日前を計算することになるため、先に紹介したコードよりも内部では無駄な処理が行われていることになります。
Day関数についての詳細は「VBAで年、月、日を取得する(Year、Month、Day)」をご参照ください。
DateSerial関数についての詳細は「年月日の数値をDate型に変換する(DateSerial)」をご参照ください。
どれぐらい遅くなるのか処理速度を確認したところ、2000回ループしてうるう年判定関数を実行した場合、上のコードは約0.6秒、このコードは約2.4秒ほど掛かっており、1.8秒ほど上のコードよりも遅いです。ただ、1回の処理あたりでは0.0009秒遅い、というぐらいのものです。
1 2 3 4 5 6 7 8 9 |
Function IsLeapYearDateSerial(iYear As Integer) As Boolean '// 対象年の3月1日の前日が29日の場合はうるう年 If (Day(DateSerial(iYear, 3, 1) - 1) = 29) Then IsLeapYearDateSerial = True '// それ以外は通常年 Else IsLeapYearDateSerial = False End If End Function |
DateSerialの3番目の引数が0の場合は前月末日を意味するため以下のように書いても同じ意味になります。
1 2 3 4 5 6 7 8 9 |
Function IsLeapYearDateSerial(iYear As Integer) As Boolean '// 対象年の3月1日の前日が29日の場合はうるう年 If (Day(DateSerial(iYear, 3, 0)) = 29) Then IsLeapYearDateSerial = True '// それ以外は通常年 Else IsLeapYearDateSerial = False End If End Function |
利用方法
上に2つの関数を紹介しましたが、どちらも使い方は同じです。
ループで1000から3000年までの2000年間についてうるう年かどうかの判定を行うサンプルです。
1 2 3 4 5 6 7 8 9 10 |
Sub IsLeapYearTest() Dim i As Integer Dim b As Boolean For i = 1000 To 3000 ' b = IsLeapYearDateSerial(i) b = IsLeapYear(i) Debug.Print i & ":" & b Next End Sub |