• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:誕生日まであと何日か数えるプログラム)

誕生日までの日数を数えるプログラム

このQ&Aのポイント
  • 誕生日までの日数を数えるプログラムを作りたいです。
  • 年をまたいだ場合も考慮して、次の誕生日までの日数を計算する方法を知りたいです。
  • 具体的な方法やコードの書き方について教えてください。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.6

一つ、言い忘れました。 今回のようにデータ数一件だと何も気になりませんが、 これがデータ件数が数万件・数十万件と多くなると、 If~Else と Select Case との処理速度差が気になってきます。 分岐条件が2~3件だと、Ifの方が早く、 分岐条件が増えてくると、Selectの方が早く処理してくれるようです。 (いろんなところで比較されているお話ですので、  興味がおありなら「VBA 速度」などで検索なさってくださいませ。) 書きやすさ・読みやすさを取るか、処理速度を取るのか・・・ 今のところ、気にしなくても良い話ですが、 今後、大量データを扱う機会があれば、この辺も考えると面白いかもしれませんね。 余談、失礼しました。

sdf654we
質問者

お礼

ありがとうございます。

その他の回答 (5)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.5

考え方を整理する上でのアドバイスとして、参考までに少々。 質問文を見る限り、 「今年の誕生日が来ているか来ていないか」 この二択を想定されているようですね。 それであれば、流れとしては   If 今年の誕生日が来ている then     来ている時の処理   Else     来ていない時の処理   End If これで十分です。 「今年の誕生日が来ている」がTrueなら、来ている時の処理が走ります。 「今年の誕生日が来ていない」なら、「今年の誕生日が来ている」がFalse、 つまり、Elseの「来ていない時の処理」に回ってくれます。 なのでここに頑張ってElseIfを使う必要は特にありません。 (わかりやすいですけどね) さてさて、では日本語をどう置き換えていきます。 DateSerial(年,月,日)で「年月日」を返してくれますので、 「今年の誕生日」は   DateSerial(Year(Date),月,日) と表現できます。月・日には任意の数字をいれてくださいませ。 Year・Dateに関しては解説不要ですね。 「今年の誕生日(指定日)が来ている」という事は、 「今年の誕生日が、今日より前(小さい)」という事ですから、   If 今日の誕生日 < Date then と書けます。 以上の二つがわかれば、あとは組み合わせていきましょう。 つまり、 Sub test() Dim NextBirthday As Date, ThisBirthday As Date   ThisBirthday = DateSerial(Year(Date), 12, 11)   If ThisBirthday < Date Then     NextBirthday = DateAdd("yyyy", 1, ThisBirthday)   Else     NextBirthday = ThisBirthday   End If   Debug.Print "誕生日まであと" & NextBirthday - Date & "日です。" End Sub 誕生日をいちいち指定するのが面倒ですので、 変数ThisBirthdayを用意し、今年の誕生日を代入しています。 DateAdd関数は別途お調べいただきたいのですが、 ここでは「1年後の誕生日」を計算するのに使っています。 ここまでが、質問に対する直接の回答となるでしょう。 ここから先は趣味のお話です。 なんせ趣味や好みの問題ですから、私はあえてIfだけで頑張ってみてます。 何を付け加えたか、どうなったか、は読み取ってみてくださいね。 Sub test() Dim NextBirthday As Date, ThisBirthday As Date     ThisBirthday = DateSerial(Year(Date), 12, 16)     If ThisBirthday = Date Then         Debug.Print "今日が誕生日です!!"     Else         If ThisBirthday < Date Then             NextBirthday = DateAdd("yyyy", 1, ThisBirthday)         Else             NextBirthday = ThisBirthday         End If           Debug.Print "誕生日まであと" & NextBirthday - Date & "日です。"     End If End Sub

sdf654we
質問者

お礼

ありがとうございます。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

例えば次のようにします。 Sub Test() Dim NextBirthday As Date If Date > DateSerial(Year(Date), 12, 16) Then NextBirthday = DateSerial(Year(Date) + 1, 12, 16) Else NextBirthday = DateSerial(Year(Date), 12, 16) End If Debug.Print "誕生日まであと" & NextBirthday - Date; "日です。" End Sub

