VBAコードで自分の年齢を取得する方法

このQ&Aのポイント
  • VBAコードを使用して、現在の年齢を取得する方法について知りたいです。
  • 自分の誕生日を設定し、VBAコードを使って現在の年齢を計算する方法について教えてください。
  • 作成したVBAコードで現在の年齢を取得しようとした結果、正しい年齢が取得できませんでした。解決方法を教えてください。
回答を見る
  • ベストアンサー

今の自分の年齢を取得するvbaコードが知りたい

今の自分の年齢を取得するvbaコードが知りたいのですが Sub test1() Dim dtm誕生日 As Date dtm誕生日 = #7/1/1986# MsgBox Format(Date - dtm誕生日, "yyyy/mm/dd") MsgBox DateDiff("yyyy", dtm誕生日, Date) End Sub を作ってみたのですが 違うのが返りました。 DateDiff("yyyy", dtm誕生日, Date) は、30が返ってしまいます。 今日の時点ではまだ29歳なのですが そういう場合どうすればいいでしょうか? 「現在は29歳です」と返したいのですが、 どのようにすればいいでしょうか?

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

  • ベストアンサー
回答No.4

こんにちは。 DateDiff()関数に関するVBAのヘルプには、 > 12 月 31 日とその次の年の 1 月 1 日を比較すると、DateDiff 関数の年 ("yyyy") は、1 日後であっても、1 を返します。 とあります。 「"年"の"差"」は求められても、「経過年数(例えば年齢)を求める」ことは出来ません。 VBAでということなら、例えば、こんな感じのが簡単かな、と。   年月日をyyyymmddと連続した十進数として看做した文字列値を基準にして   (Variant型のキャストを経て)   数値として引き算をして、10000で割った商を求めます。 ' ' /// Sub ReW9110770c() Dim dtBD As Date Dim dtCD As Date   dtBD = "1986/7/1"   dtCD = Date()   MsgBox (Format(dtCD, "yyyymmdd") - Format(dtBD, "yyyymmdd")) \ 10000 End Sub ' ' /// 一応、「経過年数(例えば年齢)を求める」ということでしたら、 閏年ぐらいは動作確認・検証しておいた方が良いでしょうから、   dtBD = "2012/2/29"   dtCD = "2014/2/28" と   dtBD = "2012/2/29"   dtCD = "2014/3/1" のようなサンプルで試してみて下さい。 「年齢を求める簡単な関数」 というのが、ご質問でお求めの答、だと理解していますが、 ひとつの関数だけで簡単に求めることはできないでしょう。 こちらで提示するものは、関数2つと演算子の組合わせになっています。 いちいち書くのが面倒に感じるようでしたら、 ご自身で専用の関数(Function)を書いて、 アドインにでも保存しておくと良いでしょう。 余談に近い話ですが、今日的な意味付けとして、 「VBAだけを使用して」 「Date型で宣言した変数に日付値を格納する場合は」 日付リテラル(#7/1/1986#等)を使う必要は無いです。 むしろ、  データ型を指定できない言語や  Variant型で(暗黙にせよ明示したにせよ)宣言した変数に  関数を用いることなく日付型の値を設定したい場合に 例外的に用いるのが日付リテラル、といった感じなのではないでしょうか。   dtBD = DateValue("1986/7/1") のように関数を用いることが推奨されていますが、 「... でななければならない」という根拠は薄いと思っています。 Variant型の扱いや型のキャストを十分に理解していればいいことです。 「日付リテラルとか型宣言文字とか使うべきではない」という流派の方も 多くみられるようになってきました。 何故「使っちゃいけない」とまで言うのか、という理由についても、 根拠はあるらしいのですが、私にはよく解りません。 ただ、現存する旧いテキストでは、日付リテラルを奨めることが多いようですし、 今でも入門書で書かれていることもあるようですから、 「知っておいた方がいいこと」であることは間違いないです。 でも、もしも「日付リテラルを使うべし」と覚えてらっしゃる様でしたら、 それはそれで違うので、一応申し添えておきます。 以上です。 ※ここで扱っている日付については、専ら日付値であって  時刻値を無視した日付です。  これは元質問の例題に副ってお応えしたものです。

vwnniofoikj
質問者

お礼

回答ありがとうございました。

その他の回答 (4)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.5

sub macro1()  dim dx as date  dx = #7/1/1986#  msgbox evaluate("datedif(""" & dx & """,""" & date & """, ""y"")") end sub みたいな。

vwnniofoikj
質問者

お礼

回答ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

