シリアル値がどうなっているか調べようと思い
MsgBox Format(1, "yyyy:mm:dd")
とすると 1899/12/31 になります.
マニュアルには 1900/1/1になるはずなのにどうしてなんでしょうか?
おそらく、
1900年1月1日が1になるよう、開発当時の日付から日数を逆算して
日付関連関数を実装したつもりだったが、
そのとき単に、「グレゴリオ暦には1900年2月29日は存在しない」
ことを失念して実装したために1日ずれただけでしょう。
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日より前の日付を表します』
とありますので、この点はヘルプの記載どおりに思えますけど……。
>改めてヘルプを見てみると、
字面に反応して回答してしまい、ヘルプ確認してなかった。(^_^;
改めてヘルプを見てみました。
◆ヘルプ付属のサポート技術情報(文書番号: 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# が原点なんて変」だとしても、
実際の動作とヘルプが一致している以上、
ヘルプの記載は正しいことになります。
なんだかな。
> ◆ヘルプ付属のサポート技術情報(文書番号: 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オートメーションの日付値との
相互変換が可能となっています。蛇足までに。
多数のご返事ありがとうございました.
返事おくれましたすみません.
大変参考になりました。
ツイート | ![]() |