質問: EXCELの日付のシリアル値について質問です。 VBAを勉強しようと思い、とあるサイトにたどり着いたのですが、VBAを勉強する前にエクセルの関数の知識をつけようとあったので、そこから勉強しています。 シリアル値から日付を、逆に日付からシリアル値を、それぞれ求める計算をエクセルを使わないで紙とペンと手計算で求めていたのですが。(手計算で求めることはできるのかと気になったので) エクセルのシート上だと、1900年はうるう年として扱われていて、VBAだとうるう年ではない、となっているんですよね。 例として2020/5/5は、シート上でシリアル値に変換すると、43956となります。 手計算で、2020/5/5が43956になるように無理矢理持っていくと、1900年と2020年をうるう年として扱う形になりました。 エクセルのシート上ではなく純粋にシリアル値に変換するとなると、1900年と2020年はうるう年ではなくなりますので、2020/5/5の手計算シリアル値は43953、、、で合ってますか?? 一応手計算で出したシリアル値の計算過程載せておきます。 1900/1/1と2020/5/5の差を求める。 →年+120/月+4/日+4 ・年 1900年から2020年までの120年の間にうるう年は29回。(1904、1908、1912・・・2008、2012、2016) 平年は120-29=91 91回。 29×366=10614 91×365=33215 10614+33215=143829→2020/1/1のシリアル値が出る。 ・月日 1/1から5/5までは、 1/1~1/31→30日 1/31~2/28→28日 2/28~3/31→31日 3/31~4/30→30日 4/30~5/5→5日 30+28+31+30+5=2124→2020/1/1から2020/5/5まで何日進んだかがでる 上の1と2を合計して、43829+124=43953 どうでしょうか・・・? VBAはまだ勉強し初めで何もわかっていませんし数学の知識も高校で止まっています。 何かそういうIT系?とかを専攻していたわけでもなく、ただの数学好きが気になって求めただけなのでいろいろとおかしいところはあるかもしれませんが、そういうところはわかりやすく解説していただけるとありがたいです。 長々と書いてしまいましたが聞きたかったのはこの(2020/5/5の手計算シリアル値は43953、、、で合ってますか??)部分です。 宜しくお願い致します。
回答: 難しく考えすぎた、というかVBとExcelを同一視したための勘違いですね。 VB(VBAではなく)には日付シリアル値なんて存在しません。これが存在するのはアプリケーションでも日付を数値として扱う表計算ソフトやデータベースソフトだけです。Wordやメモ帳などに日付を入力してもただの文字列です。シリアル値?なんだそれ、の世界です。 本来VBも同じですが、VBAとなりエクセルを支配下に置いたためやれやれ、という感じでシリアル値を扱うことになってしまったのですね。 なので完全にエクセル任せの計算になります。 おジさんの興味深い投稿があったので、この存在しない日付をセルに入れてそのシリアル値を表示するプログラムです。 Sub test() Range("A1") = "1900/2/29" MsgBox Range("A1").Value2 MsgBox CDbl(Range("A1").Value) End Sub 存在しない日付でもシリアル値に関してはエクセル任せなので 1月の31と29を足して60と表示します。 VBAに間違った日付なのに何故シリアル値を表示するの? と訊いても、 それはエクセルに訊いてください、という返事しか返ってこないです。 うちは関係ないよ、ということですね。 ちなみに他のスプレッドシートでは「1900/2/29」では文字列にしかならないです。グーグルスプレッドシートでは 1989/12/30が0 1989/12/31が1 1900/1/1が2 1900/2/28が60 1900/3/1が61 です。