誕生日まであと何日か数えるプログラムを作りたいのですが、わかりません。
Sub test()
Dim NextBirthday As Date
If もう今年の誕生日が来てるなら Then
NextBirthday = Year(Date) + 1 & "/12/16"
elseif まだ今年の誕生日が来てないのなら
NextBirthday = Year(Date) & "/12/16"
End If
Debug.Print "誕生日まであと" & NextBirthday - Date; "日です。"
End Sub
みたいなことがしたいです。
まだ今年の誕生日が来てないならバージョンともう今年の誕生日が来てしまったら
次の誕生日まであと何日かバージョンを作りたいのですがどうすればいいのかわかりません
No.6ベストアンサー
- 回答日時:
一つ、言い忘れました。
今回のようにデータ数一件だと何も気になりませんが、
これがデータ件数が数万件・数十万件と多くなると、
If~Else と Select Case との処理速度差が気になってきます。
分岐条件が2~3件だと、Ifの方が早く、
分岐条件が増えてくると、Selectの方が早く処理してくれるようです。
(いろんなところで比較されているお話ですので、
興味がおありなら「VBA 速度」などで検索なさってくださいませ。)
書きやすさ・読みやすさを取るか、処理速度を取るのか・・・
今のところ、気にしなくても良い話ですが、
今後、大量データを扱う機会があれば、この辺も考えると面白いかもしれませんね。
余談、失礼しました。
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
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
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
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
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」を返します。
※セルの書式は「標準」か「数値」にしておいてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- 留学・ワーキングホリデー 至急。意見ください。好きな人が留学に行ってまだ1ヶ月も経ってないんですけど、好きな人の誕生日がありま 2 2023/08/21 02:27
- その他(恋愛相談) 同じ会社に彼氏がいます。 彼は53歳で私は29歳です。 今週の金曜日、私は誕生日を迎えるのですが、毎 2 2023/08/22 21:04
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
- その他(悩み相談・人生相談) 僕の友達で5年ぐらい年に数回しか遊ばなかなったんですけど、いつも誕生日が来ると誕プレ買って欲しいだの 3 2023/07/24 19:48
- 誕生日・記念日・お祝い 彼氏に誕生日をスルーされました。 私は自分から来月誕生日、今月誕生日だとか言う方ではありません。 彼 1 2022/12/16 09:20
- 恋愛・人間関係トーク 相談です。 来月、職場同期女性の誕生日があるのですが、LINEで「今日誕生日だっけ?誕生日おめでとう 1 2022/12/27 01:27
- カップル・彼氏・彼女 だれか励ましてください 5 2023/04/22 14:09
- 誕生日・記念日・お祝い 男性の方へ!誕生日にもらって嬉しいもの教えてほしいです! 私は今大学2年目で、休暇が終わったら、遅め 3 2022/09/13 12:43
- ルーター・ネットワーク機器 【緊急】あつ森の時間操作について。 1 2022/08/04 22:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
近々息子の嫁が里帰り出産しま...
-
お嬢様の男性バージョンって何...
-
母の日のプレゼントを辞退され...
-
せっかくの誕生日だったのに・...
-
古希を前にした妻に男ができて
-
成人した息子が、手に負えない...
-
人生で最悪の誕生日
-
19歳の誕生日って 19thですか? ...
-
家族の誕生日を祝うのは義務で...
-
エホバの証人の家族との付き合い方
-
夫の誕生日を祝う気持ちになれない
-
自分から周りに「今日、誕生日...
-
男の人に聞きたい!前妻を思い...
-
同じ誕生月の兄弟、姉妹がいる...
-
誕生日、彼から何もなかった
-
「お年を召された」は何歳から?
-
孫が 稚児行列に参加するので...
-
20歳を「はたち」と言わない理由
-
興味ない人に『誕生日おめでと...
-
兄弟どちらかの誕生日のとき。。。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
近々息子の嫁が里帰り出産しま...
-
高校の入学式に父親は出席しま...
-
「お年を召された」は何歳から?
-
お嬢様の男性バージョンって何...
-
19歳の誕生日って 19thですか? ...
-
古希を前にした妻に男ができて
-
「年配」とは何歳以上?
-
お宮参りに参加するつもりの義...
-
20歳を「はたち」と言わない理由
-
誕生日が変えられたのは、いつ...
-
人生で最悪の誕生日
-
孫が 稚児行列に参加するので...
-
嫌いな人から誕生日おめでとうL...
-
せっかくの誕生日だったのに・...
-
男の人に聞きたい!前妻を思い...
-
同じ誕生月の兄弟、姉妹がいる...
-
成人した息子が、手に負えない...
-
誕生日、彼から何もなかった
-
夫の誕生日を祝う気持ちになれない
-
親の命日と自分の誕生日が同じ...
おすすめ情報