VBらしく、VBの関数DateDif(fが2つ)を使ってみた。 場合分けが2つになってしまうが。 家族などの誕生日でやってみて、正しいか、確認して使ってください。 Sub test01() t = Date '操作したきょうの日付 't = #10/31/2016# ’テスト用 't = #10/30/2016# 't = #9/1/2016# MsgBox t '--誕生日 ’実際は他のデータ項目か、Inputbox関数などで取り込むこと(下記注) 'bt = #10/15/1980# bt = #1/11/1987# MsgBox bt '--以上テスト用日付 If t >= DateSerial(Year(t), Month(bt), Day(bt)) Then n = DateDiff("yyyy", bt, t) Else n = DateDiff("yyyy", bt, t) - 1 End If MsgBox n '満年齢 End Sub DateDiff関数は >年が異なる場合、1秒だけの差でも1年差と返す(月や日,時,分でも同様) http://note.phyllo.net/?eid=1106128 なので上記のようにしてみた。 -- >「インプットボックスに日付以外入力できないようにしたい」 http://park11.wakwak.com/~miko/Excel_Note/13-01_msgbox.htm

vwnniofoikj
質問者

お礼

回答ありがとうございました。

回答No.2

私が用いているGrtAge()は次のようです。 Public Function GetAge(ByVal dteBirthday As Date, ByVal dteToday As Date) As Integer   Dim intAge   As Integer   Dim lngValue_1 As Long   Dim lngValue_2 As Long      dteToday = DateAdd("d", 1, dteToday)   lngValue_1 = Format(dteToday, "yyyy") * 10000 + Format(dteToday, "mm") * 100 + Format(dteToday, "dd")   lngValue_2 = Format(dteBirthday, "yyyy") * 10000 + Format(dteBirthday, "mm") * 100 + Format(dteBirthday, "dd")   intAge = Fix((lngValue_1 - lngValue_2) / 10000)   GetAge = intAge End Function Public Function GetAge(ByVal dteBirthday As Date, ByVal dteToday As Date) As Integer   If Format(dteBirthday, "MMDD") >= Format(dteToday, "MMDD") Then     GetAge = DateDiff("YYYY", dteBirthday, dteToday) - 1   Else     GetAge = DateDiff("YYYY", dteBirthday, dteToday)   End If End Function それは、添付図のように29歳と計算します。なお、イミディエイトウインドウでは ? Format(#7/1/1986#, "yyyy/mm/dd") 1986/07/01 となりますので当然のことです。 【原因は】月日を比較していないことかと・・・・。

vwnniofoikj
質問者

お礼

回答ありがとうございました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 次の様なVBAにされると良いと思います。 Sub test() Const dtm誕生日 = "1986/1/7" MsgBox DateDiff("yyyy", dtm誕生日, Date) + (DateValue(Year(Date) & Mid(dtm誕生日, 5)) - Date > 0) End Sub >DateDiff("yyyy", dtm誕生日, Date) >は、30が返ってしまいます。 > 今日の時点ではまだ29歳なのですが  違います。  誕生日として設定されている 7/1/1986 は1986年1月7日なのですから、1月13日現在においては30回目の誕生日は既に過ぎていますので、30が返るのが正しい事になります。

vwnniofoikj
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • 該当の日付時点で該当者が何歳かを取得したいのですが

    Sub Macro1() Dim dtm日付 As Date Dim dtm誕生日 As Date Dim i As Integer dtm日付 = #10/1/2015# dtm誕生日 = #7/1/1986# i = dtm日付 - dtm誕生日 MsgBox "Aさんは" & dtm日付 & "の時点では、" & i & "才です。" End Sub こんな感じでVBAコードを作ってみたのですが 肝心の何歳かを算出する方法がわかりません。

  • VBA dateの戻り値

    ExcelVBA初心者です。 下記プログラムを組んでいるのですがMyDateの戻り値が常に -1された数字になってしまいます。 たとえば、25を入力したら24になる。これはなぜなのでしょうか? また、0だと30になってしまいます。 Sub hani() Dim MyDate As Date MyDate = Application.InputBox("報告する日を入力してください", "報告日", Format(Now, "dd")) If Format(MyDate, "dd") > 0 And Format(MyDate, "dd") > 32 Then MsgBox Format(MyDate, "dd") MsgBox "範囲内" Else MsgBox Format(MyDate, "dd") MsgBox "範囲外" End If End Sub

  • 20060224をyyyy年mm月dd日にしたい

    こんばんは。教えてください。。 Sub テスト() Dim mystr As String mystr = "20060224" mystr = Format(mystr, "yyyy年mm月dd日") MsgBox mystr End Sub これを実行するとオーバーフローします。 結果としては、「2006年02月24日」と表示させたいです。 mystr = Format(CDate(mystr), "yyyy年mm月dd日") にすると、型が一致しませんになります。 ご回答よろしくお願いします。

  • VBA表作成 再

    頭がこんがらがってしまい途中でしめさせていただきました。改めて整理がついたので質問をしたいと思います。 VBAを使い表を作成しています。 まず入力フォームというブックがあり、そこに入力した日付より1ヶ月分のデータを日付、曜日などを別ブックにある予めできている表に貼り付けていきます。表には31日分の表(罫線あり)が出来ています。 ☆一つ目 Datediff("d",wSh1.Range("C6"),Dateadd("m",1,wSh1range("C6"))) を使いその月の日数を求め表からいらない分の表を削除。 例えば)2/1を入力した際に31日分もいらないため2つ削除。 削除したら入力した日付から1ヶ月間の日付と曜日を貼り付ける。 表は   L ・・・ 4 日付・・・ 5 曜日・・・ ・ ・ ・ のようになっています。 ここまでにいく前に次のような処理をしましたのでソースを載せます。 Private Sub CommandButton1_Click() Dim wStr As String Dim wDate As String Dim wDate2 As String Dim Exitflg As Boolean Dim i As Integer Dim wVal As Variant Dim wSh1 As Worksheet Dim wSh2 As Worksheet Dim iStartRow As Long Dim iEndRow As Long Dim wDay As Long Set wSh1 = Workbooks("入力フォーム.xls").Worksheets("日付セット") If wSh1.Range("C6") = "" Then '値が入っているか MsgBox "日付を入力してください!" Exit Sub End If wDate = Replace(wSh1.Cells(6, "C"), "西暦", "") wDate = Format(wSh1.Cells(6, "C"), "yyyy/mm/dd") If Date < wDate Then MsgBox "未来の日付入力はできません!" Exit Sub End If If DateAdd("yyyy", -1, Date) > wDate Then MsgBox "日付を今日から1年以内で設定してください!" Exit Sub End If わかりづらいかもしれませんがよろしくお願いします。

  • ExcelVBAで年齢計算

    VBAで年齢計算をしたいのですが、「型が一致しない」と怒られます。 A列に誕生日が入っており、B列に年齢が入るようにしたいです。 Sub old() For i = 2 To Cells(2, 1).End(xlDown).Row Dim t As Date Dim b As Date t = Date b = Cells(i, 1) y = DateDiff(b, t, "y") Cells(i, 2) = y Next End Sub どこかおかしいところはありますでしょうか? 教えてください!

  • 今日より何日経過しているかを取得するには?

    Sub Macro() Dim dtm日付 As Date dtm日付 = #1/1/2015# If dtm日付 Then MsgBox "何日前です" End If End Sub のように、dtm日付が今日より何日前かを取得する方法はありますか?

  • このコードの解説詳しくお願いします!!

    高校一年生です!いま情報の授業でVBAをやっているのですが、 Sub 例1456() Dim w As Integer Dim week As Variant week = Array("日", "月", "火", "水", "木", "金", "土") hia = InputBox("「年/月/日」を入力して下さい") If IsDate(hia) Then hi = CDate(hia) hi = Format(hi, "yyyy""年""mm""月""dd""日""") Else ↑のコードの意味がわかりません!構文の解説や、用語の意味などくわしく解説していただくとありがたいです。{()の中身の意味など} お願いします!! MsgBox "「年/月/日」を入力して下さい" Exit Sub End If w = WeekDay(hi) MsgBox hi & " は " & week(w - 1) & "曜日です" End Sub ↑のコードの意味がわかりません!’hi'ってなんですか! 構文の解説や、用語の意味などくわしく解説していただくとありがたいです。{()の中身の意味など} お願いします!!

  • Access2000にてお寺の管理dbを作っています。御法事の回忌を抽

    Access2000にてお寺の管理dbを作っています。御法事の回忌を抽出したくテーブルに没年月日、回忌のフィールドを作りクエリの回忌のフィールドに回忌:IIF(Format([没年月日],"mm/dd")>Format(Date(),"mm/dd"),DateDiff("yyyy",[没年月日],Date())-1,DateDiff("yyyy",[没年月日],Date()))と回答をいただき 回忌:IIF(Format([没年月日],"mm/dd")<Format(Date(),"mm/dd"),DateDiff("yyyy",[没年月日],Date())+1,DateDiff("yyyy",[没年月日],Date())) >を< -1を+1 にしてできたのですが。 Date()ですと今年の御命日が来るまでは50回忌のひとでも49回忌になってしまいます。 御命日が来なくても(御法事の申し込みは命日の数日、数か月前が多いので)今年の回忌を出させるにはどうしたらいいのでしょうか?

  • 「何年と何日前」と表示したい

    Sub test1() Dim dtm日付 As Date Dim i As Integer dtm日付 = #1/1/2010# i = Date - dtm日付 MsgBox i & "日前" End Sub これで、何日前かは取得できたのですが 何年と何日形式にするにはどうすればいいでしょうか

  • Access2007での年齢計算

    ある時点での満年齢を表示するため下記の[BEGDATE]に誕生日yyyy/mm/ddを書き[ENDDATE]にある時点のyyyy/mm/ddを書きテキストボックスのコントロールソースに下記の式を書きました。 =DateDiff("yyyy",[BEGDATE],[ENDDATE]) しかしこれだと年齢は出ますが誕生日を過ぎたある時点でも年齢か一才増えません。 どのように書けばよいのか教えてください。

専門家に質問してみよう