W.I.S. Laboratory
menu-bar

Excel


ExcelのDATE形式とVBAのDATE形式で、同じ値なのに日付が1日ズレる

例えばエクセルのセルに「1900/1/20」と入力し、これをVBAからDate形式で取得してMsgbox命令で表示すると「1900/1/19」と出てくるという厄介な現象がある。
同じシリアル値なのに、VBAだとセル内容に比べて1日前の日付になってしまうのだ。

Sub sample()
 Dim D As Date
 D = Cells(1, 1) ' セルA1には「1900/1/20」と入っている
 Cells(2, 1) = D ' こうすると「1900/1/20」と入る
 MsgBox (D) ' 何故か「1900/1/19」と出る
End Sub

なんでこんなことになるかというと、エクセルのDATE形式は「1900/1/1」をシリアル値1とする連番として扱うのに、VBAのDATE形式は「1899/12/31」をシリアル値1とする連番として扱うからだ。
エクセル側のみ、グレゴリオ暦では存在しないはずの「1900/2/29」が存在し、VBA側で辻褄を合わせるために「1900/2/28」以前の連番が1つずつズレている。
そのため、VBAでは「1900/1/1」がシリアル値2になり、シリアル値1を存在させるために「1899/12/31」がやむを得ず必要となった。
正確にはエクセル側のバグなのだが、VBA側がそれを容認し辻褄を合わせて仕様になり、それ以後互換性のために最新版までずっと引きずられている。

[ 戻る ]
saluteweb