スプレッドシートで日付計算をする方法|年齢・日数・営業日・月末の4シーン別に使う関数を整理

スポンサーリンク

「社員名簿の年齢を自動で計算したい」「契約終了まであと何営業日か知りたい」。スプレッドシートで日付を扱おうとすると、関数がたくさん出てきて、どれを使えばいいか迷いますよね。

実は、日付計算で使う関数は「年齢」「日数」「営業日」「月末」の4つのシーンに分けて整理できます。シーンごとに最適な関数を覚えれば、迷うことはなくなりますよ。

この記事では、スプレッドシートで日付計算をする方法を4シーン別にまとめました。早見表とフローチャートで、自分が今使うべき関数がひと目でわかる構成にしています。

  1. スプレッドシート日付計算の関数早見表【結論から】
    1. 選択フローチャート
    2. スプレッドシートで日付を扱う前に
  2. 【シーン1】年齢を自動計算する関数の使い分け
    1. DATEDIF関数で年齢を求める基本
    2. スプレッドシートのDATEDIFは公式サポートされている
    3. YEARFRAC関数で「小数の年齢」を求める
    4. TODAY関数の揮発性に注意
  3. 【シーン2】日数を計算する関数の使い分け
    1. 日付の引き算でシンプルに日数を求める
    2. DAYS関数で日数を数える
    3. DATEDIF関数の”D”単位も使える
  4. 【シーン3】営業日を計算する関数の使い分け
    1. NETWORKDAYS関数で営業日を数える
    2. 祝日リストの作り方
    3. WORKDAY関数で「N営業日後」を求める
    4. NETWORKDAYS.INTL / WORKDAY.INTLで休日パターンをカスタマイズ
    5. WEEKDAY関数でデバッグする
  5. 【シーン4】月末・月初を取得する関数の使い分け
    1. EOMONTH関数で月末を一発取得
    2. 翌月末・翌々月末の支払期日を計算
    3. 月初日を求める2つの方法
    4. EDATE関数で「Nヶ月後の同日」を求める
  6. 日付計算でよくあるトラブルと対処法
    1. トラブル1: 日付なのに引き算ができない
    2. トラブル2: 結果に「1899/12/30」や「0」が出る
    3. トラブル3: NETWORKDAYSの結果が想定と1日違う
    4. トラブル4: TODAYの値が翌日になっている
    5. トラブル5: #NUM!エラーが出る
  7. よくある質問
    1. Q. ExcelのDATEDIFがスプレッドシートでも使えますか?
    2. Q. 年齢を「○歳○ヶ月」と表示したい場合は?
    3. Q. 祝日リストはどこから取得すればよいですか?
    4. Q. 日曜だけ休みのお店の営業日を出したいです
    5. Q. ExcelとスプレッドシートでDAYS関数の引数順は同じ?
    6. Q. TODAYで出した日付を毎日更新せずに固定したいです
  8. まとめ|シーン別に関数を選べば日付計算で迷わない

スプレッドシート日付計算の関数早見表【結論から】

まずは結論です。「どのシーンでどの関数を使うか」を一覧表にまとめました。

やりたいことおすすめ関数数式の例
年齢を求めるDATEDIF関数=DATEDIF(A1,TODAY(),"Y")
2つの日付の日数差日付の引き算 / DAYS関数=B1-A1
営業日を数えるNETWORKDAYS関数=NETWORKDAYS(A1,B1)
N営業日後の日付WORKDAY関数=WORKDAY(A1,5)
月末日を求めるEOMONTH関数=EOMONTH(A1,0)
Nヶ月後の同日EDATE関数=EDATE(A1,3)
期間の年数・月数DATEDIF関数=DATEDIF(A1,B1,"M")
休日パターンをカスタムNETWORKDAYS.INTL関数=NETWORKDAYS.INTL(A1,B1,11)

迷ったらこの表を見ると、使うべき関数がすぐにわかりますよ。

選択フローチャート

