• ベストアンサー

エクセルVBAで、うるう年の判定

エクセルVBAで、うるう年の判定をしなければなりません。 簡単に判定できる方法があったら、教えてください。

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

  • ベストアンサー
  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.3

さらに失礼しました。。。 Day(CDate("March 1, " & CStr( 西暦 As Integer )) - 1) が正解です

harukabcde
質問者

お礼

この方法で、処理したいと思います

harukabcde
質問者

補足

#1だと1900年はうるう年って出ちゃうのに これだと1900年でもうるう年ではないって正しく判定されますね。 同じように3/1-1が29日か判定しているのに。 不思議ですがどうしてなんですか? VBAと関数は同じようで違う というマジックなのでしょうか。

その他の回答 (4)

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.5

#1,2,3のmatsu_junです。 ご指摘いただくまで知りませんでしたが、シート上のDATE関数については、Excelのバグのようです。 どちらにしても1900年の1月1日を起点(Macの場合は1904年)としていることもありますし、「そんな昔のこと知らないよ」というスタンスなのかもしれませんね。ちなみにVBAではそのような問題は起きないと明言されています。 私自身も勉強になりました。大昔についてはDATE関数は使わないようにします。

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;ja;JP106339
harukabcde
質問者

お礼

参考URLありがとうございます。 大変よく分かりました。 VBA の WEEKDAY 関数では正しい値が返ります。 とも、書いてありますね。 #4さんの =IF(OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)<>0)),"うるう年","うるう年ではない") で判定するように書かれておりましたね。 #3の方法で判定しようと思います。

回答No.4

うるう年の定義は「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

harukabcde
質問者

お礼

if文の入れ子にしないとダメかと思っていたのですが If ((y Mod 4) = 0 And (y Mod 100) <> 0) Or (y Mod 400) = 0 Then の1文で聞けるんですね。 ありがとうございます

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.2

#1のmatsu_junです。失礼しました。VBAでしたね。それならソース中に Day(CDate("March 1, " & CStr( 西暦 As Integer ) - 1) の式を入れ、その返り値が29か28かで判別できます。 要するにその年の3月1日の前の日が2月29日なのか28日なのかを見るということです。

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.1

A1のセルに西暦を入力して、どこかのセルに以下の式を入力してください。 =IF(DAY(DATE(A1,3,1)-1)=29,"うるう年","うるう年でない")

harukabcde
質問者

お礼

=IF(DAY(DATE(A1,2,29))=29,"うるう年","うるう年でない") でも、同じかな。 これは、思いつきました。 が、1900年に対応できないんですよね (「うるう年」って出ちゃう)

関連するQ&A

専門家に質問してみよう