Excelで日付の差を計算したいときはないでしょうか。
けど、そんな中で悩むことは、
・日数・月数・年数で計算方法を使い分けられない
・営業日(土日を除いた日数)の数え方がわからない
ですよね。
今回はそんなお悩みを解決する
についてまとめます!
完成イメージ
日付の差を求めたいとき、ただ引き算するだけでは年数や月数をうまく出せません。
今回は
・日数は引き算とDAYS関数、年数・月数はDATEDIF関数、営業日はNETWORKDAYS関数
を使い分けて、開始日から終了日までの差を一覧で出せるようにします。

上の画像が完成形です。開始日と終了日の差が、日数・営業日・年数・月数・年月日で一度に出せるようになります。
なお、日付が逆になってもエラーを出さない書き方や、数式をまとめて入れるVBA、うまくいかないときの対処法(トラブルシュート)もあわせてご紹介します。
早速実装して試してみましょう!
もくじ
STEP1. 元データを用意する
まずは日付の差を計算したい表を用意します。
A列が案件名、B列が開始日、C列が終了日です。
D列(日数)からH列(期間)までは、これから数式で求めるので空のままにしておきます。
日付は「2024/1/15」のようにスラッシュで区切って入力しましょう。
「2024.1.15」のように別の記号で入力すると、文字列として扱われて計算できないことがあります。

下の表をコピーして、Excelのシートに貼り付けるとそのまま試せます。
| 案件名 | 開始日 | 終了日 | 日数 | 営業日 | 年数 | 月数 | 期間 |
|---|---|---|---|---|---|---|---|
| 業務システム刷新 | 2022/4/1 | 2024/3/31 | |||||
| 新製品キャンペーン | 2024/2/1 | 2024/2/29 | |||||
| 社内研修 | 2024/4/8 | 2024/4/19 | |||||
| 採用面接 | 2024/5/7 | 2024/6/28 | |||||
| 展示会準備 | 2023/7/3 | 2024/9/30 | |||||
| 基幹DB移行 | 2023/4/3 | 2025/3/31 | |||||
| 海外出張 | 2024/9/9 | 2024/9/20 | |||||
| 決算対応 | 2024/3/1 | 2024/5/31 | |||||
| Webサイト改修 | 2025/1/6 | 2025/2/28 | |||||
| 設備点検 | 2024/11/11 | 2024/11/15 |
※ 数式で求める列は空にしています。すでに値が入っている列はそのまま残して試せます。
STEP2. 日数の差を出す(引き算とDAYS関数)
日数の差は、終了日から開始日を引くだけです。
日数を出したい D2セル に =DAYS(C2,B2) と入力します。
この数式は =C2-B2 と書いても同じ結果になります。
入力したら、フィルハンドルでD11セルまで下にコピーしましょう。
数式をコピーすると、参照する行が自動でずれていきます。
カンタンですね。

数式はどのセルに入れる?
セルを選んで、数式バーに直接入力するだけです。
実際の入力画面がこちらです。
DAYS関数は (終了日, 開始日) の順に指定します。
順番を逆にすると結果がマイナスになるので注意しましょう。
引き算の =C2-B2 も、同じ日数の差を求める数式です。

STEP3. 営業日を出す(NETWORKDAYS関数)
作業日数を知りたいときは、土日を除いた営業日で数えると便利です。
E2セルに =NETWORKDAYS(B2,C2) と入力し、E11セルまでコピーします。
NETWORKDAYS関数は、開始日と終了日を両端とも含めて数えます。
土日は自動で除外されます。
祝日も外したいときは、第3引数に祝日のセル範囲を指定します。

STEP4. 年数・月数の差を出す(DATEDIF関数)
年数や月数の差は、DATEDIF関数を使います。
まずF2セルに =DATEDIF(B2,C2,”Y”) と入力し、F11セルまでコピーします。
これは「満何年」を求める数式です。
次にG2セルに =DATEDIF(B2,C2,”M”) と入力し、G11セルまでコピーします。
こちらは「満何か月」になります。
引き算では出せない差も、DATEDIF関数なら一発で求められます。

DATEDIF関数の入力画面
DATEDIF関数も数式バーから入力します。
入力中は関数の引数のヒントが表示されます。
第3引数には単位を文字で指定します。
“Y” は年、“M” は月、“D” は日です。
組み合わせの “YM” は「年を除いた月」を返します。

STEP5. 「何年何か月何日」で表示する
年数と月数を組み合わせると、「1年2ヶ月27日」のような表示もできます。
H2セルに次の数式を入力し、H11セルまでコピーしましょう。
=DATEDIF(B2,C2,"Y")&"年"&DATEDIF(B2,C2,"YM")&"ヶ月"&DATEDIF(B2,C2,"MD")&"日"
DATEDIF関数を3つつなげて、単位ごとの差を文字で組み合わせています。
& は文字をつなげる記号です。
この書き方にしておくと、年齢や勤続年数の表示にもそのまま使えます。

STEP6. 差がマイナスになるときの対処
終了日が開始日より前だと、引き算の結果はマイナスになります。
下の例では、引き算のC14セルが -10 になっています。
これを避けたいときは IF関数 で条件をつけます。
D14セルに =IF(B14<A14,””,B14-A14) と入力すると、日付が逆のときは空欄になります。
次の行のように日付の順番が正しいときだけ、数字が表示されます。

