• ベストアンサー

エクセル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

  • VBAで、うるう年の計算

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

  • 閏年自動判定

    プログラム初心者です。 VbScript(ASP)で以下のプログラムを書く場合の書き方を教えてください。 閏年を自動的に判定し、以下の処理をしたいです。 前年同月の集計結果を表示したいです。 その判別は以下の通りです。 (1)もし当年が閏年で無く、前年が閏年の場合  2/28日に集計すると前年分は2/29(までの)のものを表示 (2)もし当年が閏年の場合、2/29に集計すると  前年分は2/28(までの)のものを集計 宜しくお願いします。

  • C++でうるう年判定のプログラムを作りたいのですが

    C++でうるう年判定のプログラムが作りたいのですが・・・ #include <iostream> using namespace std; int main() { return 0; } 問題のこの下の部分の内容が書けません 変数をa % 4という計算と%100と%400をしなければいけないことはわかっています。この式の入れ方がわかりませんif文だとは思っているのですが 表示は「<<a<<"はうるう年です";」と「<<a<<"はうるう年ではありません";」という判定を表示したいです。

  • 西暦を入力して、うるう年かどうか判定せよ!という問題です。

    西暦を入力して、うるう年かどうか判定せよ。ただしうるう年の条件は4で割り切れる、100で割り切れない、400で割り切れる。という問題です!!誰か教えて下さい!お願いします~。

  • シェルスクリプトでうるう年判定

    宜しくお願いします。 シェルスクリプトでうるう年かどうか判定するスクリプトを作りたいです。 プロンプトで西暦を入力したらその年がうるう年かそうでないか○×表示をさせたいです。 手を貸してください。 なにぶん素人でどこからどう手をつけていったらいいのか分かりません。。 ご教授お願い致します。

  • 2008は閏年であることを判定する式を作成するにあたって

    2008年は閏年であるということを判定する式を 作成しなければならないのですが、 なかなか良いアイデアが浮かばず質問に至りました。 ※閏年とは次の条件を満たす年のことをいいます。 400の倍数である。または100の倍数ではなく、かつ4の倍数の年をいう。 この問題を関数OR,IF,MOD,ANDなどを利用して判定する式を作成しなければならないのですが、納得のいく解答ができませんでした。数学や情報処理の得意な方、是非チカラを貸してください。お願いします。

  • Javaでboolean型を使ってのうるう年の判定

    自分の練習で、JavaでC言語のgmtime関数を作成しています。それで、できるだけソースをきれいに書こうと思い、if文で繰り返すのではなく、boolean型を使ってうるう年の判定をする部分を作りたいのですが、どう書くか思いつきません。どのように書けばよいか教えていただけませんか?

  • Excel VBAで文字列の日付を判定

    Excel VBAで文字列の日付を判定 文字列の書式で”19900101”などとセルに入力されている場合に実際に存在する日付かを判定する方法はありますでしょうか? たとえば、19990132などと入力されている場合はエラーにしたいのです。ISDATEを使うのかともおもいましたがうまくいきません。 よろしくお願いします。

  • うるう年判定のアルゴリズム

    javaでうるう年判定のプログラムを作成しています。 プログラム自体はサーバにアップするときに実行結果が正しいかどうかテストされます。 仕様としては、 1.時間に関するAPIなどは一切使わずに完全に自作 2.入力される値はLong型の"秒"数(APIで提供されているのはミリ秒ですが) 3.60537895631062456(Long値) などの入力値に対して、年/月/日 (曜日) 時:分:秒 yday=元旦からの経過日数 を出力 最初は以下の関数を使用してループをかけていたのですが、仕様3の入力値に対して50秒近くかかってしまい、上手くいきませんでした。 public static int isLeap(int year){ if(year%4==0 && (year%100!=0 || year%400==0)) return 1; return 0; } 問題点はループ回数が多いことで、作る時点で分かってはいたのですが、ここまで遅くなるとは思っても見ませんでした。 これを使わない方法としては、一回だけうるう年(=n)を見つけ、その後は「(n+4)との比較+100で割り切れず400で割り切れる場合は別」という処理を行うことによって、処理時間を30秒付近にまで短縮することができたのですが、どうも10~15秒以内で終わらせなければテストにパスすることができないようです。 なんとか色々考えてはみたものの、上手いアルゴリズムは思いつきませんでした。 うるう年を処理するための"高速な"アルゴリズムはないのでしょうか。 お知恵を貸してください。よろしくお願いします。

  • VBAでブック保護非保護を判定するには?

    エクセルVBAでブックが保護されているのかどうかを判定するにはどう書けばいいのでしょうか? If ActiveWorkbook.Protect Then ではだめでした。 また、シート保護の判定方法も教えてください。

専門家に質問してみよう