「開始日から何日経ったのか計算したい」
「締め切りまであと何日かを一目で見たい」
「プロジェクトの稼働日数を正確に把握したい」
Excelを使っていると、日付の差を計算して日数をカウントしたい場面がよくありますよね。特に、プロジェクト管理や勤怠管理、契約期間の計算などで頻繁に使われる機能です。
でも実際にやろうとすると、以下のような疑問が出てきます:
- どの関数を使えばいいのか
- 土日や祝日を除外する方法は?
- 開始日は含めるべき?含めないべき?
- 月をまたぐ場合の計算方法は?
この記事では、Excelで日数をカウントする基本から、土日を除いた稼働日数の計算方法、さらには実務でよく使われる応用テクニックまで、初心者の方でもわかりやすく解説します。実際のビジネスシーンでの活用例も豊富に紹介するので、ぜひ最後まで読んでください。
【基本編】Excelで日数をカウントする基本的な方法

日付の引き算による基本計算
Excelの日付システムの理解
シリアル値とは Excelでは、日付は「シリアル値」という数字で管理されています。これにより、日付の計算が簡単な算術演算で行えます。
例:シリアル値の確認
2025/1/1 → 45658
2025/1/2 → 45659
2025/1/3 → 45660
最も基本的な日数計算
基本的な計算式
=終了日 - 開始日
具体的な例
A1: 2025/7/1(開始日)
B1: 2025/7/13(終了日)
C1: =B1-A1
結果
- 12日(経過日数)
計算結果の意味
経過日数について
- 7/1から7/13までの間の日数
- 開始日(7/1)は含まれない
- 終了日(7/13)は含まれる
日数の数え方
7/1 → 7/2(1日目)
7/2 → 7/3(2日目)
...
7/12 → 7/13(12日目)
開始日を含めた日数計算
開始日を含める場合
計算式
=終了日 - 開始日 + 1
具体的な例
A1: 2025/7/1(開始日)
B1: 2025/7/13(終了日)
C1: =B1-A1+1
結果
- 13日(開始日を含む日数)
実際の業務での使い分け
経過日数を使う場面
- 「開始から何日経ったか」
- 「あと何日残っているか」
- 期間の長さを測る場合
開始日を含む場合
- 「合計何日間か」
- 「滞在日数」
- 「勤務日数」
今日までの日数を自動計算
TODAY関数の活用
今日までの経過日数
=TODAY() - 開始日
今日を含む日数
=TODAY() - 開始日 + 1
実践的な例
プロジェクト開始からの経過日数
A1: 2025/6/1(プロジェクト開始日)
B1: =TODAY()-A1
契約期間の残り日数
A1: 2025/8/31(契約終了日)
B1: =A1-TODAY()
【応用編】NETWORKDAYS関数で稼働日数を計算

NETWORKDAYS関数の基本
基本的な構文
=NETWORKDAYS(開始日, 終了日, [祝日])
パラメータの説明
- 開始日:計算開始日
- 終了日:計算終了日
- 祝日:除外する祝日リスト(省略可能)
基本的な使用例
土日を除いた稼働日数
=NETWORKDAYS(A1, B1)
結果の例
開始日:2025/7/1(火)
終了日:2025/7/13(日)
→ 9日(土日を除いた営業日)
祝日を除外した計算
祝日リストの作成
祝日データの準備
D1: 2025/7/21(海の日)
D2: 2025/8/11(山の日)
D3: 2025/9/15(敬老の日)
D4: 2025/9/23(秋分の日)
D5: 2025/10/14(体育の日)
祝日を除外した計算
祝日リストを使った計算
=NETWORKDAYS(A1, B1, D1:D5)
年間祝日リストの作成
# 別シートに年間祝日を作成
祝日!A1:A16 (年間の祝日一覧)
# 計算式
=NETWORKDAYS(A1, B1, 祝日!A:A)
動的な祝日リストの活用
名前付き範囲の使用
名前付き範囲の作成
- 祝日リストを選択
- 「数式」→「名前の定義」
- 名前:「祝日リスト」
計算式での使用
=NETWORKDAYS(A1, B1, 祝日リスト)
年度別祝日リストの管理
年度別シートの作成
2025年祝日!A:A
2026年祝日!A:A
INDIRECT関数との組み合わせ
=NETWORKDAYS(A1, B1,
INDIRECT(YEAR(A1) & "年祝日!A:A"))
【高度な活用】DATEDIF関数による詳細な期間計算
DATEDIF関数の基本
基本的な構文
=DATEDIF(開始日, 終了日, 単位)
単位の種類
- “Y”:年数
- “M”:月数
- “D”:日数
- “YM”:年を除いた月数
- “YD”:年を除いた日数
- “MD”:月を除いた日数
実践的な使用例
正確な年数計算
=DATEDIF(生年月日, TODAY(), "Y")
月数の計算
=DATEDIF(契約開始日, 契約終了日, "M")
詳細な期間表示
=DATEDIF(A1, B1, "Y") & "年" &
DATEDIF(A1, B1, "YM") & "ヶ月" &
DATEDIF(A1, B1, "MD") & "日"
複合的な期間計算
勤続年数の計算
基本的な勤続年数
=DATEDIF(入社日, TODAY(), "Y")
詳細な勤続期間
=DATEDIF(入社日, TODAY(), "Y") & "年" &
DATEDIF(入社日, TODAY(), "YM") & "ヶ月"
契約期間の管理
契約期間の計算
# 契約月数
=DATEDIF(契約開始日, 契約終了日, "M")
# 契約残り期間
=DATEDIF(TODAY(), 契約終了日, "M") & "ヶ月" &
DATEDIF(TODAY(), 契約終了日, "MD") & "日"
【実践編】業務での具体的な活用例