日付の差を出す関数の使い分け
どの関数を使えばよいか、目的ごとにまとめました。
例は、開始日 2023/4/1・終了日 2024/5/10 の場合です。
| 求めたいもの | 使う数式 | 例の結果 |
|---|---|---|
| 日数(開始日は含まない) | =C2-B2 または =DAYS(C2,B2) | 405 |
| 営業日(土日を除く・両端を含む) | =NETWORKDAYS(B2,C2) | 290 |
| 満年数 | =DATEDIF(B2,C2,”Y”) | 1 |
| 満月数 | =DATEDIF(B2,C2,”M”) | 13 |
| 年の端数の月 | =DATEDIF(B2,C2,”YM”) | 1 |
| 月の端数の日 | =DATEDIF(B2,C2,”MD”) | 9 |
| 年月日でまとめて表示 | Y・YM・MDをつなげる | 1年1ヶ月9日 |
日数の差は 引き算(DAYS関数)、年数・月数は DATEDIF関数、営業日は NETWORKDAYS関数 が基本です。
迷ったら「日数は引き算、単位をつけるなら DATEDIF」と覚えましょう。
VBAで差の列をまとめて入力する
案件が何十件もあるときは、VBAで数式をまとめて入れるとラクです。
Alt+F11 でVBAエディターを開き、標準モジュールに次を貼り付けて実行します。
Sub SetDateDiff()
Dim lastRow As Long, i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
Cells(i, 4).Formula = "=DAYS(C" & i & ",B" & i & ")"
Cells(i, 5).Formula = "=NETWORKDAYS(B" & i & ",C" & i & ")"
Cells(i, 6).Formula = "=DATEDIF(B" & i & ",C" & i & "," & """Y""" & ")"
Next i
End Sub
単位の “Y” や “M” は、必ずダブルクォーテーション(”)で囲んでくださいね。
引き算で出せない年数・月数も、これなら一発です。
うまくいかないときの対処法(トラブルシュート)
実際に試すと、思ったように動かないこともあるかもしれません。
よくあるつまずきと対処法をまとめました。
| 症状 | 原因 | 対処 |
|---|---|---|
| #VALUE! エラーになる | 日付が文字列として入力されている | 「2024/1/15」の形で入力し直す/=DATEVALUE() で変換する |
| 結果が日付で表示される | 結果セルの書式が日付になっている | 結果セルの表示形式を標準に戻す |
| 結果がマイナスになる | 終了日が開始日より前になっている | =IF(B2<A2,””,B2-A2) で空欄にする |
| DATEDIFが #NUM! になる | 開始日が終了日より後になっている | 日付の前後を確認し、IF関数で回避する |
| DAYSの結果が1日足りない | DAYSは開始日を含めない | 開始日も数えるなら =DAYS(C2,B2)+1 にする |
| 営業日が日数より多い | NETWORKDAYSは両端を含めて数える | 仕様どおり。日数と比べるときは数え方に注意する |
関数の説明
今回使う3つの関数の概要です。
DAYS関数(デイズ)
| 書式 | =DAYS(終了日, 開始日) |
|---|---|
| できること | 2つの日付の間の日数を求めます。 |
| 戻り値 | 日数(数値) |
| こんなときに | 開始日から終了日までの日数を出したいとき。 |
| 注意 | 引数は(終了日, 開始日)の順です。逆にするとマイナスになります。開始日は数えません。 |
=DAYS(C2,B2)
DATEDIF関数(デイトディフ)
| 書式 | =DATEDIF(開始日, 終了日, 単位) |
|---|---|
| できること | 2つの日付の差を、年・月・日の単位で求めます。 |
| 単位 | “Y”=満年数/”M”=満月数/”D”=日数/”YM”=年の端数の月/”MD”=月の端数の日 |
| こんなときに | 年齢・勤続年数・「何年何か月」の期間を出したいとき。 |
| 注意 | 関数の一覧に表示されない関数です。開始日が終了日より後だと #NUM! になります。 |
=DATEDIF(B2,C2,"Y")
NETWORKDAYS関数(ネットワークデイズ)
| 書式 | =NETWORKDAYS(開始日, 終了日, [祝日]) |
|---|---|
| できること | 土日を除いた稼働日(営業日)を数えます。 |
| 戻り値 | 営業日数(数値) |
| こんなときに | 作業日数や納期の営業日を数えたいとき。 |
| 注意 | 開始日と終了日を両端とも含めて数えます。祝日は第3引数に範囲で指定します。 |
=NETWORKDAYS(B2,C2)
完成
開始日と終了日の差が、日数・営業日・年数・月数・年月日ですべて出せました。
思ったとおりに動きましたか?
日数は引き算(DAYS関数)、年数と月数はDATEDIF関数、営業日はNETWORKDAYS関数と使い分ければ、日付の差はもう迷いません。
一度作っておけば、日付を書き換えるだけで結果が自動で更新されます。

さいごに
いかがでしょうか。
今回は、
についてまとめました。
まずは今回のサンプル表で、ぜひ一度試してみてください。
日付の差を出す関数を使い分けられると、期間の管理やスケジュール作りがぐっとラクになりますよ。
また、他にも便利なExcelの時短テクニックがありますので、よろしければご参照頂ければと思います。














コメントを残す