sdf654we
質問者

お礼

ありがとうございます。

回答No.3

Option Explicit Sub NextBirthDays() Dim NextBirthday As Date Dim もう今年の誕生日が来てるなら As Boolean Dim まだ今年の誕生日が来てないのなら As Boolean もう今年の誕生日が来てるなら = (Month(Date) & Day(Date) >= "1216") まだ今年の誕生日が来てないのなら = Not (もう今年の誕生日が来てるなら) If (もう今年の誕生日が来てるなら) Then NextBirthday = Year(Date) + 1 & "/12/16" Else 'If (まだ今年の誕生日が来てないのなら) Then NextBirthday = Year(Date) & "/12/16" End If Debug.Print "誕生日まであと" & NextBirthday - Date; "日です。" End Sub

sdf654we
質問者

お礼

ありがとうございます。

  • emsuja
  • ベストアンサー率50% (1065/2116)
回答No.2

とりあえず VBA で作ってみましたが・・・ Sub test() Dim NextBirthday As Date Dim BirthDay As Date BirthDay = "1956/12/16" If Format(Date, "MMDD") > Format(BirthDay, "MMDD") Then 'もう今年の誕生日が来てるなら ' 来年の誕生日を計算します NextBirthday = DateAdd("YYYY", Year(Date) - Year(BirthDay) + 1, BirthDay) Else ' まだ今年の誕生日が来てないのなら ' 今年の誕生日を計算します NextBirthday = DateAdd("YYYY", Year(Date) - Year(BirthDay), BirthDay) End If Debug.Print "誕生日まであと" & NextBirthday - Date; "日です。" 後、個人的な好みもあるますが IF ElseIf EndIf は使わないほうがいいですよ、条件が複雑になるとプログラムが読みにくくなります 使いたいなら Select Case を使いましょう こんな感じかな Sub test2() Dim NextBirthday As Date Dim BirthDay As Date BirthDay = "1956/12/20" Select Case Format(Date, "MMDD") Case Is > Format(BirthDay, "MMDD") 'もう今年の誕生日が来てるなら ' 来年の誕生日を計算します NextBirthday = DateAdd("YYYY", Year(Date) - Year(BirthDay) + 1, BirthDay) Case Is < Format(BirthDay, "MMDD") 'もう今年の誕生日が来てるなら ' 来年の誕生日を計算します NextBirthday = DateAdd("YYYY", Year(Date) - Year(BirthDay), BirthDay) Case Else NextBirthday = 0 End Select If NextBirthday <> 0 Then Debug.Print "誕生日まであと" & NextBirthday - Date; "日です。" Else Debug.Print "お誕生日おめでとう" End If End Sub

sdf654we
質問者

お礼

ありがとうございます。

  • don9don9
  • ベストアンサー率47% (299/624)
回答No.1

Excelのワークシート関数のみで可能です。 例えばA1セルに生年月日が入っているとすると =DATE(YEAR(TODAY()),MONTH(A1),DAY(A1)) で「今年の誕生日」が算出できます。 同様に =DATE(YEAR(TODAY())+1,MONTH(A1),DAY(A1)) で「来年の誕生日」が算出できます。 ※2/29生まれの場合、うるう年以外は3/1になります。 今年の誕生日と今日の日付を比較して 「今年の誕生日<今日の日付の場合は来年の誕生日、そうでなければ今年の誕生日から今日の日付を引く」 という式で日数が計算できます。 =IF(DATE(YEAR(TODAY()),MONTH(A1),DAY(A1))<TODAY(),DATE(YEAR(TODAY())+1,MONTH(A1),DAY(A1)),DATE(YEAR(TODAY()),MONTH(A1),DAY(A1)))-TODAY() ※「今日が誕生日」の場合「0」を返します。 ※セルの書式は「標準」か「数値」にしておいてください。

sdf654we
質問者

お礼

ありがとうございます。

関連するQ&A