質問: Month(Cells(2, 1)) Then MsgBox ("bug!") Else MsgBox ("normal!") End If End Sub ``` すなわち、month(セルA1)とmonth(セルA2)が等しく12と判定されたことになる(実際debug.printでMonth(Cells(2, 1))の値を確認したとき12と出力された。実際にはcells(2,1)には何ら入力していないにもかかわらずである!) 当該事象は Microsoft Office Professional Plus2016 にて確認している。 --- 本件について、このような仕様があるのかについてご存知の方がいれば教えていただきたいです。
回答: > > 本件について、このような仕様があるのかについてご存知の方がいれば教えていただきたいです。 > > > エクセルで 未入力のセルが 数字の 0 と判断され、仕様 によって 1899/12/30 と解釈されるためです。 以下に 詳しい説明を書きます、興味があれば・・。 昔 Joel Spolsky (ジョエル スポルスキー) さん(Excel ver 5 の時の 設計に携わった人) が 『Microsoft Officeのファイルフォーマットはなぜこんなに複雑なのか?』という ブログ記事に書いていました。今ではその時の記事を見つけることができませんが、 今ではかろうじて その時のコピーを公開している人がいるので そちらを参考にしてみてください。 当時有名だった 表計算のソフト(Lotus 1-2-3) の データをそのまま 取り込むため、バグを承知で日付の計算はロジックは Excel の中に取り込まれました。 エクセルの日付の処理にはいくつかの不思議な特徴があります。 1)日付の基準値を 1904年に変更できる。 「ファイル」メニューの「詳細設定」の「オプション」の中に 「1904年から計算する」 というチェックボックスがあります。 !1904年から計算する このチェックを入れると エクセルの セルに 0 を入力して 書式を日付形式にすると 1904/1/1] と表示されます。 2)Lotus 1-2-3 の 1900 年のうるう年の計算間違いの バグをそのまま 取り込むため 日付の基準値を 1899/12/30 にしている。 基準値が 12月30日 って ちょっと中途半端に見えますよね。 あれ? エクセルの表で 1 を入力して 書式の形式を 日付の形式に変更したら 1900/1/1 になりますね。 基準値が 1899/12/30 という仕様と 整合性が取れていない?? 表計算で 書式を日付型にした場合と VBA で計算を行う場合で int -> 日付 型の変換結果が違います。 ![計算結果 実は 1900/3/1 以降は 同じ値になるのですが、 VBA では 1900 年は うるう年では ないと計算される(Lotus 1-2-3 互換のため) バグのある 1900/2/29 の次の日 1900/3/1 が 61 という値を基準に Date 型の 初期値を うるう年の計算 バグ込みで 実装しています。 そのため 1899/12/30 ~ 1900/3/1 までの日付は使わないようにした方が安全です 雑談のような気もしますが、結構 知らない人が多いようなので・・。