Excelで“今日までの営業日数”を自動カウントする方法|NETWORKDAYSとTODAYで祝日・週末にも対応

「列Bの Date Identified から“今日”までの営業日数(平日だけ)を、列Hで自動更新したい」。その最短解は NETWORKDAYS と TODAY の組み合わせです。本記事では基本の数式から、祝日一覧の使い方、週末パターンの違い(NETWORKDAYS.INTL)、空白や未来日の扱い、実務でハマらないためのチェックポイントまで、現場向けに徹底解説します。

目次

前提とゴール

対象となるExcel表には、少なくとも次の列がある想定です。

  • 列B:Date Identified(起点日)
  • 列H:営業日数(出力列)
  • (任意)祝日一覧:会社の休業日や国民の祝日をまとめた範囲

ゴールは、「Date Identified から“今日”までの営業日数」を列Hで自動表示し、日付の経過とともに勝手に更新される状態にすることです。

最短の解決策(基本)

列H(テーブルの計算列)に次の式を入力します。

=NETWORKDAYS([@[Date Identified]], TODAY())
  • NETWORKDAYS(開始日, 終了日) は、開始日と終了日を含めて平日のみカウントします。
  • TODAY() は今日の日付を返すため、ブックを開くたびに自動更新されます。
  • 列Bがテーブル(ListObject)なら、式は自動で最終行まで反映されます。通常範囲ならオートフィルでコピーしてください。

セル参照版(テーブルではない場合)

=NETWORKDAYS(B2, TODAY())

祝日を除外する(任意)

会社の休業日や国民の祝日を、別シートや同シートの範囲にまとめ、その範囲を第3引数に渡します。

=NETWORKDAYS([@[Date Identified]], TODAY(), 休日一覧)

ここで 休日一覧 は、たとえば Holidays というテーブル(列名 Date)や、名前付き範囲にしておくと便利です。テーブルを使うと、祝日が増減しても範囲を手で調整しなくて済みます。

式の意味と“含まれる日”のルール

NETWORKDAYS は 開始日と終了日を含める仕様です。例えば、起点が金曜・終了が同じ金曜なら 1 日、金曜→翌週月曜なら 2 日(金・月)となります。これが意図と異なる場合は、次のように調整します。

意図調整式(祝日除外なし)ポイント
今日を含めない=NETWORKDAYS([@[Date Identified]], TODAY()-1)終了日を1日戻す
開始日を含めない=NETWORKDAYS([@[Date Identified]]+1, TODAY())開始日を1日進める
開始日・今日ともに含めない=NETWORKDAYS([@[Date Identified]]+1, TODAY()-1)両端を除外

祝日を除外する場合は、それぞれの式の第3引数に 休日一覧 を追加してください。

空白・未来日・エラーの実務対策

実データでは、未確定(空白)や未来日が混ざることが珍しくありません。想定外のマイナス値やエラーを避けるため、以下の「堅牢版」を推奨します。

=LET(
  s, [@[Date Identified]],
  h, 休日一覧,
  もし空白, IF(s="", "", 1),
  IF(s="","",
     MAX(0, NETWORKDAYS(s, TODAY(), h))
  )
)
  • IF(s="", "", ...) で起点が空白なら空白返し。
  • MAX(0, ...) で起点が未来日の場合でも最小 0 に抑制。
  • LET を使うと読みやすく、管理しやすくなります(LET 非対応バージョンでは通常の IF ネストで可)。

IFERRORでのガード

テキスト混入などでエラー化する場合は IFERROR で保険を掛けます。

=IFERROR(
  NETWORKDAYS([@[Date Identified]], TODAY(), 休日一覧),
  ""
)

祝日一覧(範囲)を正しく作るコツ

  1. 別シートに Holidays テーブルを作成(列名:Date)。
  2. 各年の祝日、会社の創立記念日、夏季・年末年始などの休業日を追加入力。
  3. テーブル名 Holidays をそのまま第3引数に使う:
    =NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date])

テーブル化しておけば、祝日が増えても式の参照範囲を直す必要がありません。実務は毎年更新が発生するため、テーブル運用が安全です。

週末の定義が「土日」ではない場合(NETWORKDAYS.INTL)

拠点やシフトによって、週末が「日&月」「金&土」「日だけ」などの場合があります。そのときは NETWORKDAYS.INTL を使います。

=NETWORKDAYS.INTL([@[Date Identified]], TODAY(), 週末コード, 休日一覧)

週末コード(数値)の代表パターンは下表の通りです。

