ExcelのWEEKDAY関数とツェラーの公式による「曜日判定」の仕組みと罠:シリアル値ズレの防止策

Excelでのデータ集計や業務ツールの開発において、特定の日付から自動的に「曜日」を割り出す処理は頻繁に使用されます。しかし、Excel内部の日付管理システムである「シリアル値」の仕様や、WEEKDAY関数の戻り値タイプの指定ミスによって、本来の曜日と1日ズレた結果が出力されるトラブルが後を絶ちません。

この記事では、Excelで曜日を自動計算する具体的な数式パターンから、その裏側で動作している計算アルゴリズム「ツェラーの公式」の仕組み、そして現場で発生しやすいバグの回避策までを詳しく解説します。

数式を組んだり設定を検証したりする手間を省き、今すぐブラウザ上で正確な曜日や日数カウント結果を確認したい場合は、以下の完全ブラウザ完結型ツールをご活用ください。

日付・日数計算ツールの操作画面※実際のツール画面(スクショ)このツールを使ってみる → ▶ 今すぐこのツールで曜日・日数を計算する(無料・登録不要・ブラウザ完結)

Excelで曜日を自動計算する2つのアプローチ

Excelで日付データから曜日を取得する方法には、大きく分けて 「曜日の文字列として直接抽出する(TEXT関数)」 方法と、「曜日の種類を数値として取得して条件判定に使う(WEEKDAY関数)」 方法の2種類が存在します。

1. TEXT関数による曜日の表示・文字列抽出

日付が入力されているセル(例: A1)から、「月」「火」のような単一の漢字や「月曜日」といった文字列を直接取り出したい場合は、TEXT関数を使用するのが最もシンプルです。

  • 日本語の略称(月、火、水…)を出力する場合: =TEXT(A1, "aaa")
  • 日本語の正式名称(月曜日、火曜日…)を出力する場合: =TEXT(A1, "aaaa")
  • 英語の略称(Mon, Tue, Wed…)を出力する場合: =TEXT(A1, "ddd")
  • 英語の正式名称(Monday, Tuesday…)を出力する場合: =TEXT(A1, "dddd")

この方法は見た目の表示を整える目的には適していますが、得られる結果は「文字列」テキストとなるため、その後に「土日だけをフィルターして集計する」といった数値による論理判定には向きません。

2. WEEKDAY関数による数値コード化と条件分岐

IF関数と組み合わせて「土日の場合に処理を分ける」「土日祝日のセルに色を付ける(条件付き書式)」といった高度な制御を行う場合は、WEEKDAY関数を使用します。

  • WEEKDAY関数の基本構文: =WEEKDAY(シリアル値, [種類])

第2引数の 「種類」 を省略した場合、Excelの標準設定では「1=日曜日、2=月曜日、… 7=土曜日」という数値が返されます。この数値を判定基準にすることで、カレンダーのロジック制御が可能になります。

日付・日数計算ツールで特定の日付の曜日と和暦を今すぐ確認する

曜日計算の裏側にある「ツェラーの公式」の原理

