2014年12月2日火曜日

Excelだけに存在する日付

こんにちは。近藤です。

今回は、少々懐かしく、そして、まだごくまれに出会うことのあるものです。

「Excelだけに存在する日付」
と聞いて、すぐに「ピン!」と来るかたもいらっしゃると思います。
そうです。「1900/02/29」です。
(実は、もう1つあるのですが、それについては下のほうで簡単に書いてあります)

1900/02/29:

1900/02/29という日付は、もちろん現実には存在しない日付です。
現実には存在しないのですが、Excelに「1900/02/29」を入力してみると、「日付」として認識されることが確認できます(※Excel for Macでは、標準では「1900/02/29」を入力できません。理由は後述しています)。




この「1900/02/29」が日付として認識されており、文字列としては認識されていないことは、セルに表示される位置でもわかりますが、より確実なのは、このセルの表示形式を「日付」から「数値」に変えることです。



 「1900/02/29」は、60という数値に変わりました。
この60という数値は、日付型の内部データです。
日付型は、Excelに限らず、ある特定の日付を「0」または「1」として置き、そこからの経過日数で表しています。Excelでは、「1900/01/01」を1日目としているので、「1900/02/29」は60日目、ということになります(存在しませんけどね)。

では、なぜExcelに「1900/02/29」という、実際には存在しない日付が用意されているのでしょうか?
これは、Windows OSが普及する前に大きなシェアを持っていた、Lotus1-2-3との互換性を取ったためです。(きっと、Lotus1-2-3をご存じないかたもいらっしゃいますよね…と書いている私も、実物に触れる機会はありませんでした。製品末期に、黄色い廉価ソフトメーカーから販売されていたのは店頭で見ているのですが。)
この「1900/02/29」、「Lotus1-2-3のバグ」と言われることもありますが、実際はLotus1-2-3が全盛期だった当時のハードウェアのスペックから、「閏年は4年に1度」だけを処理するように割り切っていた、ということのようです。だとすると、Lotus1-2-3では2100年も02/29が存在したのだろうか、という疑問が湧くのですが、実物がないので確認できず…ちなみに、Excelは「1900/02/29」以外はグレゴリオ暦に従っています。

設定で回避:

これを回避する方法を、Microsoftが案内しています。
それは、「1904年から計算する」というオプションです。
このオプションのデフォルト値は、

  • Windows版のExcel:オフ
  • Excel for Mac:オン
  • Excel Online:オフ固定(オプション無し)

となっています。

Windows版のExcelで設定するには、
[ファイル]-[オプション]-[詳細設定]-[次のブックを計算するとき]

[1904年から計算する]チェックボックス
をチェックします。



このチェックは、上記画面のとおり、ブック単位(=ファイル単位)に行います。
(以下、わかりやすいように「1904年から計算する」オプションが有効な状態を「1904年から計算する」設定、無効な状態を「1900年から計算する」設定、と記述します)

注意点:

この設定、
「1900/01/01を1日目としていたものを、1904/01/01を0日目とするように変更」
という変更なので、
「1904/01/01以前の日付は扱えない」
のです。
確かに「1900/02/29」は扱えなくなりましたが…解決したと言って良いものかどうか?
そして、内部数値「1」が表す日付が
「1900年から計算する」設定…1900/01/01
「1904年から計算する」設定…1904/01/02
と変更されたために、

  • 設定が異なるブック間でコピー&ペーストを行うと、日付が変わります。



  • 既にデータが入力されているExcelブックの設定を変更すると、日付が変わります。


  • リンクセルの場合も、リンク元とリンク先の設定が異なると、日付が変わります。 

日付のズレを解決するには、手動で対応(値から1462を加減算)するようにMicrosoftから技術文書が出ています( http://support.microsoft.com/kb/214330/ja )。
ちょっと手間ですね…

この設定にチェックを入れると:

[1904年から計算する]設定のときは、1904年以降の日付が扱えるようになるほか、時刻の計算で結果がマイナスになっても表示されるようになります。


おまけ:

「1900年から計算する」設定で数値「0」を日付に変換すると…


これまた困った日付に…
日付を使わずに、時間だけで計算しようとしたとき、この日付を見かけたかたもいらっしゃるかもしれませんね。
「1904年から計算する」設定では、数値「0」を日付に変換すると、上に書いたとおり


1904/01/01となります。

おまけその2:

データベースによっては、「特定の日付」より前の日付をマイナス数値で表すものもあるのですが、Excelは
「1900年から計算する」設定:「###~###」(扱えない値、の意)
「1904年から計算する」設定:絶対値が表す日付に「-」が付く
(例:1…1904/01/02、-1…-1904/01/02)
と処理されます。「1904年から計算する」設定ときの動作は、先に記載した日付の計算がマイナスになったときも表示できるようになったことの副作用だと思いますが、マイナスの西暦って何でしょうね?

おまけその3:

前回参照していた、Office Open XML形式の仕様「ECMA-376 4th edition」( http://www.ecma-international.org/publications/standards/Ecma-376.htm )の定義には、「18.17.4 Dates and Times」に、日付型と時刻型の定義があります。
この記載によると、Office Open XML形式ファイルの仕様上は、(マイナス数値を使って)0001/01/01から扱うことができ、「1900/02/29」は存在しないことになっています(なので、1900/02/28より前の日付において、仕様とExcelの実装には差異があります)。過去の「ECMA-376」では、「1900/02/29」は「古い表計算ソフトとの互換のため」として定義があったと記憶しているので、版が進んだことでその仕様は無くなったようです。
とはいえ、現行のExcelで扱うと、「おまけその2」で記載した動作になるのですけれども。

0 件のコメント:

コメントを投稿