シリアル値について

解決


こうじ  2005-03-26 17:09:08  No: 120486

シリアル値がどうなっているか調べようと思い
MsgBox Format(1, "yyyy:mm:dd")
とすると  1899/12/31  になります.
マニュアルには  1900/1/1になるはずなのにどうしてなんでしょうか?


Say  2005-03-26 18:05:53  No: 120487

おそらく、
1900年1月1日が1になるよう、開発当時の日付から日数を逆算して
日付関連関数を実装したつもりだったが、
そのとき単に、「グレゴリオ暦には1900年2月29日は存在しない」
ことを失念して実装したために1日ずれただけでしょう。


魔界の仮面弁士  2005-03-27 15:41:39  No: 120488

CDate(-1) が 1899年12月29日。
CDate( 0) が 1899年12月30日。
CDate(+1) が 1899年12月31日。

となりますよね。

で、改めてヘルプを見てみると、
http://www.microsoft.com/japan/developer/library/vbenlr98/vadatdate.htm
『負の整数は 1899年12月30日より前の日付を表します』
とありますので、この点はヘルプの記載どおりに思えますけど……。


Say  2005-03-27 17:35:07  No: 120489

>改めてヘルプを見てみると、
字面に反応して回答してしまい、ヘルプ確認してなかった。(^_^;
改めてヘルプを見てみました。

◆ヘルプ付属のサポート技術情報(文書番号: J011319 )には

整数の「 1 」を「 1 日 (24 時間) 」として取り扱います。
そのため「 1 」は、日付を表わす場合「 1900年1 月 1 日」を意味します。
また時間を表わす場合は「 24 時間 (1 日) 」を意味します。

とあり、この時点では#1900/1/1# = 1 のつもりだったようです。

あるいは、「1900年1月 1日」でWeb検索してみると、結構
「1900年1月 1日=1とした」みたいな記述が見つかりますから、
おそらく、この種の資料から「マニュアルには  1900/1/1になるはずなのに」
と判断されたのでしょうがこの技術情報自体かなり古い(1994年頃)ものです。

◆Office2000Developerのヘルプの「バリアント型の詳細」には

日付リテラルに時刻が含まれていない場合、その値の時刻の部分は
午前 0 時 (1 日の始まり) に設定されます。
また、日付が含まれていない場合、その値の日付の部分は、
1899 年の 12 月 30 日に設定されます。

となっています。(つまり、#1899/12/30# = 0 の意)

以上から考察するに
「もともと#1900/1/1# = 1 のつもりで実装し、
実装当時の資料にもそう記載したが、
後に、実際の動作にあわせてヘルプを修正した」
というのが正解ではないでしょうか?

どのような経緯があろうと、また、
常識的に「#1899/12/30# が原点なんて変」だとしても、
実際の動作とヘルプが一致している以上、
ヘルプの記載は正しいことになります。

なんだかな。


魔界の仮面弁士  2005-03-28 19:07:47  No: 120490

> ◆ヘルプ付属のサポート技術情報(文書番号: J011319 )には
やけに旧い文書番号だと思ったら……VB6ヘルプ記載の物でしたか。(^^;
# JPシリーズですら無いし。

相当する現行文書は、こちらですね。

文書番号401700 (Excel 5.0)
『Q&A (日数/時間計算編)』
http://support.microsoft.com/default.aspx?scid=kb;ja;401700

文書番号402779 (Excel 95)
『[XL95] Q&A (日数/時間計算編)』
http://support.microsoft.com/default.aspx?scid=kb;ja;402779

文書番号416574 (Excel 2002)
『[XL2002] 日数および時間計算に関するワークシート関数について』
http://support.microsoft.com/default.aspx?scid=kb;ja;416574

文書番号882391 (Excel 2004)
『日数および日付の表示方法と計算方法 - 基本編』
http://support.microsoft.com/default.aspx?scid=kb;ja;882391

> 後に、実際の動作にあわせてヘルプを修正した」
> というのが正解ではないでしょうか?

先の文書にあるのは、「Excelの日付」のシリアル値の話です。
「VB/VBAにおける日付」と一緒に論じるのは、ちょっと乱暴かと。(^_^;)

Excelワークシート関数においては、1.0というシリアル値は、
日付に変換した場合、Windowd版では 1900年1月1日を示し、
Mac版では 1904年1月2日を示す仕様になっています。
(Date1904プロパティで、1900年換算か1904年換算かを変更可能)

一方 VB/VBAのDate型(というか、OLE オートメーションの日付値)は、
1899年12月30日からの日数として実装されていて、
1.0というシリアル値が、1899年12月31日を示し、
2.0が、1900年1月1日となるように実装されています。

ちなみに、ExcelのDate1904モードで、「0」が1904年1月1日を
示すのは、初期の Mac で、1904年以前の日付がサポートされて
いなかった事に由来しています。
一方、DOS版の Lotus 1-2-3 という表計算ソフトなどは、
1900 年から計算する日付システムになっていましたね。

なお、VB.NETのDate型(というか、.NETのSystem.DateTime構造体)は、
西暦1年1月1日からの日数として換算さるようになっており、
FromOADate/ToOADateメソッドで、OLEオートメーションの日付値との
相互変換が可能となっています。蛇足までに。


こうじ  2005-03-29 03:20:04  No: 120491

多数のご返事ありがとうございました.
返事おくれましたすみません.
大変参考になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加