本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!
はじめに:Excelの日付、その正体に迫る冒険へ
皆さんは、Excelで「年」を取り出したいとき、どの関数を使いますか?
そう、もちろんYEAR関数ですよね!
=YEAR("2025/9/3")
と入力すれば、「2025」が返ってくる。これはExcelを使う上での常識であり、疑う余地のない事実です。

では、もし…もしも、この絶対的な信頼を置いているYEAR関数が、今日から使用禁止になったとしたら?
そして、もっと恐ろしい質問をしましょう。
皆さんが普段目にしている「2025/9/3」という日付は、Excelにとって本当の姿ではない…と言ったら、信じますか?
今回の記事は、単なる関数パズルではありません。
Excelが時間をどのように認識しているのか、その心臓部である「シリアル値」の謎を解き明かし、さらにはExcelがひっそりと抱え続ける「歴史的なバグ」の正体にまで迫る、知的な探求の旅です。
複雑な数式を一行で書くことだけがスキルではありません。
本質を理解し、賢く準備をすることで、いかにシンプルで美しい数式にたどり着けるか。
その思考のプロセスを、一緒に楽しんでいきましょう!
そもそも「シリアル値」とは何か?
本題に入る前に、Excelの日付の「本当の姿」について、少しだけ寄り道させてください。
私たちがセルに「2025/9/3」と入力すると、画面上ではそのように見えますが、Excelの内部では、これを全く別のものとして扱っています。
それが「シリアル値」です。

シリアル値とは、簡単に言えば「基準日からの経過日数」を表すただの数値(整数)です。
Excelでは、1900年1月1日を「1」として、そこから1日経つごとに数字が1ずつ増えていきます。
- 1900年1月1日 → シリアル値 1
- 1900年1月2日 → シリアル値 2
- …
- 2025年9月3日 → シリアル値 45903
なぜこんな仕組みになっているのでしょうか?
それは、日付を「数値」として扱うことで、「Aの日付からBの日付まで何日あるか?」といった計算を、単純な引き算(例: 45910 – 45903)で簡単にできるようにするためなのです。
賢い仕組みですよね。
今回の冒険は、このExcelの基本ルールを逆手に取り、シリアル値という「ただの数字」から「年」を導き出す壮大な試みです。
今回のミッション:自らの手で「年」を計算せよ!
目指すゴール: Excelの心臓部である「シリアル値」から、YEAR関数を一切使わずに、正しい「年」を抽出するロジックを自らの手で構築する。
ルール:
- 数式一つで解決する、という縛りは無し!
- むしろ、作業列や参照表を好きなだけ作成してOK!
- ゴールは、シンプルで分かりやすい数式を組み立てるために、準備(作業列や参照表の工夫)をすることにあります。
さあ、準備はいいですか?未知なるシリアル値の世界へ、いざ出発です!
ステップ1:冒険の準備 – 検証フィールドを構築する
何事も、まずは準備から。
私たちのロジックが本当に正しいのかを証明するために、広大な検証フィールドを最初に作ってしまいましょう。
検証対象「シリアル値」を並べる
まず、まっさらなシートのC1セルに「シリアル値」と入力します。
今回は、シリアル値「1」から「100,000」まで、実に10万日分を検証対象としましょう。
C2セルに、以下の数式を入力してください。
=SEQUENCE(100000)
SEQUENCE関数が、1から100,000までの連続した数値を、スピル機能で一瞬にしてC列に展開してくれます。圧巻ですね!

正解(YEAR関数)を並べる
次に、私たちが目指すべき「正解」を隣に用意しておきましょう。
D1セルに「

」と入力し、D2セルに以下の数式を入力します。
=YEAR(C2)
入力したら、D2セルのフィルハンドル(右下の小さい四角)をダブルクリックして、一番下まで数式をコピーしてください。
これで、各シリアル値に対応する「正しい年」がD列に並びました。
私たちの最終目標は、このD列と寸分違わぬ結果を出すことです。

ステップ2:歴史の謎を解く – 賢者の参照表を作成する
YEAR関数を使わずに年を計算するにはどうすればいいか?
答えは、「各年が、何日あって、いつから始まるのか」という情報を持つ、完璧なカンニングペーパー(参照表)を作ることです。
さあ、ここからがこの冒険のクライマックスです!
登場する「年」をリストアップする
まずは、10万日の中に、西暦何年が登場するのかをリストアップしましょう。
H1セルに「年」と入力し、H2セルに以下の数式を入力します。
=UNIQUE(D2:D100001,FALSE,FALSE)
UNIQUE関数が、D列にずらっと並んだ年から重複を取り除き、登場する年(1900, 1901, … , 2173)だけのリストを自動で作成してくれます。

各年の「日数」を計算する(歴史のバグと向き合う)
ここが最重要ポイントです。
皆さんは「うるう年」のルールをご存知ですか?
1. 西暦が4で割り切れる年は、うるう年(366日)。
2. ただし、西暦が100で割り切れる年は、平年(365日)。
3. ただし、西暦が400で割り切れる年は、うるう年(366日)。
これが現代のルールです。このルールに従うと、西暦1900年は「100で割り切れる」ので、うるう年ではなく「平年」のはずですよね?
ところが…Excelは、1900年を「うるう年」として扱ってしまうのです!
これは、大昔の表計算ソフト「Lotus 1-2-3」が抱えていたバグを、互換性のためにExcelが意図的に引き継いだ結果です。
そのため、Excelの世界では、本来存在しないはずの「1900年2月29日」(シリアル値60)が存在してしまっています。不思議ですよね?
ちなみに、この「100で割り切れる年は平年」というルールは、未来においては正しく機能します。

