螺旋を描いて…

螺旋 のごとく続く毎日を綴ります

閏年…

今週のお題「うるう年」

 

4年に1回、回ってくる、閏年

「4年に1度」ってのが、一般の人の常識かな。

 

でも、実は例外がありまして。

「100で割れる年は、閏年ではない」のです。

次に来る「2100年」は、閏年ではないんです。

 

ただし、もう一つ例外。

「400で割れる場合は、閏年

なので、「2000年2月29日」は、存在します。

火曜日、ですね。

 

ちなみに、Excelに日付を打ち込めば、曜日は簡単にわかります。

「セルの書式設定」で、ユーザー定義を選び、「aaa」と入れると、曜日表示になります。

関数なんて、要らないです。

 

ところで、ExcelVBAで、こんなことも出来ます。

セルA2に年を入れることにして…

 

Sub Uruu1()

Dim myYear as long

myYear = Range("A2").value

If myYear MOD 4 <> 0 Or (myYear MOD 100 = 0 And myYear MOD 400 <>0) Then

    Range("B2").Value = "平年"

Else

    Range("B2").Value = "閏年"

End If

End Sub

 

セルB2に、「平年」「閏年」の、どちらかが表示されます♪

 

ここで、「MOD」は、余りを求める演算です。

MOD 4なら、4で割って、余りを出します。

つまり、「4で割って余りが出る場合か、または100では割れても400では割れない場合」、「平年」と表示するわけですね。

 

こんな方法もあります。

Sub Uruu2()

Dim myYear as long

myYear = Range("A2").value

If Day(DateSerial(myYear, 3, 1) -1 )=28 Then

    Range("B2").Value = "平年"

Else

    Range("B2").Value = "閏年"

End If

End Sub

 

要は、「その年の3月1日の前日を求める」方法です。

DateSerial関数は、年月日を整数で指定すると、Excelが日付を処理する「シリアル値」に変換してくれます。

この「シリアル値」って、実は整数(時刻は小数)なので、それから1を引けば、前日になります。

それをDay関数にかければ、シリアル値から、前日の日付部分のみが取り出せ、28なら平年、29なら閏年、ってわけです♪

 

ただ、一つ、気をつけなければいけないことが、ありまして。

Excelにバグがあって、1900年2月29日が、存在してしまうんです。

まぁ、そんな前の日付、滅多には使わないでしょうが、歴史とかを扱う場合は、問題になる場合も、あるようです。

 

実は、前述のシリアル値は、基本的に1900年1月1日が1になっていて、1日ごとに1ずつ、足されていきます。

 

ところが、かつてのライバル(Lotus1-2-3!?)に、このバグがあったそうで。

互換性を取るために、このバグごと、取り込まなければいけなったそうです。

 

いろんな、大人の事情が、あったんですね。