重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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ではどのようなコード
を記述すればいいでしょうか?
宜しくお願い致します。

A 回答 (6件)

例示にミスあり!



X=Y+Format(CDATE("2004/04/29") - 1, "mm/dd") > Format("2007/02/28", "mm/dd")

のミス!
    • good
    • 0

およそ、全ての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文 がお勧めです。
    • good
    • 1

? 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生まれの方の閏年でない場合の考え方ではと思います。
    • good
    • 1
この回答へのお礼

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

お礼日時:2007/08/21 00:06

以下で計算できます。



誕生日当日に年齢加算する
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, 日付))
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/21 00:02

Sub test01()


MsgBox DateDiff("yyyy", Range("B2"), Range("A2"))
End Sub
を実行すると、71ですね。
http://msdn2.microsoft.com/ja-jp/library/b5xbyt6 …
特に
http://www.kanaya440.com/contents/script/vbs/fun …

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

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

お礼日時:2007/08/20 23:59

DateDiffでやるなら Interval引数をmにして 月数を求めて 12で除算


Intで整数部のみを取得といった具合でしょう

Int( DateDiff("m", Cells(2,2), Cells(2,1) ) / 12 )
といった具合で

DateDiffの仕様ではIntervalに"yyyy"を指定した場合
たとえ1日でも翌年との比較では 1を返すとなっています
DateDiffのヘルプの下の方に書いてありますよ
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/20 23:55

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