プログラムやシステム内部で日付から曜日を導き出す際、最も有名な計算アルゴリズムが ツェラーの公式(Zeller's congruence) です。明治以降のグレゴリオ暦において、年・月・日の数値から曜日を機械的に算出できる数学的なロジックとして知られています。

ツェラーの公式では、西暦 $y$ 年 $m$ 月 $d$ 日の曜日コード $h$ を求出する際、以下のような代数式が用いられます($h$ の値が0なら土曜日、1なら日曜日…と対応します)。

$$h = \left( d + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + Y + \left\lfloor \frac{Y}{4} \right\rfloor - \left\lfloor \frac{Y}{100} \right\rfloor + \left\lfloor \frac{Y}{400} \right\rfloor \right) \bmod 7$$

ここで、$Y$ は年 $y$ の下2桁(または世紀を調整した値)であり、$\lfloor x \rfloor$ はガウス記号(床関数:実数 $x$ を超えない最大の整数)を表します。

ツェラーの公式における「1月・2月」の特殊処理

ツェラーの公式を実装・理解する上で最も注意すべき点が 「1月と2月の扱い」 です。このアルゴリズムでは、1月と2月を「前年の13月」「前年の14月」として計算します。

例えば、2026年2月15日の曜日を計算する場合、式に代入するパラメーターは「2026年2月」ではなく 「2025年14月15日」 として扱います。これは、うるう年による調整日(2月29日)が年の最末尾に位置するように移動させることで、3月以降の月の日数計算パターンを一定の周期に収めるための数学的な工夫です。

この特殊な月補正を行わずに数式に当てはめると、1月や2月の日付の曜日が必ず誤って算出されてしまいます。

現場で発生しやすい「曜日判定バグ」とシリアル値の罠

Excelの関数やマクロで曜日を処理していると、計算結果が1日ズレたり、エラーが発生したりすることがあります。実際に現場で多発する失敗パターンとして、以下の2点が挙げられます。

1. WEEKDAY関数の第2引数「種類」の勘違い

WEEKDAY関数で最も多いバグは、第2引数の「種類」を指定し忘れたことによる戻り値の思い込みです。

  • 引数省略(種類=1): 1が日曜日、7が土曜日
  • 種類=2 を指定した場合: 1が月曜日、7が日曜日
  • 種類=3 を指定した場合: 0が月曜日、6が日曜日

業務システムやプログラミング言語(PythonやJavaScriptなど)の多くは「0=月曜日」や「0=日曜日」を基準とするゼロインデックスを採用していることが多いため、Excelの標準設定(種類省略=1が日曜日)と混同してしまい、「WEEKDAY(A1) >= 6」と書いたつもりが土日ではなく「金曜日と土曜日」を判定してしまった、というような見落としが発生しやすくなります。

私自身も過去に、月曜始まりの計算式で第2引数の指定を誤り、集計データの曜日判定がすべて1日分ずれて納品直前に焦った経験があります。

2. 「1900年うるう年バグ」によるシリアル値のズレ

Excelは過去の表計算ソフト(Lotus 1-2-3)との互換性を保つため、存在しない 「1900年2月29日」をうるう年として正しく扱ってしまう仕様(既知の互換性バグ) を意図的に残しています。

1900年は4で割れますが100で割れるため、グレゴリオ暦のルール上はうるう年ではなく平年です。しかし、Excel内部では1900年2月29日(シリアル値60)が存在するものとして計算されています。

そのため、1900年3月1日以前の古い歴史的な日付をExcelのシリアル値で計算・比較しようとすると、シリアル値と実際の曜日に1日分のズレが生じます。

曜日計算における仕様・挙動の対比一覧

項目Excel (WEEKDAY関数)ツェラーの公式日付・日数計算ツール
日付の入力方式シリアル値(数値)西暦の年・月・日の数値カレンダーUIによる直感選択
標準の曜日出力1〜7 の数値コード0〜6 の数値コード「○曜日」+和暦を自動表示
1月・2月の扱いシリアル値で自動処理前年の13月・14月として補正システム内部で正しく処理
うるう年の判定国際標準に準拠(1900年除外)ガウス記号(100/400年則)により正確グレゴリオ暦に基づき正確に計算
データの安全性ローカルファイル内に保存計算式(ローカル処理)サーバー送信なし(完全ブラウザ完結)

外部サーバーへ送信しない「完全ブラウザ完結設計」の安全性

企業の顧客データ、人事記録、生年月日を含む申請書類などの日付情報を扱う際、Web上の無料計算ツールを利用する上で最も配慮すべきなのが「プライバシーと情報漏洩リスク」です。

一般的に存在するクラウド型のWebツールの中には、利用者が入力した日付データやアクセスログをバックエンドのサーバーに送信・保持する仕組みを持つものが存在します。

当サイトの「日付・日数計算ツール」は、機密性の高い日付データを扱うユーザーも安心して利用できるよう、JavaScriptによる 完全ブラウザ完結設計(クライアントサイド処理) を徹底しています。

入力された生年月日や計算対象の日付は、お使いの端末(ブラウザ)内のみで処理され、外部のサーバーへ送信されることはありません。また、開発者を含む第三者がサーバー経由で入力内容を確認する仕組みも存在しないため、業務上のスケジュール管理や書類作成の現場でも安全にお使いいただけます。

複雑な関数の設定やシリアル値のバグに悩まされることなく、1秒で正確な曜日・和暦・経過日数を割り出す手段として、ぜひ以下のツールをお役立てください。

日付・日数計算ツールの操作画面※実際のツール画面(スクショ)このツールを使ってみる → ▶ 今すぐこのツールで曜日・日数を計算する(無料・登録不要・ブラウザ完結)

おすすめの記事