コード週末説明
1土・日標準(Excel既定)
2日・月中東などで使用
3月・火シフト制向け
4火・水
5水・木
6木・金
7金・土イスラム圏など
11日だけ1日週休
12月だけ
13火だけ
14水だけ
15木だけ
16金だけ
17土だけ

より柔軟に指定するには、ビットマスク(文字列)を使います。
「月~日の7桁」で、1=週末、0=平日。例えば:

  • 土日週末:"0000011"
  • 金・土週末:"0000110"
  • 日曜だけ週末:"0000001"
  • 日・月週末:"1000001"

例:金・土を週末にし、祝日も除外する場合

=NETWORKDAYS.INTL([@[Date Identified]], TODAY(), "0000110", Holidays[Date])

サンプルデータでの動作確認

行Date Identified(B列)今日式期待される営業日数
12025/10/31(金)2025/11/02(日)=NETWORKDAYS(B1, TODAY())1(10/31の金曜のみ。土日不可算)
22025/10/28(火)同上=NETWORKDAYS(B2, TODAY())4(火~金が平日、日曜は不可算)
32025/11/03(月)2025/11/02(日)=NETWORKDAYS(B3, TODAY())0 もしくは -1(未来日→負値)。
運用上は MAX(0, ...) で 0 に抑えるのが無難。
4(空白)同上=IF(B4="", "", NETWORKDAYS(B4, TODAY()))空白を返す(レポート整形上、好まれる)

よくあるつまずきと対処

「日付」なのに計算されない/おかしな結果になる

  • 文字列日付:インポートしたデータは見かけが日付でも 文字列 のことがあります。
    判定:=ISNUMBER(B2) が TRUE ならOK。FALSEなら数値化が必要。
  • 変換法:=DATEVALUE(B2)、=VALUE(B2)、または「区切り位置指定ウィザード」「セル書式設定→日付」ではなく、「データ」タブの「テキストを列」等で直す。
  • 時刻付き:時刻が付いていても NETWORKDAYS 自体は日単位集計なので大勢に影響しません。気になるなら =INT(B2) で時刻切り捨て。

1900/1904 日付システムの混在

Windows版は通常 1900 日付システム、Mac版は 1904 が既定の場合があります。ブック間コピーで 4 年のズレが起きたらこの可能性を疑い、ファイル(またはExcelの環境設定)→詳細設定→1904日付システムのチェックを確認・統一してください。

「再計算が重い」を避ける工夫

  • TODAY は“揮発性”で再計算を引き起こします。数万行規模で重い場合は、ヘッダー直下の1セルに =TODAY() を置き、全行はそのセル参照にする方法が有効です。
(ヘッダー近くのセル)  X1: =TODAY()
(計算列)                 =NETWORKDAYS([@[Date Identified]], $X$1, 休日一覧)
  • LET で共通値化:式内で TODAY() を何度も呼ばず、一度だけ変数に入れる。
=LET(t, TODAY(), NETWORKDAYS([@[Date Identified]], t, 休日一覧))

「週末扱いの祝日」や「半休」をどうする?

  • 週末と祝日の重複:NETWORKDAYSは「週末」をまず除外し、次に「祝日一覧」を除外します。同じ日を二重に引くことはありません。祝日一覧には週末が含まれていてもOKです。
  • 半休(半日扱い):標準関数で「0.5日」をカウントする仕組みはありません。運用上は、半休日を別列で管理し、NETWORKDAYSの結果から -0.5×件数 するなどの調整を行います。

関連タスクも一気に片付ける(実務パターン集)

やりたいこと式(祝日:Holidays[Date])説明
起点からN営業日後の日付=WORKDAY([@[Date Identified]], N, Holidays[Date])納期・SLA期限の算出に便利
週末が土日のみではない=NETWORKDAYS.INTL([@[Date Identified]], TODAY(), "0000110", Holidays[Date])例:金・土週末
未来日は 0 に丸めたい=MAX(0, NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date]))レポートの見た目調整
空白は空白のまま=IF([@[Date Identified]]="", "", NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date]))未受付の行をノイズにしない
開始・終了を含めない=NETWORKDAYS([@[Date Identified]]+1, TODAY()-1, Holidays[Date])純粋な「間の日数」

ステップバイステップ:設定手順