どの関数を使うか迷ったら、次の3ステップで判断してください。

  1. 何を計算したい?
  • 期間の長さ(年・月・日)→ ステップ2へ
  • 特定の日付(月末・Nヶ月後など)→ ステップ3へ
  1. 期間の単位は?
  • 年齢などの満年数 → DATEDIF(”Y”単位)
  • 月数 → DATEDIF(”M”単位)
  • 暦の日数 → 日付の引き算 または DAYS
  • 営業日数 → NETWORKDAYS / NETWORKDAYS.INTL
  1. 求めたい日付は?
  • 月末日 → EOMONTH
  • Nヶ月後の同日 → EDATE
  • N営業日後 → WORKDAY / WORKDAY.INTL

迷ったらまずDATEDIFと引き算

「期間を知りたい」場面の8割は、DATEDIFか引き算で解決します。「特定の日付を知りたい」場面の大半は、EOMONTHかEDATEで足りますよ。この4関数を押さえれば、日付計算で困ることは大幅に減ります。

スプレッドシートで日付を扱う前に

スプレッドシートは日付を内部的に「シリアル値」という数値で管理しています。1899年12月30日を0として、そこからの経過日数が日付のシリアル値です。

たとえば2026年1月1日は「46023」という数値です。普段は日付として表示されますが、計算するときは数値同士の演算になります。

このしくみのおかげで、日付の引き算がそのまま日数差として使えます。ここからは各シーンの詳しい使い方を順番に解説していきますね。

【シーン1】年齢を自動計算する関数の使い分け

人事・総務の業務でよく出てくるのが年齢計算です。スプレッドシートの社員名簿や顧客リストで「生年月日から今日時点の年齢を出したい」場面ですね。

DATEDIF関数で年齢を求める基本

スプレッドシートで年齢計算をするときの定番がDATEDIF関数です。

01 data sample table
=DATEDIF(生年月日, TODAY(), "Y")

第1引数に生年月日のセル、第2引数にTODAY関数、第3引数に "Y" を指定します。これで「満年齢」が数値で返ります。

たとえばセルA2に 1990/4/15 と入力されている場合、数式は次のとおりです。

!_images/spreadsheet-date-calculation-guide/02_formula_datedif-basic.png

=DATEDIF(A2, TODAY(), "Y")

2026年5月22日時点では 36 と表示されます(誕生日を過ぎているため)。

03 result datedif basic

DATEDIF関数の第3引数(単位)を変えると、年数以外の期間も求められます。

単位意味用途の例
“Y”期間の年数年齢計算
“M”期間の月数在籍月数の計算
“D”期間の日数経過日数の計算
“YM”年数を無視した月数「○年○ヶ月」の月部分
“MD”年数と月数を無視した日数「○年○ヶ月○日」の日部分
“YD”年数を無視した日数誕生日まで日数の計算

「○年○ヶ月」と表示したい場合は、次のように組み合わせます。

=DATEDIF(A2,TODAY(),"Y")&"年"&DATEDIF(A2,TODAY(),"YM")&"ヶ月"

A2が 1990/4/15 なら「36年1ヶ月」のように返ります。勤続年数の表示などにも使えますよ。

スプレッドシートのDATEDIFは公式サポートされている

Excelで使う方は気になる「DATEDIFは非公式」問題ですが、スプレッドシートではDATEDIFが公式ヘルプに記載されています。安心して使えますよ。

スプレッドシート版DATEDIFの位置づけ

Google公式ドキュメントにも構文と例が掲載されていて、Excelよりも「正式扱い」になっています。オートコンプリートにも普通に表示されます。

ただし、注意点が1つあります。"MD" 単位(年と月を無視した日数)はうるう年絡みで結果がずれる場合があります。重要な計算で日単位の端数まで正確に出したいときは、後述するYEAR・MONTH・DAY関数の組み合わせで再現確認するのが安全です。

YEARFRAC関数で「小数の年齢」を求める

「勤続年数を17.5年のように小数で表示したい」というケースにはYEARFRAC関数が便利です。

=YEARFRAC(開始日, 終了日, [基準])

YEARFRACは期間の年数を小数で返します(YEARFRACは「期間が1年に占める割合」を意味する関数です)。

=YEARFRAC(A2, TODAY(), 1)