プロジェクト管理
プロジェクト進捗の管理
プロジェクトデータの例
A列 | B列 | C列 | D列 | E列 |
---|---|---|---|---|
タスク名 | 開始日 | 終了日 | 予定日数 | 実績日数 |
要件定義 | 2025/6/1 | 2025/6/15 | 15 | =C2-B2+1 |
設計 | 2025/6/16 | 2025/7/10 | 25 | =C3-B3+1 |
開発 | 2025/7/11 | 2025/9/15 | 67 | =C4-B4+1 |
稼働日数での管理
# 実際の稼働日数
=NETWORKDAYS(B2, C2, 祝日リスト)
# 残り稼働日数
=NETWORKDAYS(TODAY(), C2, 祝日リスト)
進捗率の計算
進捗率の算出
# 経過日数ベース
=MIN((TODAY()-B2)/(C2-B2), 1)
# 稼働日数ベース
=MIN(NETWORKDAYS(B2, TODAY(), 祝日リスト)/
NETWORKDAYS(B2, C2, 祝日リスト), 1)
勤怠管理
出勤日数の計算
月次出勤日数
# 月初から今日までの出勤日数
=NETWORKDAYS(DATE(YEAR(TODAY()), MONTH(TODAY()), 1),
TODAY(), 祝日リスト)
# 月の総出勤日数
=NETWORKDAYS(DATE(YEAR(TODAY()), MONTH(TODAY()), 1),
EOMONTH(TODAY(), 0), 祝日リスト)
有給消化日数の管理
有給管理表の例
A列 | B列 | C列 | D列 |
---|---|---|---|
有給取得日 | 開始日 | 終了日 | 取得日数 |
夏季休暇 | 2025/8/12 | 2025/8/16 | =NETWORKDAYS(B2,C2,祝日リスト) |
契約・法務管理
契約期間の管理
契約管理表
A列 | B列 | C列 | D列 | E列 |
---|---|---|---|---|
契約先 | 開始日 | 終了日 | 契約期間 | 残り期間 |
A社 | 2025/1/1 | 2025/12/31 | =DATEDIF(B2,C2,”M”) | =DATEDIF(TODAY(),C2,”M”) |
更新時期の通知
更新通知の判定
# 更新3ヶ月前の通知
=IF(DATEDIF(TODAY(), 終了日, "M") <= 3,
"更新手続き要", "")
# 更新60日前の通知
=IF(終了日 - TODAY() <= 60,
"更新手続き要", "")
販売・営業管理
売掛金の管理
売掛金管理表
A列 | B列 | C列 | D列 | E列 |
---|---|---|---|---|
顧客名 | 請求日 | 支払期日 | 支払条件 | 経過日数 |
A社 | 2025/6/30 | 2025/7/31 | 30日 | =TODAY()-B2 |
督促管理
# 支払期日超過の判定
=IF(TODAY() > 支払期日,
"督促対象", "")
# 超過日数の計算
=IF(TODAY() > 支払期日,
TODAY() - 支払期日, 0)
【カスタマイズ】条件付き書式との組み合わせ
視覚的な期限管理
条件付き書式の設定
期限間近の色分け
- 対象範囲を選択
- 「ホーム」→「条件付き書式」
- 「新しいルール」→「数式を使用」
設定例
# 期限7日前から黄色
=残り日数 <= 7
# 期限3日前から赤色
=残り日数 <= 3
# 期限超過は濃い赤
=残り日数 < 0
データバーでの進捗表示
進捗率の視覚化
# 進捗率の計算
=MIN((TODAY()-開始日)/(終了日-開始日), 1)
# データバーの適用
条件付き書式 → データバー → 適用
アイコンセットでの状態表示
状態の分類
3段階のアイコン設定
- 緑:期限まで1週間以上
- 黄:期限まで1週間以内
- 赤:期限超過
設定値
# 値の設定
緑:> 7
黄:>= 0
赤:< 0
【エラー対処法】よくある問題と解決策

