• ベストアンサー

VBAで、うるう年の計算

4年に一回うるう年がありますが、そのうち100年に1回はうるう年に当ってもうるう年になりません。またこの100年周期のうち、400年に1回はうるう年にります。 これをVBAで書くとどうなるんでしょうか? 頭が混乱してきました。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

つまりは、プログラム言語的な言い方をすれば、うるう年の定義は「4で割り切れて100で割り切れない年はうるう年である。または400で割り切れる年はうるう年である。」ということでいいすね? そうであれば仮に、A1セルに調べたい西暦年を数値でいれてあるとして、 Sub URUU() y = Cells(1, 1).Value If ((y Mod 4) = 0 And (y Mod 100) <> 0) Or (y Mod 400) = 0 Then MsgBox y & "年はうるう年です" Else MsgBox y & "年の2月は28日までです" End If End Sub でいいと思います。 うるう年の定義は自分では調べていませんので念のため。

smile_smile
質問者

お礼

さっそくありがとうございました。 Andや Orなんですね。 勉強になりました。

その他の回答 (2)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

No.2です。 >なぜ西暦の年数を長整数型に変換しているのでしょうか? ああ、そうですね、DateSerial関数の引数には、整数型(Integer)とヘルプにありますね。 その場合は、 Dim tempYear As Integer tempYear = CInt(Range("A1").Value) また、VBAは自動的に型変換してくれるから、 tempYear = Range("A1").Value でもいいかも知れませんね。 さらに、DateSerial関数の引数に指定した段階で型変換してますしね。

smile_smile
質問者

お礼

ありがとうございました。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 質問の主旨とは違うかも知れません。 VBAでは、100~9999年の閏年はすべて組み込まれているので、それを利用する方法があります。 A1に西暦の年数を入力するとして、 Sub Macro()   Dim tempYear As Long   tempYear = CLng(Range("A1").Value)   If Day(DateSerial(tempYear, 2, 29)) = 29 Then     MsgBox tempYear & "は閏年です。"   Else     MsgBox tempYear & "は閏年ではありません。"   End If End Sub

smile_smile
質問者

お礼

ありがとうございました。 VBAにうるう年が組み込まれているんですか、勉強になりました。 ところで CLng とは見たことが無かったので今調べましたら長整数型とのことでしたが、なぜ西暦の年数を長整数型に変換しているのでしょうか?