muu’s diary

muuが気まぐれに書き散らす日記のようなもの。

Excelで今週の月曜日が何日か表示したかった話

結論から言うと

=rounddown((today()-date(1900,3,5))/7,0)*7+date(1900,3,5)

っぽいです。

=rounddown((today()-datevalue("1900/3/5"))/7,0)*7+datevalue("1900/3/5")

でもいけます。

ごきげんよう。久しぶりの更新です。
なにかとやる気がでなくて1ヶ月ほど冬眠していました。

バイト先で、一週間の清掃表があるんですよ。
月曜(00月00日)~日曜(00月00日)みたいな感じのやつ。
これがプリントアウトする度に日付けを書き換えなきゃいけなくって面倒だったんです。私はサボってるけど。

それで、どうせその日の日付を表示する関数があるんだから関数で自動化出来るだろうって思ったんですよね。

つまりはx日が月曜日ならその7日後がまた月曜日じゃないですか、何故か知らんけど奴ら毎週やって来るので。
なので
月曜日+7y=月曜日(y=経過した週間数)
経過した週間数y=経過した日数÷7(小数点以下切り捨て)
経過した日数=今日の日付-月曜日の日付
ってことでExcelさんにきいてみたら

=rounddown((today()-date(1900,1,1))/7,0)*7+date(1900,1,1)

ってなりました。

これ作る時、バイト先のkingsoftスプレッドシートでつくって帰りにスマホGoogleスプレッドシートで検証したんですよ。

=rounddown((today()-2)/7,0)*7+2 

って作ったんですが何故か計算あわなくなって、「はぁ?」って思ってたんです。
そしたらExcelGoogleスプレッドシートで日付の初期値違うんですよ、
Excelは1900/01/01がシリアル値1
Googleは1899/12/31がシリアル値1なんです。
意味わからなくないですか?

仕方ないんで「1900年1月1日」ってやろうとしたらerror.error.error。
調べてみたら
date関数だとdate(xxxx,yy,zz)
datevalue関数だとdatevalue("xxxx/yy/zz")
って形式にするみたいでExcel公式のリファレンス見なきゃわかりませんでした。Googleスプレッドシートで作業してたのに。
そんなこんなで出来たのが冒頭の式です。

https://support.office.com/ja-jp/article/%e6%95%b0%e5%bc%8f%e3%81%a8%e9%96%a2%e6%95%b0-294d9486-b332-48ed-b489-abe7d0f9eda9

とりあえずlink貼っておきます。

今回もお読みいただきありがとうございます。

3/22追記
表示崩れを修正しました
3/24追記
式で参照する月曜日の日付を1900/1/1から1900/3/5へ変更しました
kingsoftスプレッドシートでは1900/2/29が実装されており元の式だと計算結果が1日前へずれるためです