A2が 1990/4/15 の場合、36.10... のような小数が返ります。第3引数の 1 は「実日数ベース」の意味で、うるう年もきちんと考慮してくれます。

満年齢として整数で扱いたい場合は、INT関数(小数点以下を切り捨てる関数)で囲むとよいです。

=INT(YEARFRAC(A2, TODAY(), 1))
方法数式の長さ精度おすすめ度
DATEDIF短い高い(”Y”単位)最もおすすめ
YEARFRAC+INT短いやや低い(うるう年で1日ずれる場合あり)簡易計算向き

迷ったら、年齢計算はDATEDIFを選んでおけば間違いありません。

TODAY関数の揮発性に注意

TODAY関数は「今日の日付」を返してくれて便利ですが、1つだけ覚えておきたい性質があります。ファイルを開くたびや編集のたびに自動で再計算されるんです。

日付を固定したいときは Ctrl + ;

「契約日」のように後で変わってほしくない日付には、TODAY()ではなく Ctrl + ;(Macは ⌘ + ;)のショートカットで今日の日付を直接入力すると、固定値として保存できますよ。

【シーン2】日数を計算する関数の使い分け

「プロジェクトの残り日数」や「契約期間の日数」など、2つの日付の間の日数を数えたい場面を見ていきましょう。スプレッドシートでは3つの方法があります。

日付の引き算でシンプルに日数を求める

もっとも簡単な方法は、日付どうしの引き算です。

=B2-A2

スプレッドシートの日付はシリアル値で管理されているので、引き算するだけで日数差が求まります。

たとえばA2に 2026/4/1、B2に 2026/9/30 と入力して引き算すると、182 と表示されます。

結果が日付で表示されてしまったら

結果が 182 ではなく日付(1900/6/30 など)で表示される場合は、セルの表示形式を「数値」または「自動」に変更してください。引き算の元セルが「日付」書式だと、結果セルも自動で同じ書式になることがあるんです。

DAYS関数で日数を数える

DAYS関数は日数を求める専用の関数です。

=DAYS(終了日, 開始日)

引き算と同じ結果が得られます。注意したいのは引数の順序で、第1引数が「終了日」、第2引数が「開始日」になります。引き算とは逆の順番ですね。

=DAYS(B2, A2)

DAYS関数のメリットは、結果が自動で数値書式になることです。表示形式を気にせず使えるので、引き算より少し楽ですよ。

DATEDIF関数の”D”単位も使える

DATEDIF関数の第3引数を "D" にすると、日数差を取得できます。

=DATEDIF(A2, B2, "D")

引き算やDAYSと同じ結果になりますが、DATEDIFには「開始日 > 終了日でエラーになる」という性質があります。逆順を許したくない場面ではかえって便利です。

方法数式メリット
引き算=B2-A2シンプル。計算が速い
DAYS関数=DAYS(B2,A2)結果が自動で数値書式
DATEDIF(“D”)=DATEDIF(A2,B2,"D")月数・年数も同じ関数で扱える

実務ではシンプルな引き算で十分なケースがほとんどです。複数の単位(日・月・年)を切り替えたい場面ではDATEDIFを使ってみてください。

【シーン3】営業日を計算する関数の使い分け

「土日祝を除いた稼働日だけを数えたい」「今日から5営業日後の日付が知りたい」。プロジェクト管理や納期計算でよく出てくるシーンですね。

NETWORKDAYS関数で営業日を数える

開始日から終了日までの営業日数を求めるなら、NETWORKDAYS関数です。

!_images/spreadsheet-date-calculation-guide/04_data_workdays-table.png

=NETWORKDAYS(開始日, 終了日, [祝日])

第3引数の祝日リストは省略可能です。省略すると土日だけが休みとして計算されます。

!_images/spreadsheet-date-calculation-guide/05_formula_networkdays-basic.png

=NETWORKDAYS(A2, B2)

A2が 2026/4/1、B2が 2026/4/30 の場合、その範囲の平日数(土日除く)が返ります。

!_images/spreadsheet-date-calculation-guide/06_result_networkdays-basic.png

祝日も除外したい場合は、別のセル範囲に祝日リストを用意します。たとえばD2:D15に祝日を入力したら、こう書けます。

