- ベストアンサー
エクセルVBAで、うるう年の判定
エクセルVBAで、うるう年の判定をしなければなりません。 簡単に判定できる方法があったら、教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
さらに失礼しました。。。 Day(CDate("March 1, " & CStr( 西暦 As Integer )) - 1) が正解です
その他の回答 (4)
- matsu_jun
- ベストアンサー率55% (146/265)
#1,2,3のmatsu_junです。 ご指摘いただくまで知りませんでしたが、シート上のDATE関数については、Excelのバグのようです。 どちらにしても1900年の1月1日を起点(Macの場合は1904年)としていることもありますし、「そんな昔のこと知らないよ」というスタンスなのかもしれませんね。ちなみにVBAではそのような問題は起きないと明言されています。 私自身も勉強になりました。大昔についてはDATE関数は使わないようにします。
お礼
参考URLありがとうございます。 大変よく分かりました。 VBA の WEEKDAY 関数では正しい値が返ります。 とも、書いてありますね。 #4さんの =IF(OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)<>0)),"うるう年","うるう年ではない") で判定するように書かれておりましたね。 #3の方法で判定しようと思います。
- shishishishi
- ベストアンサー率39% (362/921)
うるう年の定義は「4で割り切れて100で割り切れない年はうるう年である。または400で割り切れる年はうるう年である。」ということであるとして、A1セルに数値(年)を入れてあるとします。 Sub TEST01() 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 & "年はうるう年ではありません。" End If End Sub
お礼
if文の入れ子にしないとダメかと思っていたのですが If ((y Mod 4) = 0 And (y Mod 100) <> 0) Or (y Mod 400) = 0 Then の1文で聞けるんですね。 ありがとうございます
- matsu_jun
- ベストアンサー率55% (146/265)
#1のmatsu_junです。失礼しました。VBAでしたね。それならソース中に Day(CDate("March 1, " & CStr( 西暦 As Integer ) - 1) の式を入れ、その返り値が29か28かで判別できます。 要するにその年の3月1日の前の日が2月29日なのか28日なのかを見るということです。
- matsu_jun
- ベストアンサー率55% (146/265)
A1のセルに西暦を入力して、どこかのセルに以下の式を入力してください。 =IF(DAY(DATE(A1,3,1)-1)=29,"うるう年","うるう年でない")
お礼
=IF(DAY(DATE(A1,2,29))=29,"うるう年","うるう年でない") でも、同じかな。 これは、思いつきました。 が、1900年に対応できないんですよね (「うるう年」って出ちゃう)
お礼
この方法で、処理したいと思います
補足
#1だと1900年はうるう年って出ちゃうのに これだと1900年でもうるう年ではないって正しく判定されますね。 同じように3/1-1が29日か判定しているのに。 不思議ですがどうしてなんですか? VBAと関数は同じようで違う というマジックなのでしょうか。