Excel


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



エクセルのセルに「1900/1/20」と入力し、これをVBAでDate形式で取得してMsgbox命令で表示すると「1900/1/19」と出てくる。

Sub sample()
 Dim D As Date
 D = Cells(1, 1)
 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側がそれを容認して仕様になり、それ以後、互換性のために最新版までずっと引きずられている。




[ 戻る ]