=NETWORKDAYS(A2, B2, D2:D15)

両端日を含む点に注意

NETWORKDAYS関数は開始日と終了日の両方を含めてカウントします。「4月1日から4月3日」は3日(月・火・水)です。引き算の B2-A2 は2日になる点が違うので注意してください。

祝日リストの作り方

実務でよく使う日本の祝日リストは、内閣府の公式CSV(「国民の祝日について」https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html )から取得できます。

別シートに以下のような表を作っておくと再利用しやすいですよ。

日付祝日名
2026/1/1元日
2026/1/12成人の日
2026/2/11建国記念の日

このシートのA列を参照範囲として使えば、毎年祝日表を更新するだけで全シートに反映されます。

WORKDAY関数で「N営業日後」を求める

「今日から5営業日後はいつか」を計算したいなら、WORKDAY関数です。

=WORKDAY(開始日, 営業日数, [祝日])

第2引数に進めたい営業日数を入れると、土日(と祝日)を自動でスキップして日付を返してくれます。

=WORKDAY(TODAY(), 5)

今日が2026年5月22日(金)の場合、5営業日後は2026年5月29日(金)になります。土日を飛ばして計算されますね。

第3引数で祝日リストを渡せば、祝日もスキップできます。

=WORKDAY(A2, 10, D2:D15)

NETWORKDAYS.INTL / WORKDAY.INTLで休日パターンをカスタマイズ

「うちのお店は日曜のみ休み」「水曜と日曜が定休」のように、土日以外の休日パターンに対応したい場合はNETWORKDAYS.INTL関数WORKDAY.INTL関数を使います。

=NETWORKDAYS.INTL(開始日, 終了日, [週末], [祝日])
=WORKDAY.INTL(開始日, 営業日数, [週末], [祝日])

第3引数の週末コードでよく使うパターンはこちらです。

週末コード休日使いどころ
1(既定)土曜・日曜一般企業
2日曜・月曜月曜定休の店舗
3月曜・火曜火曜定休の店舗
11日曜のみ土曜営業の小売・飲食
12月曜のみ月曜のみ休業の施設
17土曜のみ日曜営業のサービス業

たとえば日曜のみ休みの飲食店で営業日を数える場合はこうなります。

=NETWORKDAYS.INTL(A2, B2, 11)

7桁の文字列で曜日を細かく指定

第3引数には "0010001" のような7桁の文字列も指定できます。月・火・水・木・金・土・日の順で、休日は1・出勤は0です。「水曜と日曜だけ休み」なら "0010001" ですね。番号で表現できないシフトでも自由に組めますよ。

WEEKDAY関数でデバッグする

「営業日計算の結果が想定と違う」というときは、WEEKDAY関数(指定した日付の曜日を1〜7の数値で返す関数)で曜日を確認するとデバッグがはかどります。

=WEEKDAY(A2)

1(日)〜7(土)の数値が返るので、土日や祝日の判定がうまくいっているか確認できます。

【シーン4】月末・月初を取得する関数の使い分け

経理・請求業務で活躍するのが月末日の計算です。「今月の最終日はいつか」「翌月末の支払期日を出したい」「月初日を取得したい」場面を見ていきましょう。

EOMONTH関数で月末を一発取得

EOMONTH関数は、指定した月数後(または前)の月末日を返してくれます。

07 data eomonth table
=EOMONTH(開始日, 月数)

第2引数の月数で「何ヶ月後の月末か」を指定します。

数式意味結果の例(A2が2026/4/15の場合)
=EOMONTH(A2, 0)当月末2026/4/30
=EOMONTH(A2, 1)翌月末2026/5/31
=EOMONTH(A2, -1)前月末2026/3/31
=EOMONTH(A2, 2)翌々月末2026/6/30
=EOMONTH(A2, 12)1年後の月末2027/4/30
08 result eomonth variations

「月数 = 0」で当月末、「-1」で前月末、「1」で翌月末になります。覚えやすいですね。

翌月末・翌々月末の支払期日を計算

