「列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(), 休日一覧),
""
)
祝日一覧(範囲)を正しく作るコツ
- 別シートに Holidays テーブルを作成(列名:
Date)。 - 各年の祝日、会社の創立記念日、夏季・年末年始などの休業日を追加入力。
- テーブル名
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列) | 今日 | 式 | 期待される営業日数 |
|---|---|---|---|---|
| 1 | 2025/10/31(金) | 2025/11/02(日) | =NETWORKDAYS(B1, TODAY()) | 1(10/31の金曜のみ。土日不可算) |
| 2 | 2025/10/28(火) | 同上 | =NETWORKDAYS(B2, TODAY()) | 4(火~金が平日、日曜は不可算) |
| 3 | 2025/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]) | 純粋な「間の日数」 |
ステップバイステップ:設定手順
テーブルを使った堅牢な作り
- データ範囲を選択→挿入→テーブルでテーブル化(列名あり)。
- B列のヘッダー名を「Date Identified」に統一。
- 列Hのヘッダーを「Business Days」など分かりやすい名前に変更。
- 列Hの最上段に基本式:
=NETWORKDAYS([@[Date Identified]], TODAY()) - 祝日除外が必要なら、別シートに Holidays テーブル(列
Date)を作成し、式を:=NETWORKDAYS([@[Date Identified]], TODAY(), Holidays[Date])
通常範囲での作り
- B列に起点日、H列に出力列を用意。
- H2 に
=NETWORKDAYS(B2, TODAY())を入力し、オートフィルで下へコピー。 - 祝日除外時は第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])
実装チェックのための簡易テストケース
| Case | B列(起点) | 週末 | 祝日一覧 | 期待値 | 備考 |
|---|---|---|---|---|---|
| 基本 | 金曜日 | 土日 | なし | 1 | 開始・終了含む |
| 日曜跨ぎ | 木曜日 | 土日 | なし | 2 | 木・金だけカウント |
| 未来日 | 明日 | 土日 | なし | 0(丸め) | MAX(0, ...) 使用 |
| 祝日重複 | 金曜日 | 土日 | 同日が2回 | 1 | 重複は実害少だが整理推奨 |
| 金土週末 | 木曜日 | 金土 | なし | 1 | 金土が除外され木のみ |
一言アドバイス
「まず基本式→祝日テーブル→週末ルール→ガード(空白・未来日)」の順で組み上げると、スモールスタートで早く成果が出せます。レポートの仕様変更にも強い構成なので、後からのメンテナンスコストも最小化できます。

コメント