日付認識エラー
文字列として保存された日付
症状
- 計算結果が正しくない
- 日付が左寄せで表示される
- エラーメッセージが表示される
解決方法
方法1:DATEVALUE関数を使用
=DATEVALUE("2025/7/1")
方法2:日付形式の統一
# 文字列から日付への変換
=DATE(LEFT(A1,4), MID(A1,6,2), RIGHT(A1,2))
#VALUE!エラーの対処
原因と解決方法
原因1:無効な日付
# 問題のある例
=DATEDIF("2025/2/30", TODAY(), "D") # 2/30は存在しない
# 解決方法
=IFERROR(DATEDIF(A1, TODAY(), "D"), "無効な日付")
原因2:開始日が終了日より後
# 問題のある例
=DATEDIF("2025/7/15", "2025/7/1", "D") # 開始日が終了日より後
# 解決方法
=IF(A1 <= B1, DATEDIF(A1, B1, "D"), "日付順序エラー")
NETWORKDAYS関数のエラー
祝日リストの問題
空白セルの処理
# 空白を含む祝日リストの処理
=NETWORKDAYS(A1, B1,
IF(祝日リスト<>"", 祝日リスト, ""))
無効な祝日データ
# 祝日データの検証
=IF(ISNUMBER(祝日リスト),
NETWORKDAYS(A1, B1, 祝日リスト),
NETWORKDAYS(A1, B1))
【関数一覧】日数計算で使える関数まとめ
基本的な日付関数
TODAY関数・NOW関数
TODAY関数
=TODAY() # 今日の日付(時刻なし)
NOW関数
=NOW() # 現在の日時
DATE関数
日付の作成
=DATE(年, 月, 日)
=DATE(2025, 7, 15) # 2025/7/15
YEAR・MONTH・DAY関数
日付の分解
=YEAR(A1) # 年を取得
=MONTH(A1) # 月を取得
=DAY(A1) # 日を取得
日数計算専用関数
DATEDIF関数
詳細な期間計算
=DATEDIF(開始日, 終了日, "Y") # 年数
=DATEDIF(開始日, 終了日, "M") # 月数
=DATEDIF(開始日, 終了日, "D") # 日数
NETWORKDAYS関数・NETWORKDAYS.INTL関数
稼働日数の計算
=NETWORKDAYS(開始日, 終了日, 祝日) # 土日を除く
=NETWORKDAYS.INTL(開始日, 終了日, 週末, 祝日) # カスタム週末
便利な補助関数
EOMONTH関数
月末日の取得
=EOMONTH(日付, 0) # 当月末
=EOMONTH(日付, 1) # 翌月末
=EOMONTH(日付, -1) # 前月末
WEEKDAY関数
曜日の取得
=WEEKDAY(日付, 2) # 1=月曜日, 7=日曜日
【VBA活用】マクロによる自動化

基本的な日数計算マクロ
Sub CalculateDays()
Dim ws As Worksheet
Dim startDate As Date
Dim endDate As Date
Dim dayCount As Long
Set ws = ActiveSheet
' 日付の取得
startDate = ws.Range("A1").Value
endDate = ws.Range("B1").Value
' 日数計算
dayCount = endDate - startDate + 1
' 結果の出力
ws.Range("C1").Value = dayCount
MsgBox "日数計算完了: " & dayCount & "日"
End Sub
稼働日数計算マクロ
Sub CalculateWorkdays()
Dim ws As Worksheet
Dim startDate As Date
Dim endDate As Date
Dim holidays As Range
Dim workdays As Long
Set ws = ActiveSheet
' データの取得
startDate = ws.Range("A1").Value
endDate = ws.Range("B1").Value
Set holidays = ws.Range("D1:D10") ' 祝日リスト
' 稼働日数計算
workdays = Application.WorksheetFunction.NetworkDays(startDate, endDate, holidays)
' 結果の出力
ws.Range("C1").Value = workdays
MsgBox "稼働日数: " & workdays & "日"
End Sub
一括処理マクロ
Sub BatchCalculateDays()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 1).Value <> "" And ws.Cells(i, 2).Value <> "" Then
' 日数計算
ws.Cells(i, 3).Value = ws.Cells(i, 2).Value - ws.Cells(i, 1).Value + 1
' 稼働日数計算
ws.Cells(i, 4).Value = Application.WorksheetFunction.NetworkDays( _
ws.Cells(i, 1).Value, ws.Cells(i, 2).Value, ws.Range("F:F"))
End If
Next i
MsgBox "一括計算完了"
End Sub
まとめ
Excelでの日数カウントは、用途に応じて最適な方法を選択することが重要です。
使い分けの指針
単純な日数差
- 基本的な引き算:
=終了日-開始日
- 期間の長さ:
=終了日-開始日+1
営業日数・稼働日数
- NETWORKDAYS関数:土日を除外
- 祝日リスト:より正確な計算
詳細な期間計算
- DATEDIF関数:年・月・日の組み合わせ
- 年齢計算:生年月日から現在まで
実装時のポイント
エラー対策
- 日付形式の統一:文字列と日付の混在を避ける
- 妥当性チェック:開始日≤終了日の確認
- エラーハンドリング:IFERROR関数の活用
パフォーマンス
- 範囲の最適化:必要最小限の範囲指定
- 計算方法の設定:手動計算の検討
- 数式の簡素化:複雑な処理は分割
視覚化
- 条件付き書式:期限管理の色分け
- データバー:進捗の可視化
- アイコン:状態の分類表示
コメント