Related Posts Plugin for WordPress, Blogger...

1900年に何があったのか

「時間計算でマイナス結果が出る際、マイナス表示にならない」


というヘルプを受けまして。


結論から言ってしまうと、「オプションで1904年からの計算を有効にする」事により解決(=マイナス表示される)します。完全な正確性を求めるのであればまだ入力前のクリーンな状態でブックにこのオプションを適用する事です。


あとは余談です。


どうしてそういう仕組みになっているのかというと、説明すると物凄く細かくなりそうなのですが、まずEXCELでの時間表示については、時刻表示のみであっても、必ず日付が結び付けられているわけですね。とすると、時間を計算する際にバックグラウンドで日付計算もされているわけです。時刻のみセルに入力した際、たとえば08時10分としますと書式の違いにもよりますが、

08:00:00

と表示されます。

しかしながらこれには非表示の部分があり、

1900/01/01 08:00:00
1900/1/0 08:00:00

という日付要素が付加されているのが実際です。書式設定で日付と時刻を表示する設定がありますので、任意で表示も可能です。



通常、A1を18:00とし、B1を19:00として、C1にA1-B1の数式を書くと、結果のセルは"#"で表示されますよね。

この#表示への対応はABS関数を用います。

=ABS(A1-B1)

これで#が消えて絶対値が求められますが、マイナス表示にはなりません。



日付の計算については、日付を「1900年1月1日」から起算したシリアル値(=経過日数)で計算します。

1900年1月1日は「1」
1900年1月10日は「10」

1900年1月10日から1900年1月1日の期間に何日の日数があったのかを計算する際、EXCELは日付をこのシリアル値で計算する為、10-1=9と弾きだします。1900年1月1日基点の経過日数ですので、その年月日固有の値です。



この1900年という年、グレゴリオ暦のきまりで「うるう年ではない」平年でした。

西暦年が、4で割り切れる年は閏年
西暦年が、4で割り切れる年のうち、100で割り切れる年は平年
西暦年が、100で割り切れる年のうち、400で割り切れる年は閏年

グレゴリオ暦というのは、1年が365.25635日である誤差を修正する為のユリウス暦改良版です。この「100で割り切れるのに400で割り切れない場合は平年」というきまりに則り、1900年は平年となりました。その後100余年のうるう年とは違い、-1日のずれが生じます。

これが何を意味しているのかというと、「経過日数」で日付管理を行っているEXCELでは、デフォルトの1900年設定で計算をする場合、後述するバグ仕様により、マイナス結果が出る場合は先ほどの様にエラーとなり表示ができなくなります。実際の暦と仕様の整合性が取れていない為です。

1900年〜1903年の期間の日付を実際にEXCELで扱う方は余りいらっしゃらないかもしれませんが、実際に数式を組んで仮に1900年から2000年までの日数計算をする場合、何も手を加えないと正しい値が得られません。デフォルトの1900年設定では、ありえないはずのうるう年が設定されているからです。シリアル値(経過日数)では1900年12月31日は”365”のはずですが、仕様により"366"とされています。


シリアル値って何?って思われる方は、セルで日付を8/1と入力した後、書式設定でそのセルを「標準」に変更してみてください。1900年1月1日からの経過日数であるシリアル値が表示されます。が、これは現実には1日多い値です。この数字をもとにEXCELは日付管理を行っています。


そして、製品として発売されたofficeですが、MAC版では1904年がデフォルトなのに、win版では1900年がデフォルト。勿論1904年デフォルトであれば、先の「4年に1度366日」ルールが容易に適用できます。


何故win版では何故バグを実装してまで無理をしているのか。


その理由は、かつてMS-DOS機(win98,95のベース、昔のマイクロソフトのOSです)で圧倒的シェアを誇っていた表計算ソフトである、IBM「Lotus1-2-3」、この存在でした。


「1-2-3だけあれば他のソフトは要らない」


その昔にマイクロソフトは「MultiPlan」という表計算ソフトで米国市場においてLotus1-2-3に敗北を喫しており、この圧倒的シェアに立ち向かうために、Lotus1-2-3で作成したドキュメントを忠実に再現する互換性の搭載が必要でした。この為「Lotus1-2-3で作成したドキュメントを忠実に再現する」アプリケーションを開発するにあたって、Lotusが採用していた1900年計算方式がEXCELにも採用されます。

1-2-3の開発においては、うるう年は単純に「4年に1度」と認識され、前述の「例外」について考慮されないままに設計されていました。1-2-3ドキュメントをEXCELで再現する機能を実装するにあたり、EXCELにこのバグさえも継承しなければならなかったというワケです。

この後、Lotus1-2-3はwindowsとの互換性に遅れをとり、またIBMグループウェアであるLotusNotesへ主力移行を行った事もあり、ロータススーパーオフィスといったスイートを発売するも及ばず、マイクロソフトオフィスにその座を明け渡す事になりましたが、EXCELはこうした経緯で1900年計算方式を抱えて走り出してしまった為か、今でもこれが踏襲されています。


テキストで説明すると大変ですね。

今日は早めに帰ります。