ID非公開

2021/9/16 15:25

66回答

EXCELの日付のシリアル値について質問です。 VBAを勉強しようと思い、とあるサイトにたどり着いたのですが、VBAを勉強する前にエクセルの関数の知識をつけようとあったので、そこから勉強しています。

Excel | Visual Basic190閲覧xmlns="http://www.w3.org/2000/svg">25

ベストアンサー

0

ID非公開

質問者2021/9/16 16:21

回答ありがとうございます。 なるほど。2020年は、そもそも2番目のルールで100で割り切れないのでうるう年ということでしょうか。 1番目のルールは理解していましたが、ずっと100で割り切れてAND400でも割れる、のがうるう年だと勘違いしていました。なので100でも400でも割り切れない2020は平年かと・・・。 疑問なのですが、2020年は1番目でうるう年、2番目でうるう年、ですが3番目だと400で割り切れないので平年になりませんか? 2番目3番目のルールはうるう年には例外があるから存在するルールですよね。だとしたら2番めと3番目のルールのどちらかが当てはまればそれはうるう年ということですか? すみません、うるう年の計算についてかなり調べていたんですがいまいち理解できていなかったようです・・・。 そしてつまりは+1した43954が手計算シリアル値ということでよろしいのでしょうか?

ThanksImg質問者からのお礼コメント

皆様たくさん教えてくださり、ありがとうございます。 最後まで質問に答えてくださったGrumpy_the_DwarfさんをBAに選ばせてもらいました。 回答いただいた皆様の内容はすごく勉強になりました。 訳の分からない、変な質問にお付き合いいただき、本当にありがとうございました。 もっと勉強頑張ります・・・!

お礼日時:9/17 9:11

その他の回答(5件)

0

43,829 は 2020/1/1 でなくて 2019/12/31 じゃないのかな? 1/1~1/31→30日 ← これ、普通に 31日じゃない? ^^; 2月は、29日 3月は、31日 4月は、30日 5月は5日までなので 5日 31 + 29 + 31 + 30 + 5 = 126 ← 合ってる? 暗算しちゃったから・・・ 自信ない。 ははは・・・ ^^; 43,829 + 126 = 43,955 ボクの計算上では 2020/5/5 をシリアル値に直すと 43,955 となるのだが・・・ ちなみに、Excelシート上じゃないというか・・・ 1900年を平年とした場合ね。 だから実際の正しいカレンダーだね。 ちなみに Excel が1900年を閏年として処理してんのは、Excelの仕様ですっ! by Microsoft ^^; https://blog.boost-up.net/entry/about-excel-1900-2-29-issue#:~:text=Excel%20%E3%81%A7%E3%81%AF%E3%80%81%E6%97%A5%E4%BB%98%2F%E6%99%82%E5%88%BB%E3%82%92%E5%86%85%E9%83%A8%E3%81%A7%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E5%80%A4%E3%81%A8%E3%81%97%E3%81%A6%E5%87%A6%E7%90%86%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82.%20Excel%20%E3%81%AF%E4%BB%96%E3%81%AE%E8%A1%A8%E8%A8%88%E7%AE%97%E3%82%BD%E3%83%95%E3%83%88%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8B%E6%97%A5%E4%BB%98%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A8%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7%E3%82%92%E4%BF%9D%E3%81%A4%E3%81%9F%E3%82%81%E3%80%811900%20%E5%B9%B4%E3%82%92%E9%96%8F%E5%B9%B4%E3%81%A8%E8%A7%A3%E9%87%88%E3%81%97%E3%80%811900%2F2%2F29%20%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E8%A8%AD%E8%A8%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82.,Excel%20%E3%81%8C%E5%A4%96%E9%83%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BF%E3%82%92%E8%A1%8C%E3%81%86%E9%9A%9B%E3%81%AB%E3%81%AF%E3%80%811900%2F2%2F29%20%E3%81%BE%E3%81%A7%E3%81%AE%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E5%80%A4%E3%81%8C%20Excel%20%E3%81%AE%E5%86%85%E9%83%A8%E5%87%A6%E7%90%86%E3%81%AB%E3%82%88%E3%82%8A%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E4%BF%AE%E6%AD%A3%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82.%20https%3A%2F%2Fsupport.microsoft.com%2Fja-jp%2Fhelp%2F967188. 上のURL 生きてるかなぁ・・・

