プロが教えるわが家の防犯対策術!

誕生日まであと何日か数えるプログラムを作りたいのですが、わかりません。

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

みたいなことがしたいです。

まだ今年の誕生日が来てないならバージョンともう今年の誕生日が来てしまったら
次の誕生日まであと何日かバージョンを作りたいのですがどうすればいいのかわかりません

A 回答 (6件)

一つ、言い忘れました。


今回のようにデータ数一件だと何も気になりませんが、
これがデータ件数が数万件・数十万件と多くなると、
If~Else と Select Case との処理速度差が気になってきます。

分岐条件が2~3件だと、Ifの方が早く、
分岐条件が増えてくると、Selectの方が早く処理してくれるようです。
(いろんなところで比較されているお話ですので、
 興味がおありなら「VBA 速度」などで検索なさってくださいませ。)

書きやすさ・読みやすさを取るか、処理速度を取るのか・・・
今のところ、気にしなくても良い話ですが、
今後、大量データを扱う機会があれば、この辺も考えると面白いかもしれませんね。


余談、失礼しました。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2012/12/22 01:03

考え方を整理する上でのアドバイスとして、参考までに少々。



質問文を見る限り、
「今年の誕生日が来ているか来ていないか」
この二択を想定されているようですね。

それであれば、流れとしては
  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
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2012/12/22 01:03

例えば次のようにします。



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
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2012/12/22 01:03

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
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2012/12/22 01:03

とりあえず 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
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2012/12/22 01:03

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」を返します。
※セルの書式は「標準」か「数値」にしておいてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2012/12/22 01:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!