請求書の支払条件が「翌月末払い」「翌々月末払い」の場合、EOMONTH関数で期日を自動計算できます。

翌月末払いの場合

=EOMONTH(A2, 1)

A2に請求日を入れておけば、自動で翌月末の日付が返ります。

翌々月末払いの場合

=EOMONTH(A2, 2)

請求書テンプレートに組み込んでおくと、支払期日の入力ミスがなくなりますよ。

月初日を求める2つの方法

EOMONTHには「月初を返す関数」はありませんが、ちょっとした工夫で月初も簡単に取得できます。

方法1: EOMONTHで前月末を求めて+1する

=EOMONTH(A2, -1) + 1

前月末に1日を足せば、当月1日になります。

方法2: DATE関数で年と月を指定する

=DATE(YEAR(A2), MONTH(A2), 1)

A2の年と月をそのまま使い、日を1にすることで月初を取得できます。読みやすさはDATE版のほうが上ですね。

やりたいことおすすめ式
当月の月末=EOMONTH(A1, 0)
当月の月初=DATE(YEAR(A1), MONTH(A1), 1)
翌月の月末=EOMONTH(A1, 1)
翌月の月初=EOMONTH(A1, 0) + 1
前月末=EOMONTH(A1, -1)

DATE関数で月末を取得するテクニック

DATE関数は「範囲外の日付」を自動補正する特性を持っています。=DATE(YEAR(A1), MONTH(A1)+1, 0) のように「翌月の0日」を指定すると、当月末日が返ります。2026年3月の場合、DATE(2026, 3, 0) = 2026/2/28 です(2026年はうるう年でないため2/29は存在しません)。月末取得はEOMONTHのほうがシンプルですが、DATE関数のこの動作を知っておくと応用が広がりますよ。

EDATE関数で「Nヶ月後の同日」を求める

「月末ではなく、Nヶ月後の同じ日が欲しい」場面ではEDATE関数を使います。

=EDATE(開始日, 月数)

たとえば契約開始日から3ヶ月後の同日を出したい場合はこうです。

=EDATE(A2, 3)

A2が 2026/4/15 なら 2026/7/15 が返ります。月末日が開始日の場合は、翌月の月末に自動調整されます。

たとえば =EDATE("2026/1/31", 1)2026/2/28 を返します(2月31日は存在しないため、月末側に寄せられる仕様です)。

EOMONTH と EDATE の使い分け

「月末日を求めたい」ならEOMONTH、「Nヶ月後の同日を求めたい」ならEDATEです。両方とも経理・契約管理で使うので、セットで覚えておくと便利ですよ。

日付計算でよくあるトラブルと対処法

スプレッドシートの日付計算で、初心者がつまずきやすいトラブルとその対処法をまとめました。

トラブル1: 日付なのに引き算ができない

「セルに2026/4/1と入っているのに、引き算したら #VALUE! エラーが出る」というケースです。

原因は、見た目は日付でも、実はテキスト型として保存されているからです。ISDATE関数(セルの値が日付型かどうかを判定する関数)で確認できます。

=ISDATE(A2)

FALSEが返れば、テキスト型です。対処はDATEVALUE関数(テキストの日付をシリアル値に変換する関数)で数値に変換します。

=DATEVALUE(A2)

CSVインポートやコピペで取り込んだ日付は、テキスト扱いになりがちなので注意してくださいね。

トラブル2: 結果に「1899/12/30」や「0」が出る

EOMONTHやDAYSの結果が 1899/12/301900/1/0 のような変な日付になることがあります。

これは「空のセルを参照した」ときに起きるんです。空のセルは0(シリアル値)として扱われ、それを日付書式で表示すると基準日が出てしまいます。

対処はIF関数で空セルチェックを入れることです。

=IF(A2="", "", EOMONTH(A2, 1))

A2が空なら空文字を返すようにしておくと、見た目もきれいに保てますよ。

トラブル3: NETWORKDAYSの結果が想定と1日違う

「土日を除いた営業日を数えたら、計算が1日多い(または少ない)」というケースですね。

NETWORKDAYSは開始日と終了日の両方を含めてカウントします。一方、引き算(B2-A2)は両端を含まない計算です。この違いで結果がずれます。

