- ベストアンサー
誕生日までの日数を数えるプログラム
- 誕生日までの日数を数えるプログラムを作りたいです。
- 年をまたいだ場合も考慮して、次の誕生日までの日数を計算する方法を知りたいです。
- 具体的な方法やコードの書き方について教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
一つ、言い忘れました。 今回のようにデータ数一件だと何も気になりませんが、 これがデータ件数が数万件・数十万件と多くなると、 If~Else と Select Case との処理速度差が気になってきます。 分岐条件が2~3件だと、Ifの方が早く、 分岐条件が増えてくると、Selectの方が早く処理してくれるようです。 (いろんなところで比較されているお話ですので、 興味がおありなら「VBA 速度」などで検索なさってくださいませ。) 書きやすさ・読みやすさを取るか、処理速度を取るのか・・・ 今のところ、気にしなくても良い話ですが、 今後、大量データを扱う機会があれば、この辺も考えると面白いかもしれませんね。 余談、失礼しました。
その他の回答 (5)
- tsubuyuki
- ベストアンサー率45% (699/1545)
考え方を整理する上でのアドバイスとして、参考までに少々。 質問文を見る限り、 「今年の誕生日が来ているか来ていないか」 この二択を想定されているようですね。 それであれば、流れとしては 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
お礼
ありがとうございます。
- KURUMITO
- ベストアンサー率42% (1835/4283)
例えば次のようにします。 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
お礼
ありがとうございます。
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
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
お礼
ありがとうございます。
- emsuja
- ベストアンサー率50% (1065/2116)
とりあえず 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
お礼
ありがとうございます。
- don9don9
- ベストアンサー率47% (299/624)
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」を返します。 ※セルの書式は「標準」か「数値」にしておいてください。
お礼
ありがとうございます。
お礼
ありがとうございます。