Excel (エクセル) 学習室 / KENZO30


エクセル中級 20

中級・特別編トップへ

エクセル学習室 HOME

   中 級 20

Excelの基礎

  日付/時刻関数(DATEDIF関数)

 

日付/時刻関数(DATEDIF関数)

DATEDIF関数

DATEDIF関数は、指定した期間内の日数月数あるいは年数を求める関数です。大変便利な関数ですが、関数の貼り付けダイアログボックスには表示されません。その理由は、この関数がエクセルの古いバージョンの時代に、Lotus 1-2-3(表計算ソフト)の 関数と互換性を保つために作られたものであるからです。ダイアログボックスに表示されないのは、元々の仕様です。また、Excel2000のヘルプには記載されているものの、Excel2002以降では、ヘルプから消えています。徐々に捨てられつつあるのかもしれません。

DATEDIF関数は、ダイアログボックスに表示されないので、入力するにはキーボードから直接打ち込んで使います。なお、この関数はバグを抱えており取り扱いに注意が必要です。

書式で表すと、DATEDIF(開始日,終了日,単位)となります。
引数の開始日は、期間計算の開始日を指定し、終了日は期間計算の終了日を指定します。日付文字列を引数に直接指定する場合は、半角のダブル クォーテーション (") で囲み( "2004/04/15" など)ます。
単位は、求めたい期間の種類を定められた記号で指定します。以下の表のとおりです。

単位の種類

単位指定記号

意味・特徴

備考

"Y"

期間内の満年数をもとめる、端数は切り捨て

 

"M"

期間内の満月数を求める、端数は切り捨て

 

"D"

期間内の日数を求める

 

"MD"

一月に満たない日数を求める
(期間が2年3ヶ月と10日であれば、10日が求められる)

期間内に閏年がある場合などにバグあり

"YM"

一年に満たない月数を求める
(期間が2年3ヶ月と10日であれば、3ヶ月が求められる)

 

"YD"

一年に満たない日数を求める
(期間が2年3ヶ月と10日であれば、3ヶ月の日数と10日の合計が求められる、たとえば102日ように)

期間内に閏年がある場合バグあり

備考に記したように、"MD"と"YD"の計算にはバグがあります。(参照 → こぼれ話
指定記号は、大文字ではなく "y" "m" "d" のように小文字でもOKです。

 

使用例 1

 

左図は基本を理解するための例です。

(画像:Win XP&Excel2000)

単位指定記号の種類により、求められる値が異なることに注目してください。


さて、Excelの日付や時間計算は、これまで解説したとおり、1日を「1」としてシリアル値で計算されています。ということは、日数を計算するのであれば、単純に減算(引き算)で求められることになります。

 

左図は、引き算で日数計算を求めた例です。

(画像:Win XP&Excel2000)

上図のように、引き算させると表示形式は日付の表示形式が自動的に適用され、1901/1/8になります。これをシリアル値で表示できる標準の表示形式に戻すと、期間内の日数になります。
このように日数計算であれば、関数を使わなくても、単純な引き算で求めることができることを知っておきましょう。

 

使用例 2

"MD"と"YD"の計算にはバグがあります。これを確認してみましょう。

(1)MDのバグ


左図は、開始日が月末の例です。このようの場合正確に計算されない場合があります。

(画像:Win XP&Excel2000)

MDでの計算は、期間を計算し○年○ヶ月○日のうち、○日を求めるものです。図での開始日はすべて月末なので、答えは1日〜20日の日数でいいのですが、D3とD4は明らかに間違っています。
D3の場合、期間は「4ヶ月20日」であり、4ヵ月後の月末が2004年2月29日(閏年)のため計算違いをしていると考えられます。また、D4は期間内(1ヶ月20日)に閏年はないものの、1ヵ月後が2004年4月30日であり、開始日からの1ヵ月の日数が30日となるため計算違いをしているようです。
MDでの計算は、これ等の計算間違いを見ると月末日の特定がうまくできていないように思えます。

(2)YDのバグ


左図は、2/1〜3/1の同じ期間を計算させた例です。2004年は閏年のため計算違いをしています。

(画像:Win XP&Excel2000)

D3とD4は期間に閏年(2004年)が含まれているため計算違いをしています。共に1年後を特定できていないように思えます。D5は閏年を含まないため正しい答えが求められています。

さて、これ等MDとYDのバグは実験の結果知りえたものです。この他の計算でもバグが含まれている可能性があります。ですから、DATEDIF関数を使う場合、MDとYDの計算では使わないようにしましょう。うっかり使ってしまい、恥をかくことがあるかもしれません(笑)ここでわざわざバグ情報を掲載している理由もそこにあります。ただし、他の指定記号ではバグはないので安心して使ってください。

(3)バグの回避方法

MDやYDのバグは他の関数で簡単に回避する方法(代替方法)があるのでは?と考え、いろいろ試したみました。ところがこれが以外に面倒です。代替の計算式を作るとなると、いろいろなケースに対応して正しい答えが求められるものでなければなりません。特に閏年の場合、たとえば、1/29、1/30、1/31の1カ月後(1年後)は?などを求める必要があります。一応作ってはみたものの説明も面倒なので掲載することを止めます。その代わり、すでにこの計算式を作られている方のページがありますので紹介しておきます。このページを参考に、興味のある方は代替方法を考えてみてください。

HP名:Addin Box(管理人:天魔さん)
http://www.h3.dion.ne.jp/~sakatsu/index.htm

解説ページ(DATEDIFによる期間計算)
http://www.h3.dion.ne.jp/~sakatsu/ktfunc_ref0206.htm#DATEDIF

 

使用例 3

よく使われる年齢計算の例を紹介しておきます。

(画像:Win XP&Excel2000)

この例は、&を使い Y の計算と YM の計算を結合しています。MDはバグがあるので使っていません(笑)
例は基準日で計算していますが、常に今日現在で計算させることも可能です。すなはち、基準日の変わりに、NOW関数TODAY関数を入れます。

=DATEDIF(B4,TODAY(),"Y")&"歳 "&DATEDIF(B4,TODAY(),"YM")&"ヶ月"

となります。これで、ブックを開くたびに再計算され、常に今日の日付で年齢が求められます。NOW関数でも同じ結果になります。

 

 

   先頭へ戻る   

中級・特別編トップへ

Excel(エクセル)学習室 HOME


KENZO30 内容の無断転載は、禁止しています