例えば、2100年は100で割り切れて400で割り切れないため、Excelは正しく「平年」として扱います。
バグはあくまで1900年限定です。
具体的な数式
この「歴史のバグ」を考慮に入れた上で、各年の日数を計算する数式を組み立てましょう。
I1セルに「日数」と入力し、I2セルに以下の数式を入力して、下までコピーします。
=IFS(H2=1900,366,MOD(H2,400)=0,366,MOD(H2,100)=0,365,MOD(H2,4)=0,366,TRUE,365)
このIFS関数は、上から順に条件を判定していきます。
・H2=1900,366
: まず最初に「もし1900年なら、366日とする」という特別ルールを設けて、歴史のバグに対応します。
・MOD(H2,400)=0,366
: 400で割り切れるなら366日。
・MOD(H2,100)=0,365
: 100で割り切れるなら365日。(これで2100年が正しく平年になります)
・MOD(H2,4)=0,366
: 4で割り切れるなら366日。
・TRUE,365
: それ以外はすべて365日。
これで、Excelのルールに則った、完璧な各年の日数リストが完成しました。

各年の「開始シリアル値」を計算する
ゴールはもうすぐです!各年の1月1日(その年の始まり)が、シリアル値でいくつになるのかを計算しましょう。
J1セルに「年開始」と入力します。
まず、基準となる1900年1月1日は、シリアル値「1」です。
J2セルに手入力で「1
」と入れましょう。

1901年の始まりは、1900年の始まり(1)に、1900年の日数(366)を足せば計算できますね。つまり、累計です。
J3セルに以下の数式を入力し、下までコピーします。
=SUM(I2:J2)
この数式は、上のセル(J2)と、その左隣のセル(I2)を合計します。

これを下にコピーしていくことで、前の年の開始シリアル値に、その年の日数がどんどん足されていき、各年の開始シリアル値が計算できます。

どうです?これで私たちの手元には、「この年からこの年までは、このシリアル値から始まる」という情報が詰まった、最強の参照表が完成しました!
ステップ3:必殺技の準備 – 範囲に名前をつける
数式を組む前に、一つだけ、実務でも非常に役立つ「準備」をしましょう。
それは、セル範囲に分かりやすい「名前」をつけることです。
これにより、数式がまるで日本語のように読めるようになり、間違いも減ります。
Web版Excelでは、上部のリボンから「数式」タブ → 「ネームマネージャー」を選択します。

表示された画面で「+ 新規」をクリックし、以下の2つの名前を定義してください。

1つ目:
- 名前: 年
- 参照先:
=SAMPLE!$H$2:$H$275
(シート名がSAMPLEの場合)

2つ目:
- 名前: 年開始
- 参照先:
=SAMPLE!$J$2:$J$275
これで準備は万端。いよいよ、YEAR関数に頼らない年の抽出に挑みます!

最終章:いざ、抽出! – 驚くほどシンプルな解決策
さあ、長かった旅もいよいよ終わりです。
私たちの手元には、最強の参照表と、分かりやすい名前があります。
E1セルに「YEAR関数なし」と入力し、E2セルに、次の数式を入力しましょう。
=LOOKUP(C2,年開始,年)
入力したら、下までフィルコピーしてください。

…どうでしょう?驚くほどシンプルだと思いませんか?
これは、古くからExcelに存在する名関数、LOOKUPです。
LOOKUP関数については以下の記事で詳しく解説しています。
この数式は、Excelにこう命令しています。
「C2セルのシリアル値を、“年開始”のリストから探して。そして、見つかった場所に対応する、“年”のリストの値を教えて!」
LOOKUP関数の賢いところは、完全に一致する値がなくても、「検索値以下の、最も大きい値」を見つけてくれる点です。
例えば、シリアル値「400」を探すと、「年開始」リストの中で400以下で最も大きいのは「367」(1901年の始まり)なので、対応する「1901」を返してくれるのです。
最後の審判 – 検証
さて、この結果が本当にD列のYEAR関数と10万件すべて一致しているのか、確かめてみましょう。
どこか空いているセル(例えばA3セル)に、以下の数式を入力してみてください。
=SUM(N(D2:D100001=E2:E100001))
この数式は、D列とE列を比較し、一致していればTRUE(1)、していなければFALSE(0)を返し、その合計を計算します。
結果として「100000」が表示されれば…完全勝利です!

まとめ:複雑な問題こそ、賢い準備でシンプルに
YEAR関数を使わずに年を抽出するという難題に、見事、打ち克つことができました。
そして、その過程で、Excelの日付の正体である「シリアル値」や、歴史的な「1900年うるう年問題」についても知ることができましたね。
今回の最も重要な教訓は、これかもしれません。
複雑な問題に直面したとき、ゴールから逆算して「どんな情報があれば楽になるか?」を考え、参照表や作業列を準備するスキルは、複雑な数式を一行で書くスキルと同じくらい、あるいはそれ以上に重要である。
実務で直面する課題も、まさにこれと同じです。
今回の思考のプロセスが、皆さんのExcelライフをより豊かに、そしてより本質的なものにするための一助となれば、これほど嬉しいことはありません。