• 締切済み

VBAで年齢を計算する方法について

VBAで年齢の計算をしたいのですが、例えば Cells(2, 1) このときの値がH18.1.1 (2006/1/1) Cells(2, 2) このときの値がS10.2.1 (1935/2/1) これを、 DateDiff("yyyy", Cells(2, 2), (2, 1)) で処理を行うと年の計算しか行われず、70歳になるはずが、 71歳になってしまいます。 ExcelのDATEDIFでは70歳になりますが、VBAではどのようなコード を記述すればいいでしょうか? 宜しくお願い致します。

みんなの回答

noname#140971
noname#140971
回答No.6

例示にミスあり! X=Y+Format(CDATE("2004/04/29") - 1, "mm/dd") > Format("2007/02/28", "mm/dd") のミス!

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.5

およそ、全てのIF 文は論理式に置き換えて書くことが可能です。 [イミディエイト] ? Format(CDATE("2004/04/29") - 1, "mm/dd") > Format("2007/02/28", "mm/dd") True ? CINT(TRUE) -1 ? Not (Format(CDATE("2004/04/29") - 1, "mm/dd") > Format("2007/02/28", "mm/dd")) False ? CINT(False) 0 このように論理式の値は、真(True)と偽(False)です。 そして、その真と偽の数値表現は、-1と0です。 ですから、 IF Format(CDATE("2004/04/29") - 1, "mm/dd") > Format("2007/02/28", "mm/dd") THEN   X=Y-1 ELSE   X=Y-0 END あるいは、 IIF(Format(CDATE("2004/04/29") - 1, "mm/dd") > Format("2007/02/28", "mm/dd") ,X=Y-1,X=Y) と書かなくても、 X+Format(CDATE("2004/04/29") - 1, "mm/dd") > Format("2007/02/28", "mm/dd") と書けば、IF THEN ELSE文、IIF関数を書いたことになります。 なお、 上記のIF THEN ELSE文、IIF関数とでは、コンパイル後の実行コードはIF THEN ELSE文が小さいです。 ゆえに、最も、実行コードが肥大化し実行速度が遅くなるのが IIF関数です。 ですから、体裁は悪いですが、ネストが多くない場合は 関数に限ってはIF THEN ELSE文 がお勧めです。

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.4

? GetAge("2004/2/29", "2007/2/28") 3 ? GetAge("1935/2/1", "2006/1/1") 70 Public Function GetAge(ByVal Birthday As Date, ByVal Hiduke As Date) As Integer GetAge = DateDiff("yyyy", Birthday, Hiduke) + (Format(Birthday - 1, "mm/dd") > Format(Hiduke, "mm/dd")) End Function 私が用いている関数です。 問題は、2004/2/29生まれの方の閏年でない場合の考え方ではと思います。

bottle19ok
質問者

お礼

回答有難うございます。 まだ未熟でコードを読みきれていませんが、これはIIf関数のような処理を用いているものでしょうか?またお聞きして申し訳ないです。大変勉強になり助かります。有難うございます。

すると、全ての回答が全文表示されます。
  • x0000x
  • ベストアンサー率52% (67/127)
回答No.3

以下で計算できます。 誕生日当日に年齢加算する IIf(Format(誕生日, "mm/dd") > Format(日付, "mm/dd") _ , DateDiff("yyyy", 誕生日, 日付) - 1 _ , DateDiff("yyyy", 誕生日, 日付)) 誕生日前日に年齢加算する IIf(Format(誕生日- 1, "mm/dd") > Format(日付, "mm/dd") _ , DateDiff("yyyy", 誕生日- 1, 日付) - 1 _ , DateDiff("yyyy", 誕生日- 1, 日付))

bottle19ok
質問者

お礼

回答有難うございます。 コードをみたときなるほど、と声を出してしまいました。IIf関数はまだふれる機会がなかったので大変勉強になりました。有難うございました。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

Sub test01() MsgBox DateDiff("yyyy", Range("B2"), Range("A2")) End Sub を実行すると、71ですね。 http://msdn2.microsoft.com/ja-jp/library/b5xbyt6f(VS.80).aspx 特に http://www.kanaya440.com/contents/script/vbs/function/date/date_diff.html で DateDiff("yyyy", "2005/12/31", "2006/01/01") 1(1日後であっても、年が変われば"1"を返す) とあります。 1936.1.1で1 2006.1.1で71 で言ってることと矛盾しませんね。 だからDateDiffは年齢計算には簡単ではないということですね。 Sub test02() Cells(1, 1).Formula = "=datedif(B2,A2, ""Y"")" End Sub で逃げますか。 http://www.relief.jp/itnote/archives/000423.php

bottle19ok
質問者

お礼

回答有難うございます。 大変勉強になります。セルに直接式を入れる方法ですね。やってみました。これだと処理する値が(B2,A2, ""Y"")"だけならいいんですが、do loopなどで次回は(B3,A3, ""Y"")"と繰り返す場合が考えられませんでした。

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

DateDiffでやるなら Interval引数をmにして 月数を求めて 12で除算 Intで整数部のみを取得といった具合でしょう Int( DateDiff("m", Cells(2,2), Cells(2,1) ) / 12 ) といった具合で DateDiffの仕様ではIntervalに"yyyy"を指定した場合 たとえ1日でも翌年との比較では 1を返すとなっています DateDiffのヘルプの下の方に書いてありますよ

bottle19ok
質問者

お礼

回答有難うございます。 非常に勉強になりました。小数以下を切り捨てることは考えていたんですが、誕生日の一日前の値を処理する場合、多少の誤差がでてしまっていたので、それをどうすればいいか考えていました。

すると、全ての回答が全文表示されます。

関連するQ&A