引越しでおトクなインターネット回線は?>>

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

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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル関数で誕生日までの残りの日数を表示する方法は?

エクセル関数で「=date()」で当日の年月日を表示できますが、次の誕生日までの残りの日数を自動表示させるには、どうしたらいいでしょうか?例えば、誕生日が2008年の6月14日だとして、教えていただければ幸いです。よろしくお願いいたします。

Aベストアンサー

A1の数式バーに 2008/6/14
B1の数式バーに =TODAY()
C1の数式バーに =A1-B1 C1セルの書式設定の表示形式で標準か数値を選択。
なんか自動的ではなさそうですが、どうでしょうか?

Qあと何日or何日目?を計算する方法

課題でy年m月はd日あるという形のプログラミングがあったのですが、それを発展させてクリスマスまであと何日とか、生まれてから今日で何日たったというプログラムを作りたいと思いました。
似たような例がhttp://www.asahi-net.or.jp/~KC2H-MSM/excel/excel004.htmにありましたが、これをC言語で記述するとどのようになるのでしょうか。

AとBにあたる部分を西暦y年m月d日という形で入力して(Bは今日の日付でなくてもいいことにして)、Cにあたる部分を出力させるというのは分かりますが、先のプログラム(何月が何日あるというやつ)を使って、yを増やしていってdを足し続けることを何回も繰り返すのは無駄が多い気がするのでもっと有益な方法があるはずだと思って質問しています。

Aベストアンサー

Cなら標準ライブラリに日付関数があります。

#include <time.h>
/* 2001年1月1日から2004年4月28日までの日数をnissuに求める
** 1970年1月1日0時0分0秒~2038年1月19日3時14分7秒の範囲で使用
** この範囲外だとmktimeがエラーになるので使えない事に注意 */
 struct tm t1,t2;
 int nissu;
 t1.tm_year = 2001 - 1900; /* 2001年 */
 t1.tm_mon = 1; /* 1月 */
 t1.tm_mday = 1; /* 1日 */
 t1.tm_hour = 0;
 t1.tm_min = 0;
 t1.tm_sec = 0;
 t2.tm_year = 2004 - 1900; /* 2004年 */
 t2.tm_mon = 4; /* 4月 */
 t2.tm_mday = 28; /* 28日 */
 t2.tm_hour = 0;
 t2.tm_min = 0;
 t2.tm_sec = 0;
 nissu = (int)(difftime(mktime(&t2),mktime(&t1)) / 86400.0) + 1;

上記例は「過去の日付から今日まで何日」の場合です。

「クリスマスまであと何日」の場合は、クリスマス当日は「あと0日」にする必要があるので、最後の行を
 nissu = (int)(difftime(mktime(&t2),mktime(&t1)) / 86400.0);
と、1を足すのを削ります。

Cなら標準ライブラリに日付関数があります。

#include <time.h>
/* 2001年1月1日から2004年4月28日までの日数をnissuに求める
** 1970年1月1日0時0分0秒~2038年1月19日3時14分7秒の範囲で使用
** この範囲外だとmktimeがエラーになるので使えない事に注意 */
 struct tm t1,t2;
 int nissu;
 t1.tm_year = 2001 - 1900; /* 2001年 */
 t1.tm_mon = 1; /* 1月 */
 t1.tm_mday = 1; /* 1日 */
 t1.tm_hour = 0;
 t1.tm_min = 0;
 t1.tm_sec = 0;
 t2.tm_year = 2004 - 1900; /* 2004年 */...続きを読む

QExcel 誕生日までの日数を表示したい

たとえば、A1に誕生年月日が入力されていて、B1にTODAY()関数を使って誕生日まであと何日かを表示させる場合どうすればよいでしょうか?
ほかに簡単にできる場合はそちらもご紹介ください。

Aベストアンサー

今年の誕生日が過ぎている場合、翌年の誕生日までの日数カウントなら
B1=DATE(YEAR(TODAY())+(TEXT(A1,"MMDD")<TEXT(TODAY(),"MMDD")),MONTH(A1),DAY(A1))-TODAY()

今年の誕生日が過ぎている場合、マイナス表示でいいなら
B1=A1-TODAY()
※書式が勝手に日付形式になるので標準に再設定してください。

Qエクセルで、あと何日あるかを表示させる関数

いつもお世話になります。

例えば、

Aのセルに『2006/1/12』という今日の日付データを入力します。

同じくBのセルに『2006/3/27』という未来の日付データを入力します。

Bの日付の「未来」まで、あと何日あるのか?という日にちをCのセルに表示させるには、

どのような関数を入力すれば良いのでしょうか?

お詳しい方、何卒ご教授くださいませ。

Aベストアンサー

=B1-A1
でできますよ。当日をカウントする場合は+1する必要がありますが...
あと式の設定後に表示形式を数値に変更してください。

今日の日付は
=TODAY()
で求められるので毎回入力する手間をはぶくなら
=B1-TODAY()
でも同じ結果になります。


人気Q&Aランキング

おすすめ情報