ソフトウェア

Excelが「1900年はうるう年」として誤って扱う理由とは?


Microsoftの表計算ソフトであるExcelでは、実際にはうるう年ではない1900年がうるう年として扱われています。Microsoftはその理由を過去の表計算ソフトとの互換性にあると説明しており、1991年にExcelチームで働き始めたJoel Spolsky氏も、2006年に自身のブログで当時の事情を記録していました。

Excel incorrectly assumes that the year 1900 is a leap year - Microsoft 365 Apps | Microsoft Learn
https://learn.microsoft.com/en-us/troubleshoot/microsoft-365-apps/excel/wrongly-assumes-1900-is-leap-year


My First BillG Review – Joel on Software
https://www.joelonsoftware.com/2006/06/16/my-first-billg-review/

うるう年は基本的に4年に1度ありますが、西暦が100で割り切れる年はうるう年ではなく、さらに西暦が400で割り切れる年は例外としてうるう年になります。1900年は「100で割り切れて400で割り切れない年」なので、本来うるう年ではありません。たとえば2100年は1900年と同様に「100で割り切れて400で割り切れない年」ですが、ルール通りうるう年として扱われることはありません。


MicrosoftはExcelが1900年を本来とは違ってうるう年として扱っていることを認めています。この背景にはかつて広く使われていた表計算ソフト「Lotus 1-2-3」が1900年をうるう年として扱っていたという事実があり、MicrosoftはLotus 1-2-3との互換性を担保するため、同じシリアル日付方式をExcelの前身であるMultiplanや、Excelでも採用しました。

表計算ソフトでは、日付を連番の数値として管理することがあります。Excelでは1900年1月1日が「1」として扱われ、以後は1日進むごとに数字が1ずつ増える仕組みです。ただし、この日付の数え方には実在しない1900年2月29日も含まれています。そのため、1900年3月1日より前の日付では、日付から曜日を求めるWEEKDAY関数の結果は1日ずれて間違った値になってしまいます。

実際にExcelで1900年のうるう日周辺の日付を入力してみたところ、確かに1900年には実在しない2月29日が存在し、「水曜日」の扱いになっていました。実際には1900年2月28日が水曜日なので、日付データが存在する1900年1月1日から1900年2月28日までの曜日が1つずつずれていることになります。


なぜ今も修正しないのかという理由についてMicrosoftは、「1900年をうるう年として扱う問題を修正すると、現在のExcelワークシートや他の文書にあるほぼすべての日付が1日ずれ、日付を使った数式にも広く影響するから」だと説明しています。

修正するとWEEKDAY関数の結果が変わったり、日付を使う他のプログラムとの互換性が崩れたりする問題が出る一方で、1900年がうるう年として扱われることによって起きる問題は1900年1月1日~1900年3月1日の間の期間に限られるため、表面化する場面はまれです。そのためMicrosoftは「修正しない方が影響は小さい」と説明した上で、1900年をうるう年として扱うのは互換性のための例外であり、1900年以外のうるう年の処理は正しく行われるとしています。


Spolsky氏は2006年6月16日に、自身のブログ記事へ当時の事情を記録しています。Spolsky氏は1991年6月17日にExcelチームで働き始めた後、ExcelとVisual Basicの日付の基準日の違いを調べる中で不自然な点に気づいたとのこと。Excelは1900年1月1日を起点に日付を数えるのに対し、Visual Basicは1899年12月31日を基準日としていました。それにもかかわらず2006年6月16日の日付の値が両方で同じだったため、不思議に感じたそうです。

そこでSpolsky氏が当時の事情を知るExcel開発者に尋ねたところ、「Lotus 1-2-3のワークシートを取り込めるようにするため、そうするしかなかった」と聞いたとのこと。Spolsky氏はこのやり取りを通じて、「1900年2月28日の次に1900年3月1日ではなく、『存在しない1900年2月29日が挟まっている』ことを知った」と記しています。

さらにSpolsky氏は、Lotus 1-2-3を640KBのメモリに収める必要があったため、処理を簡単にする目的で1900年をうるう年として扱った可能性があるとも書いています。ただし、これは当時のExcel開発者から聞いた説明とSpolsky氏自身の推測が混ざる部分であり、Microsoftが公式に説明しているのは、あくまでLotus 1-2-3との互換性を優先したという点です。

この記事のタイトルとURLをコピーする

・関連記事
初代Excelの開発秘話を当時の開発チームメンバーが公開 - GIGAZINE

Excelが遺伝子研究の誤りのもとになっていると研究者が指摘 - GIGAZINE

なぜうるう日は12月ではなく2月に来るのか? - GIGAZINE

ソニーが旧型PS3で発生していた時刻のバグを修正、原因はうるう年の誤認識 - GIGAZINE

in ソフトウェア, Posted by log1b_ok

You can read the machine translated English article Why does Excel incorrectly treat 1900 as….