A2 = 2026/4/1(水)
B2 = 2026/4/3(金)

=B2-A2                → 2 (引き算は4/1を含まない)
=NETWORKDAYS(A2, B2)  → 3 (水・木・金の3日)

どちらの意味合いか整理してから使い分けてくださいね。

トラブル4: TODAYの値が翌日になっている

「昨日入力したTODAY()の結果が、今日見ると違う日付になっている」というご相談を受けることがあります。

原因はTODAY関数の揮発性です。ファイルを開くたびに再計算されるので、入力時の日付は保存されません。

過去の日付を残したい場合は、TODAY()を使わず Ctrl + ;(Macは ⌘ + ;)のショートカットで日付を直接入力します。これは固定値として保存されますよ。

トラブル5: #NUM!エラーが出る

DATEDIFで「開始日 > 終了日」になっていると #NUM! エラーが出ます。

=DATEDIF("2026/4/30", "2026/4/1", "Y")  → #NUM!

引数の順番(第1引数が古い日付、第2引数が新しい日付)を確認してください。

エラー主な原因対処
#NUM!DATEDIFで開始日 > 終了日引数順を確認
#VALUE!テキスト型の日付を計算DATEVALUEで変換
#NAME?関数名スペルミス(NETWORKDAYなど)NETWORKDAYS(複数形)に修正
#REF!祝日範囲のセル削除範囲を再指定

よくある質問

Q. ExcelのDATEDIFがスプレッドシートでも使えますか?

A. 使えます。むしろスプレッドシートではDATEDIFが公式ヘルプに記載されていて、Excelよりも正式な扱いです。オートコンプリートにも表示されますし、安心して使えますよ。

Q. 年齢を「○歳○ヶ月」と表示したい場合は?

A. DATEDIF関数を2つ組み合わせます。

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

"Y" で年部分、"YM" で年を無視した月部分が取れるので、文字列連結で組み合わせるだけです。

Q. 祝日リストはどこから取得すればよいですか?

A. 内閣府の公式ページからCSV形式で取得できます(https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html )。昭和30年から翌年分まで含まれているので、勤怠管理や納期計算で活用してくださいね。

Q. 日曜だけ休みのお店の営業日を出したいです

A. NETWORKDAYS.INTL関数で週末コード 11 を指定します。

=NETWORKDAYS.INTL(A2, B2, 11)

第4引数に祝日リストを追加すれば、祝日も除外できます。

Q. ExcelとスプレッドシートでDAYS関数の引数順は同じ?

A. 同じです。両方とも「DAYS(終了日, 開始日)」の順です。引き算「B2-A2」とは順番が逆になる点だけ注意してください。

Q. TODAYで出した日付を毎日更新せずに固定したいです

A. 値で固定したい場合は2つの方法があります。

  1. 入力時に Ctrl + ;(Macは ⌘ + ;)でその日の日付を直接入力する
  2. TODAY()を入力したセルをコピーして「値のみ貼り付け」(Ctrl + Shift + V)で上書きする

履歴を残しながら毎日自動で「今日の日付」が必要なら、Google Apps Scriptで日付を自動転記する方法もありますよ。

まとめ|シーン別に関数を選べば日付計算で迷わない

スプレッドシートの日付計算で使う関数を、4シーン別に整理しました。最後にもう一度まとめます。

シーン主な関数一言メモ
年齢計算DATEDIF / YEARFRAC / TODAY満年齢ならDATEDIF “Y” 一択
日数計算引き算 / DAYS / DATEDIF “D”単純な日数なら引き算が最速
営業日計算NETWORKDAYS / WORKDAY / .INTL系祝日リストを別シートに用意
月末・月初EOMONTH / EDATE / DATE月末はEOMONTH、Nヶ月後はEDATE

日付計算は「やりたいこと」を先に決めて、そこから関数を選ぶのがコツです。早見表とフローチャートをブックマークしておけば、迷うことはなくなりますよ。

各関数の詳しい使い方は、個別の解説記事も用意しているので、シーンに合わせて読んでみてくださいね。

関連記事

タイトルとURLをコピーしました