- ベストアンサー
VBAで、うるう年の計算
4年に一回うるう年がありますが、そのうち100年に1回はうるう年に当ってもうるう年になりません。またこの100年周期のうち、400年に1回はうるう年にります。 これをVBAで書くとどうなるんでしょうか? 頭が混乱してきました。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
つまりは、プログラム言語的な言い方をすれば、うるう年の定義は「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 でいいと思います。 うるう年の定義は自分では調べていませんので念のため。
その他の回答 (2)
- maruru01
- ベストアンサー率51% (1179/2272)
No.2です。 >なぜ西暦の年数を長整数型に変換しているのでしょうか? ああ、そうですね、DateSerial関数の引数には、整数型(Integer)とヘルプにありますね。 その場合は、 Dim tempYear As Integer tempYear = CInt(Range("A1").Value) また、VBAは自動的に型変換してくれるから、 tempYear = Range("A1").Value でもいいかも知れませんね。 さらに、DateSerial関数の引数に指定した段階で型変換してますしね。
お礼
ありがとうございました。
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。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
お礼
ありがとうございました。 VBAにうるう年が組み込まれているんですか、勉強になりました。 ところで CLng とは見たことが無かったので今調べましたら長整数型とのことでしたが、なぜ西暦の年数を長整数型に変換しているのでしょうか?
お礼
さっそくありがとうございました。 Andや Orなんですね。 勉強になりました。