テーブルを使った堅牢な作り

  1. データ範囲を選択→挿入→テーブルでテーブル化(列名あり)。
  2. B列のヘッダー名を「Date Identified」に統一。
  3. 列Hのヘッダーを「Business Days」など分かりやすい名前に変更。
  4. 列Hの最上段に基本式:
    =NETWORKDAYS([@[Date Identified]], TODAY())
  5. 祝日除外が必要なら、別シートに Holidays テーブル(列 Date)を作成し、式を:
    =NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date])

通常範囲での作り

  1. B列に起点日、H列に出力列を用意。
  2. H2 に =NETWORKDAYS(B2, TODAY()) を入力し、オートフィルで下へコピー。
  3. 祝日除外時は第3引数に範囲(例:$M$2:$M$50)を指定。

品質を守るチェックリスト

  • 日付列は 「短い日付」など日付書式。左寄せ・右寄せの見た目ではなく =ISNUMBER で判定。
  • 祝日一覧はテーブル化し、翌年の休日もシーズン前に投入。
  • レポート要件に合わせて、端点の含み方(今日を含める/含めない、開始日を含める/含めない)を定義。
  • 拠点別に週末が異なる場合は NETWORKDAYS.INTL を採用。
  • 計算が重いと感じたら:TODAYの単一セル参照 or LETで共通化。

現場での運用ヒント

  • 「進捗の色付け」:営業日数が一定以上なら条件付き書式でハイライト。例:>=5 で黄色、>=10 で赤など。
  • 「SLA逸脱検知」:起点+規定営業日を WORKDAY で求め、今日を超えたらフラグ。
  • 「部門ごとの週末・祝日」:部門コード→週末コードの対応表を用意し、VLOOKUP/XLOOKUP で NETWORKDAYS.INTL の第3引数に差し込む。

トラブルシュートQ&A

Q. 祝日一覧に同じ日が重複していても大丈夫?
A. 結果に大きな影響は出ませんが、重複は管理上のリスクです。テーブルの「重複の削除」で整えましょう。

Q. 表示が「#####」になる
A. 列幅が不足しているだけです。列Hの幅を広げればOK。負の値やエラーの可能性もあるため、MAX(0, ...) や IFERROR を併用すると安心です。

Q. 日付の地域設定(和暦/西暦、YYYY-MM-DDなど)は影響する?
A. 計算自体は日付の内部シリアル値で動くため影響しません。表示書式だけの違いです。

まとめ(すぐ使える定番レシピ)

  • 基本:=NETWORKDAYS([@[Date Identified]], TODAY())
  • 祝日除外:=NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date])
  • 未来日は 0 に:=MAX(0, NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date]))
  • 今日を含めない:=NETWORKDAYS([@[Date Identified]], TODAY()-1, Holidays[Date])
  • 週末が特殊:=NETWORKDAYS.INTL([@[Date Identified]], TODAY(), "0000110", Holidays[Date])
  • 空白は空白:=IF([@[Date Identified]]="", "", NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date]))

このレシピ群を押さえておけば、「Date Identified(列B)から今日までの営業日数」はもちろん、週末や祝日の違い、空白・未来日・半休など実務の“ややこしさ”にも柔軟に対応できます。まずは基本式を入れ、次に自社の暦(祝日一覧)と週末ルールを載せる、の二段構えで仕上げましょう。


付録:最小構成テンプレート(コピペ用)

1) 基本

=NETWORKDAYS([@[Date Identified]], TODAY())

2) 祝日除外

=NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date])

3) ガード付き(空白→空白、未来日→0)

=LET(s, [@[Date Identified]],
     IF(s="", "", MAX(0, NETWORKDAYS(s, TODAY(), Holidays[Date]))))

4) 週末が金・土(祝日除外あり)

=NETWORKDAYS.INTL([@[Date Identified]], TODAY(), "0000110", Holidays[Date])

5) 今日を含めない(祝日除外あり)

=NETWORKDAYS([@[Date Identified]], TODAY()-1, Holidays[Date])

実装チェックのための簡易テストケース

CaseB列(起点)週末祝日一覧期待値備考
基本金曜日土日なし1開始・終了含む
日曜跨ぎ木曜日土日なし2木・金だけカウント
未来日明日土日なし0(丸め)MAX(0, ...) 使用
祝日重複金曜日土日同日が2回1重複は実害少だが整理推奨
金土週末木曜日金土なし1金土が除外され木のみ

一言アドバイス

「まず基本式→祝日テーブル→週末ルール→ガード(空白・未来日)」の順で組み上げると、スモールスタートで早く成果が出せます。レポートの仕様変更にも強い構成なので、後からのメンテナンスコストも最小化できます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次