エクセルで日付の計算をする機会はとても多いです。
日付を計算したい事例としては、年齢計算のような日付の差を求める『減算』と、数年後の日付を求めるような『加算』が考えられますね。
特に多いのは前者の『減算』ではないかと思います。
そこで、本記事では「エクセルで日付の差を計算する方法」について解説します。
具体的には、ワークシート上でDATEDIF関数を使用する方法と、VBA(マクロ)でDATEDIFF関数を使用する方法に関する内容になります。
ちなみに、VBAでの年齢計算については、別記事「エクセルで年齢計算する方法!コピペで使えるVBA3つの事例」で詳しく解説していますので、ぜひ併せてご参照ください。
この記事の内容
1.日付の差を計算する関数
こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。
まずは本記事で用いる関数について見てみましょう。
第2章で解説するのは、エクセルのワークシート上で使用するDATEDIF関数です。
第3章で解説するのは、VBA(マクロ)で使用するDATEDIFF関数です。
末尾がDIFとDIFFになっていて、Fの数が違うので要注意です。
引数の記述順なんかも違うので、その辺りを解説していきますよ!
2.ワークシート上でDATEDIF関数を用いる方法
2.1 DATEDIF関数の構文
ワークシート上で使用するのはFがひとつのDATEDIF関数です。
DATEDIF関数の構文は以下です。
DATEDIF(開始日,終了日,単位)
開始日、終了日、単位はいずれも必須です。
開始日、終了日は、”2021/2/18″のように文字列と同様に「”(ダブルクォーテーション)」で囲って入力するか”、44245のようにシリアル値で入力することができます。
シリアル値というのは、1900/1/1を「1」として、1日ごとに1だけカウントアップしていく考え方で、エクセルでの日付計算の基本となっています。
上記のように日付を直接入力するほか、日付を入力した別のセルを参照することも可能です。
また開始日より終了日を未来の日付にする(シリアル値を大きくする)必要があります。
開始日より終了日が過去(シリアル値が小さい)の場合、「#NUM!」のエラー値となるので要注意。
単位は、求めた差分をどのような単位で表示するのか決める引数です。
例えば”Y”のように「”(ダブルクォーテーション)」で囲って入力します。
単位の引数の種類とその説明は以下です。
- “Y”・・・求めた差分を年数として表示。「3年」や「20歳」などを求めたいときに使います。
- “M”・・・求めた差分を月数として表示。「3ヶ月」や「250ヶ月」などを求めたいときに使います。
- “D”・・・求めた差分を日数として表示。「90日」や「7628日」などを求めたいときに使います。
- “MD”・・・月単位で日付の差分を求め日数として表示。”2000/4/1″と”2021/2/18″の差分を求める場合、1日と18日の差分17日が返される。公式ヘルプでは使用を勧めないと明記されています(2.4節で触れます)。
- “YM”・・・年単位で日付の差分を求め月数として表示。”2000/4/1″と”2021/2/18″の差分を求める場合、4月と2月の差分10ヶ月が返される。
- “YD”・・・年単位で日付の差分を求め日数として表示。”2000/4/1″と”2021/2/18″の差分を求める場合、4月1日と2月18日の差分323日が返される。
2.2 DATEDIF関数での計算事例
実際にDATEDIF関数を使ってみましょう。
次の画像は、A1セルに2000年4月1日、A2セルに2021年2月18日を日付として入力しています。
C列のセルにDATEDIF関数を使った計算事例を用意しました。
C1、C2、C3セルは純粋に開始日から終了日までの日付の差分を取っています。
表示形式として、C1セルの”Y”では20(年)、C2セルの”M”では250(ヶ月)、C3セルの”D”では7628(日)という答えが返されました。
C14セルの”MD”では開始日の1日という値と終了日の18日という値の差分で、17(日)という答えが返されています。
C15セルの”YM”では開始日の4月という値と終了日の2月という値の差分で、10(ヶ月)という答えが返されています。
C16セルの”YD”では開始日の4月1日という値と終了日の2月18日という値の差分で、323(日)という答えが返されています。
個人的には、C1、C2、C3セルのような使い方をすることが高頻度なのかなと思います。
2.3 単位を同時に表示する方法
前節の計算事例では、答えが20というように数値だけ表示されていましたね。
20年とか20歳とか、単位を付けて表示するにはどうしたらよいでしょう?
それには「&(アンド)」を使った文字列の結合がオススメです。
DATEDIF関数の数式の前後に、「&(アンド)」を挟んで文字列を入力するのです。
結合する文字列は「”(ダブルクォーテーション)」で囲うことをお忘れなく。
2.4 引数MDでの問題
2.1節で単位の引数一覧を紹介した際に記載しましたが、”MD”という引数を用いる場合、値が負の値やゼロ、その他不正確な値を返すことがあるという報告があるようです。
どのようなケースでこの問題が発生するのか、私の環境では再現できませんでした。
公式ヘルプのDATEDIF関数の解説では、この問題の回避策も提案されていますが、こちらの回避策では完全に回避することは不可能と考えますので、ここでは紹介しないこととします。
3 VBAでDATEDIFF関数を用いる方法
3.1 DATEDIFF関数の構文
VBAで使用するのはFがふたつのDATEDIFF関数です。
DATEDIFF関数の基本的な構文は以下です。
DATEDIFF(単位,開始日,終了日)
ワークシート関数のDATEDIF関数とは単位の引数の位置が異なるので注意が必要です。
この3つの引数以外に、省略可能な引数が2つあるのですが、本記事では割愛します。
開始日や終了日に日付を設定する場合には「#(ナンバー、ハッシュ)」を前後につけて#4/1/2000#のように記述します(月/日/年の順になります)。
単位の引数の種類と説明は以下です。
- “yyyy”・・・年の差分を求め表示。2000/4/1と2021/2/18の場合、2000と2021の差分を求めるため、21(年)と返されます(開始日、終了日の月日は考えない)。ワークシート上のDATEDIF関数と考え方が異なるため要注意。
- “q”・・・四半期(クォーター)の差分を求め表示します。「83(四半期)」など。
- “m”・・・日付の差分を求め月数として表示。ワークシート上のDATEDIF関数で”M”とした場合と同じ考え方です。
- “y”・・・日付の差分を求め日数として表示。公式ヘルプでは年間通算日と呼称。ワークシート上のDATEDIF関数で”D”とした場合と同じ考え方です(ただし、下記”d”との違いが不明)。
- “d”・・・日付の差分を求め日数として表示。ワークシート上のDATEDIF関数で”D”とした場合と同じ考え方です(ただし、上記”y”との違いが不明)。
- “w”・・・日付の差分を求め週数として表示。下記”ww”と対になる引数。省略可能な引数(本記事では説明しない)が関係するため、今回は詳細説明を避けます。
- “ww”・・・日付の間隔にある日曜日の数を表示。上記”w”と対になる引数。省略可能な引数(本記事では説明しない)が関係するため、今回は詳細説明を避けます。
- “h”・・・日時の差分を求め時間数として表示。本記事では時刻を扱わないため、今回は詳細説明を避けます。
- “m”・・・日時の差分を求め分(minutes)数として表示。本記事では時刻を扱わないため、今回は詳細説明を避けます。
- “s”・・・日時の差分を求め秒数として表示。本記事では時刻を扱わないため、今回は詳細説明を避けます。
3.2 DATEDIFF関数を使ったVBAコード例
具体的なVBAコードの例を示します。
まずは引数”yyyy”とする例です。
A1セルの値を開始日str、A2セルの値を終了日finとして取得し、DATEDIFF関数でその差分を求め、メッセージボックスに表示させます。
結果が下の画像です。
ここで注意点ですが、ワークシート上のDATEDIF関数で同じ開始日、終了日でも20(年)という結果が得られましたが、その結果とは異なっています。
VBAのDATEDIFF関数は月日の差が考慮されないということです。
YEAR関数で開始日と終了日を求めてからその差分を計算しているのと同じですよね。
満年齢を求めるケースなどには向かないため注意してください。
VBAでの年齢計算については別記事「エクセルで年齢計算する方法!コピペで使えるVBA3つの事例」をご参照ください。
Sub 日付計算1()
Dim str, fin As Date
str = Cells(1, 1).Value '開始日
fin = Cells(2, 1).Value '終了日
MsgBox DateDiff("yyyy", str, fin) '年の差分を表示
End Sub
次に引数”m”とする例です。
A1セルの値を開始日str、A2セルの値を終了日finとして取得し、DATEDIFF関数でその差分を求め、メッセージボックスに表示させます。
結果が下の画像です。
ワークシート上でDATEDIF関数の引数を”M”とした場合と同じ結果が得られました。
Sub 日付計算2()
Dim str, fin As Date
str = Cells(1, 1).Value '開始日
fin = Cells(2, 1).Value '終了日
MsgBox DateDiff("m", str, fin) '日付の差分を月数表示
End Sub
次に引数”d”とする例です。
A1セルの値を開始日str、A2セルの値を終了日finとして取得し、DATEDIFF関数でその差分を求め、メッセージボックスに表示させます。
結果が下の画像です。
ワークシート上でDATEDIF関数の引数を”D”とした場合と同じ結果が得られました。
Sub 日付計算3()
Dim str, fin As Date
str = Cells(1, 1).Value '開始日
fin = Cells(2, 1).Value '終了日
MsgBox DateDiff("d", str, fin) '日付の差分を日数表示
End Sub
4.まとめ
本記事では「エクセルで日付の差を計算する方法」をターゲットに、具体的には、ワークシート上でDATEDIF関数を使用する方法と、VBA(マクロ)でDATEDIFF関数を使用する方法に関する内容を解説しましたが、いかがでしたか?
ワークシート上とVBAで似たような機能の関数ですが、表記や引数の記述、結果が微妙に異なることもわかりました。
求めたいものに合わせ、使い分けていきましょう。