うろ覚えだが・・・ たしか 0.5 が、12時間なんだよな。 1 が 24時間 で 1日 って扱いだったような気がしたな。 ※Excelのシリアル値 時間も、関係あったりするんだよね。 ネットで検索すりゃ、詳しい人がまとめたサイトいっぱいあっから! てか、こんなことより・・・ VBA がんばれっ! ^^;

0

難しく考えすぎた、というか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 です。

画像

ID非公開

質問者2021/9/16 23:19

回答ありがとうございます。 すみません、わたしにはまだまだ追いつけそうにないくらいレベルの高い内容で全然ついていけなかったのですが、とりあえずもう少しエクセルについてしっかり勉強した方が良さそうですね。。。 ありがとうございます。

0

参考になるか ちょっとした雑学です Excelでは、 1900/02/29という無い日が、存在します そして 1900/01/01~1900/02/28までの 曜日が、間違っています 何故なのかは、わかりませんが Excelに詳しい方は 「シリアル値の計算は、1900/3/1 以降で行う」 暗黙のルールです 知らない場合でも あまり 1900年から計算する人は少ないと思います あなたが、紙で計算して変だと思ったのは 至極 当然の結果です Excelで、「1」は、 yyyy/mm/dd(aaa) で、表示すると 1900/01/01(日)ですが 実際は、月曜日です そして、「60」は 1900/02/29(水)という存在しない日 ですから あなたが、手で、計算するならば 「61」=1900/03/01 以降で行ってください http://www.benri.com/calendar/1900.html

ID非公開

質問者2021/9/16 23:13

回答ありがとうございます。 個人的に1番しっくりきた回答かもしれません。 暗黙のルールも知らなくて申し訳ありません・・・ なるほど、そもそも私の計算の始め方がダメだったんですね。 なんと言うか同じ土俵に立ってない?といいますか・・・ 変だと思ったのは当然。1900/3/1以降で計算しろ、とハッキリおっしゃっていただいてなんだかすっきりしました。 初めに回答してくださった方も、もしかしたらこう言うことを言ってくださってたんでしょうか。 理解力、知識ともに無くって本当に申し訳ありません。 そもそも1900/1/1を基準にして手計算がどうのこうの言ってる時点でダメだったんですね。 暗黙のルール、知れて良かったです。本当にありがとうございます。

0

2020/5/5のシリアル値は43956と出ます。

ID非公開

質問者2021/9/16 16:30

回答ありがとうございます。 私も、エクセルを使用して算出すれば43956と出ます。 が、エクセルは1900年をうるう年扱いしているので、うるう年を本来通り平年としてエクセルを使わずに計算すれば結果は変わりますよね・・・?ということが言いたかったのです。 わかりにくいうえにしょうもない質問で申し訳ないです。

0

エクセルのシート上ではなく純粋にシリアル値に変換するとなると、1900年と2020年はうるう年ではなくなります これは どういうことでしょうか シリアル値は 表示形式を変えるだけで 日付と シリアル値は 入れ替わりで でますが 日付___シリアル値 表示形式 yyyy/m/d__標準 1900/2/9___40 2020/2/9___43870 2020/5/5___43956 です 別に 計算する必要は ありませんが また 期間の日数は =DATEDIF(開始日,終了日,"d")出でます 従って =DATEDIF("1900/1/1","2020/5/5","D") で 43955 です。 期間ですから スタート日の”1900/1/1”1を 引いていますから 2020/5/5の シリアル値は 43956 で あっています。 VBAだとうるう年ではない とは 何のことか わかりません。

ID非公開

質問者2021/9/16 16:28

回答ありがとうございます。 計算する必要が無いのは承知しています・・・が少し気になったので質問させていただきました。 好奇心にお付き合いさせてしまって申し訳ありません・・・。 その=DATEDIFの関数で求めたシリアル値は当然、エクセルで出したシリアル値ですよね? すみません、2020年に関しては私が平年と勘違いしておりましたが、下の方の回答にあるように、エクセルは1900年をうるう年として扱っているのです。 本来なら1900年を平年として計算しないとならないのにエクセルはうるう年として計算しているので、結果が変わってきませんか?という質問です。 わかりにくくて申し訳ないです。